# Licensed to Elasticsearch B.V. under one or more contributor
# license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright
# ownership. Elasticsearch B.V. licenses this file to you under
# the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# 	http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
---
- name: service
  title: Service
  group: 2
  short: Fields describing the service for or from which the data was collected.
  description: >
    The service fields describe the service for or from which the data was collected.

    These fields help you find and correlate logs for a specific
    service and version.
  footnote: >
    The service fields may be self-nested under service.origin.* and service.target.*
    to describe origin or target services in the context of incoming or outgoing requests,
    respectively.
    However, the fieldsets service.origin.* and service.target.* must not be confused with
    the root service fieldset that is used to describe the actual service under observation.
    The fieldset service.origin.* may only be used in the context of incoming requests or
    events to describe the originating service of the request. The fieldset service.target.*
    may only be used in the context of outgoing requests or events to describe the target
    service of the request.
  reusable:
    top_level: true
    expected:
      - at: service
        as: origin
        beta: Reusing the `service` fields in this location is currently considered beta.
        short_override: Describes the origin service in case of an incoming request or event.
      - at: service
        as: target
        beta: Reusing the `service` fields in this location is currently considered beta.
        short_override: Describes the target service in case of an outgoing request or event.
  type: group
  fields:

    - name: environment
      level: extended
      type: keyword
      short: Environment of the service.
      beta: This field is beta and subject to change.
      description: >
        Identifies the environment where the service is running.

        If the same service runs in different environments
        (production, staging, QA, development, etc.), the environment
        can identify other instances of the same service. Can also
        group services and applications from the same environment.

      example: production

    - name: id
      level: core
      type: keyword
      short: Unique identifier of the running service.
      description: >
        Unique identifier of the running service. If the service is comprised of
        many nodes, the `service.id` should be the same for all nodes.

        This id should uniquely identify the service. This makes it possible
        to correlate logs and metrics for one specific service, no matter which
        particular node emitted the event.

        Note that if you need to see the events from one specific host of the
        service, you should filter on that `host.name` or `host.id` instead.

      example: d37e5ebfe0ae6c4972dbe9f0174a1637bb8247f6

    - name: name
      level: core
      type: keyword
      example: "elasticsearch-metrics"
      short: Name of the service.
      description: >
        Name of the service data is collected from.

        The name of the service is normally user given. This allows for
        distributed services that run on multiple hosts to correlate the
        related instances based on the name.

        In the case of Elasticsearch the `service.name` could contain the cluster
        name. For Beats the `service.name` is by default a copy of the `service.type`
        field if no name is specified.

    - name: node.name
      level: extended
      type: keyword
      example: "instance-0000000016"
      short: Name of the service node.
      description: >
        Name of a service node.

        This allows for two nodes of the same service running on the same
        host to be differentiated. Therefore, `service.node.name` should
        typically be unique across nodes of a given service.

        In the case of Elasticsearch, the `service.node.name` could contain
        the unique node name within the Elasticsearch cluster.
        In cases where the service doesn't have the concept of a node name,
        the host name or container name can be used to distinguish running
        instances that make up this service. If those do not provide uniqueness
        (e.g. multiple instances of the service running on the same host) - the
        node name can be manually set.

    - name: node.role
      level: extended
      type: keyword
      example: "background_tasks"
      short: Deprecated role (singular) of the service node.
      description: >
        Deprecated for removal in next major version release. This field will be superseded by
        `node.roles`.

        Role of a service node.

        This allows for distinction between different running roles of the same service.

        In the case of Kibana, the `service.node.role` could be `ui` or `background_tasks`.

        In the case of Elasticsearch, the `service.node.role` could be `master` or `data`.

        Other services could use this to distinguish between a `web` and `worker` role running as part of the service.

    - name: node.roles
      level: extended
      type: keyword
      example: "[\"ui\", \"background_tasks\"]"
      normalize:
        - array
      short: Roles of the service node.
      description: >
        Roles of a service node.

        This allows for distinction between different running roles of the same service.

        In the case of Kibana, the `service.node.role` could be `ui` or `background_tasks` or both.

        In the case of Elasticsearch, the `service.node.role` could be `master` or `data` or both.

        Other services could use this to distinguish between a `web` and `worker` role running as part of the service.

    - name: type
      level: core
      type: keyword
      example: "elasticsearch"
      short: The type of the service.
      description: >
        The type of the service data is collected from.

        The type can be used to group and correlate logs and metrics from one
        service type.

        Example: If logs or metrics are collected from Elasticsearch, `service.type` would be
        `elasticsearch`.

    - name: state
      level: core
      type: keyword
      description: >
        Current state of the service.

    - name: version
      level: core
      type: keyword
      example: "3.2.4"
      short: Version of the service.
      description: >
        Version of the service the data was collected from.

        This allows to look at a data set only for a specific version of a
        service.

    - name: ephemeral_id
      level: extended
      type: keyword
      short: Ephemeral identifier of this service.
      description: >
        Ephemeral identifier of this service (if one exists).

        This id normally changes across restarts, but `service.id` does not.
      example: 8a4f500f

    - name: address
      level: extended
      type: keyword
      short: Address of this service.
      description: >
        Address where data about this service was collected from.

        This should be a URI, network address (ipv4:port or [ipv6]:port) or a resource path (sockets).
      example: 172.26.0.2:5432
