diff --git a/Makefile b/Makefile index fcffa1e4a3..723e950f89 100644 --- a/Makefile +++ b/Makefile @@ -7,6 +7,7 @@ export GO111MODULE=on GOOSBUILD=./build/$(shell go env GOOS) APPROVALS=$(GOOSBUILD)/approvals +GENPACKAGE=$(GOOSBUILD)/genpackage GOIMPORTS=$(GOOSBUILD)/goimports GOLICENSER=$(GOOSBUILD)/go-licenser GOLINT=$(GOOSBUILD)/golint @@ -75,6 +76,10 @@ check-approvals: $(APPROVALS) check: $(MAGE) check-headers @$(MAGE) check +.PHONY: gen-package +gen-package: $(GENPACKAGE) + @$(GENPACKAGE) + .PHONY: bench bench: @go test -benchmem -run=XXX -benchtime=100ms -bench='.*' ./... @@ -105,7 +110,7 @@ docker-compose.override.yml: # Rules for updating config files, fields.yml, etc. ############################################################################## -update: fields go-generate add-headers copy-docs notice $(MAGE) +update: fields go-generate add-headers copy-docs gen-package notice $(MAGE) @$(MAGE) update fields_sources=\ @@ -247,6 +252,11 @@ $(MAGE): magefile.go $(BIN_MAGE) $(STATICCHECK): go.mod go build -o $@ honnef.co/go/tools/cmd/staticcheck +.PHONY: $(GENPACKAGE) +$(GENPACKAGE): + @go build -o $@ github.com/elastic/apm-server/apmpackage/cmd/gen-package + + $(GOLINT): go.mod go build -o $@ golang.org/x/lint/golint diff --git a/NOTICE.txt b/NOTICE.txt index f69c95a237..cf40fb4255 100644 --- a/NOTICE.txt +++ b/NOTICE.txt @@ -976,7 +976,8 @@ License type (autodetected): Apache-2.0 -------------------------------------------------------------------- Dependency: github.com/elastic/go-ucfg -Version: v0.8.3 +Version: v0.8.4 +Revision: 1232bd4774a6 License type (autodetected): Apache-2.0 -------------------------------------------------------------------- diff --git a/README.md b/README.md index 7fe8d94801..d6203c63a3 100644 --- a/README.md +++ b/README.md @@ -75,6 +75,21 @@ To generate required configuration files and templates run: make update ``` +### Generate package + +APM-Server includes a script to generate an integration package to run with Fleet. +To Generate a package run: + +``` +make fields gen-package +``` + +That command takes the existing `fields.yml` files and split them into `ecs.yml` and `fields.yml` files for each data stream type. +It also generates a `README.md` with a field reference that will be shown in the integration package. + +After generating a package, `apmpackage/apm` should be manually copied to `elastic/integrations`. +Then follow instructions in https://github.com/elastic/integrations/blob/master/CONTRIBUTING.md. + ### Cleanup To clean APM Server source code, run the following commands: diff --git a/apmpackage/apm/0.1.0/agent/input/template.yml.hbs b/apmpackage/apm/0.1.0/agent/input/template.yml.hbs new file mode 100644 index 0000000000..fa5083b93a --- /dev/null +++ b/apmpackage/apm/0.1.0/agent/input/template.yml.hbs @@ -0,0 +1,2 @@ +apm-server: + rum.enabled: {{enable_rum}} diff --git a/apmpackage/apm/0.1.0/data_stream/logs/fields/base-fields.yml b/apmpackage/apm/0.1.0/data_stream/logs/fields/base-fields.yml new file mode 100644 index 0000000000..bef973826b --- /dev/null +++ b/apmpackage/apm/0.1.0/data_stream/logs/fields/base-fields.yml @@ -0,0 +1,12 @@ +- name: '@timestamp' + type: date + description: Event timestamp. +- name: data_stream.type + type: constant_keyword + description: Data stream type. +- name: data_stream.dataset + type: constant_keyword + description: Data stream dataset. +- name: data_stream.namespace + type: constant_keyword + description: Data stream namespace. diff --git a/apmpackage/apm/0.1.0/data_stream/logs/fields/ecs.yml b/apmpackage/apm/0.1.0/data_stream/logs/fields/ecs.yml new file mode 100644 index 0000000000..273f1c5271 --- /dev/null +++ b/apmpackage/apm/0.1.0/data_stream/logs/fields/ecs.yml @@ -0,0 +1,380 @@ +- name: url + type: group + description: | + A complete Url, with scheme, host and path. + fields: + - name: scheme + type: keyword + description: | + The protocol of the request, e.g. "https:". + - name: full + type: keyword + description: | + The full, possibly agent-assembled URL of the request, e.g https://example.com:443/search?q=elasticsearch#top. + - name: domain + type: keyword + description: | + The hostname of the request, e.g. "example.com". + - name: port + type: long + description: | + The port of the request, e.g. 443. + - name: path + type: keyword + description: | + The path of the request, e.g. "/search". + - name: query + type: keyword + description: | + The query string of the request, e.g. "q=elasticsearch". + - name: fragment + type: keyword + description: | + A fragment specifying a location in a web page , e.g. "top". +- name: http + type: group + fields: + - name: version + type: keyword + description: | + The http version of the request leading to this event. + - name: request + type: group + fields: + - name: method + type: keyword + description: | + The http method of the request leading to this event. + - name: referrer + type: keyword + description: Referrer for this HTTP request. + ignore_above: 1024 + - name: response + type: group + fields: + - name: status_code + type: long + description: | + The status code of the HTTP response. +- name: labels + type: object + description: | + A flat mapping of user-defined labels with string, boolean or number values. +- name: service + type: group + description: | + Service fields. + fields: + - name: name + type: keyword + description: | + Immutable name of the service emitting this event. + - name: version + type: keyword + description: | + Version of the service emitting this event. + - name: node + type: group + fields: + - name: name + type: keyword + description: | + Unique meaningful name of the service node. +- name: transaction + type: group + fields: + - name: id + type: keyword + description: | + The transaction ID. +- name: trace + type: group + fields: + - name: id + type: keyword + description: | + The ID of the trace to which the event belongs to. +- name: agent + type: group + fields: + - name: name + type: keyword + description: | + Name of the agent used. + - name: version + type: keyword + description: | + Version of the agent used. + - name: ephemeral_id + type: keyword + description: | + The Ephemeral ID identifies a running process. +- name: container + title: Container + type: group + description: | + Container fields are used for meta information about the specific container that is the source of information. These fields help correlate data based containers from any runtime. + fields: + - name: id + type: keyword + description: | + Unique container id. +- name: host + type: group + description: | + Optional host fields. + fields: + - name: architecture + type: keyword + description: | + The architecture of the host the event was recorded on. + - name: hostname + type: keyword + description: | + The hostname of the host the event was recorded on. + - name: name + type: keyword + description: | + Name of the host the event was recorded on. It can contain same information as host.hostname or a name specified by the user. + - name: ip + type: ip + description: | + IP of the host that records the event. + - name: os + title: Operating System + group: 2 + type: group + description: | + The OS fields contain information about the operating system. + fields: + - name: platform + type: keyword + description: | + The platform of the host the event was recorded on. +- name: process + type: group + description: | + Information pertaining to the running process where the data was collected + fields: + - name: args + level: extended + type: keyword + description: | + Process arguments. May be filtered to protect sensitive information. + - name: pid + type: long + description: | + Numeric process ID of the service process. + - name: ppid + type: long + description: | + Numeric ID of the service's parent process. + - name: title + type: keyword + description: | + Service process title. +- name: observer + type: group + fields: + - name: hostname + type: keyword + description: | + Hostname of the APM Server. + - name: version + type: keyword + description: | + APM Server version. + - name: type + type: keyword + description: | + The type will be set to `apm-server`. +- name: user + type: group + fields: + - name: name + type: keyword + description: | + The username of the logged in user. + - name: id + type: keyword + description: | + Identifier of the logged in user. + - name: email + type: keyword + description: | + Email of the logged in user. +- name: client + type: group + fields: + - name: ip + type: ip + description: | + IP address of the client of a recorded event. This is typically obtained from a request's X-Forwarded-For or the X-Real-IP header or falls back to a given configuration for remote address. +- name: source + type: group + fields: + - name: ip + type: ip + description: | + IP address of the source of a recorded event. This is typically obtained from a request's X-Forwarded-For or the X-Real-IP header or falls back to a given configuration for remote address. +- name: destination + title: Destination + group: 2 + type: group + description: |- + Destination fields describe details about the destination of a packet/event. + Destination fields are usually populated in conjunction with source fields. + fields: + - name: address + level: extended + type: keyword + description: Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. Then it should be duplicated to `.ip` or `.domain`, depending on which one it is. + ignore_above: 1024 + - name: ip + level: core + type: ip + description: IP addess of the destination. Can be one of multiple IPv4 or IPv6 addresses. + - name: port + level: core + type: long + format: string + description: Port of the destination. +- name: user_agent + title: User agent + type: group + description: | + The user_agent fields normally come from a browser request. They often show up in web service logs coming from the parsed user agent string. + fields: + - name: original + type: keyword + description: | + Unparsed version of the user_agent. + multi_fields: + - name: text + type: text + - name: name + type: keyword + description: | + Name of the user agent. + - name: version + type: keyword + description: | + Version of the user agent. + - name: device + title: Device + type: group + description: | + Information concerning the device. + fields: + - name: name + type: keyword + description: | + Name of the device. + - name: os + title: Operating System + type: group + description: | + The OS fields contain information about the operating system. + fields: + - name: platform + type: keyword + description: | + Operating system platform (such centos, ubuntu, windows). + - name: name + type: keyword + description: | + Operating system name, without the version. + - name: full + type: keyword + description: | + Operating system name, including the version or code name. + - name: family + type: keyword + description: | + OS family (such as redhat, debian, freebsd, windows). + - name: version + type: keyword + description: | + Operating system version as a raw string. + - name: kernel + type: keyword + description: | + Operating system kernel version as a raw string. +- name: cloud + title: Cloud + group: 2 + type: group + description: | + Cloud metadata reported by agents + fields: + - name: account + type: group + fields: + - name: id + level: extended + type: keyword + description: Cloud account ID + ignore_above: 1024 + - name: name + level: extended + type: keyword + description: Cloud account name + ignore_above: 1024 + - name: availability_zone + level: extended + type: keyword + description: Cloud availability zone name + ignore_above: 1024 + - name: instance + type: group + fields: + - name: id + level: extended + type: keyword + description: Cloud instance/machine ID + ignore_above: 1024 + - name: name + level: extended + type: keyword + description: Cloud instance/machine name + ignore_above: 1024 + - name: machine + type: group + fields: + - name: type + level: extended + type: keyword + description: Cloud instance/machine type + ignore_above: 1024 + - name: project + type: group + fields: + - name: id + level: extended + type: keyword + description: Cloud project ID + ignore_above: 1024 + - name: name + level: extended + type: keyword + description: Cloud project name + ignore_above: 1024 + - name: provider + level: extended + type: keyword + description: Cloud provider name + ignore_above: 1024 + - name: region + level: extended + type: keyword + description: Cloud region name + ignore_above: 1024 +- name: error + type: group + description: | + Data captured by an agent representing an event occurring in a monitored service. + fields: + - name: id + type: keyword + description: | + The ID of the error. diff --git a/apmpackage/apm/0.1.0/data_stream/logs/fields/fields.yml b/apmpackage/apm/0.1.0/data_stream/logs/fields/fields.yml new file mode 100644 index 0000000000..46f7333d35 --- /dev/null +++ b/apmpackage/apm/0.1.0/data_stream/logs/fields/fields.yml @@ -0,0 +1,221 @@ +- name: processor.name + type: keyword + description: Processor name. +- name: processor.event + type: keyword + description: Processor event. +- name: timestamp + type: group + fields: + - name: us + type: long + description: | + Timestamp of the event in microseconds since Unix epoch. +- name: http + type: group + fields: + - name: request + type: group + fields: + - name: headers + type: object + description: | + The canonical headers of the monitored HTTP request. + - name: response + type: group + fields: + - name: finished + type: boolean + description: | + Used by the Node agent to indicate when in the response life cycle an error has occurred. + - name: headers + type: object + description: | + The canonical headers of the monitored HTTP response. +- name: service + type: group + description: | + Service fields. + fields: + - name: environment + type: keyword + description: | + Service environment. + - name: language + type: group + fields: + - name: name + type: keyword + description: | + Name of the programming language used. + - name: version + type: keyword + description: | + Version of the programming language used. + - name: runtime + type: group + fields: + - name: name + type: keyword + description: | + Name of the runtime used. + - name: version + type: keyword + description: | + Version of the runtime used. + - name: framework + type: group + fields: + - name: name + type: keyword + description: | + Name of the framework used. + - name: version + type: keyword + description: | + Version of the framework used. +- name: transaction + type: group + fields: + - name: sampled + type: boolean + description: | + Transactions that are 'sampled' will include all available information. Transactions that are not sampled will not have spans or context. + - name: type + type: keyword + description: | + Keyword of specific relevance in the service's domain (eg. 'request', 'backgroundjob', etc) + - name: name + type: keyword + description: | + Generic designation of a transaction in the scope of a single service (eg. 'GET /users/:id'). + multi_fields: + - name: text + type: text + - name: duration + type: group + fields: + - name: count + type: long + - name: sum + type: group + fields: + - name: us + type: long + - name: self_time + type: group + description: | + Portion of the transaction's duration where no direct child was running + fields: + - name: count + type: long + - name: sum + type: group + fields: + - name: us + type: long + - name: breakdown + type: group + description: | + Counter for collected breakdowns for the transaction + fields: + - name: count + type: long +- name: parent + type: group + fields: + - name: id + type: keyword + description: | + The ID of the parent event. +- name: kubernetes + title: Kubernetes + type: group + description: | + Kubernetes metadata reported by agents + fields: + - name: namespace + type: keyword + description: | + Kubernetes namespace + - name: node + type: group + fields: + - name: name + type: keyword + description: | + Kubernetes node name + - name: pod + type: group + fields: + - name: name + type: keyword + description: | + Kubernetes pod name + - name: uid + type: keyword + description: | + Kubernetes Pod UID +- name: observer + type: group + fields: + - name: listening + type: keyword + description: | + Address the server is listening on. + - name: version_major + type: byte + description: | + Major version number of the observer +- name: experimental + type: object + description: Additional experimental data sent by the agents. +- name: error + type: group + description: | + Data captured by an agent representing an event occurring in a monitored service. + fields: + - name: culprit + type: keyword + description: Function call which was the primary perpetrator of this event. + - name: grouping_key + type: keyword + description: | + GroupingKey of the logged error for use in grouping. + - name: exception + type: group + description: | + Information about the originally thrown error. + fields: + - name: code + type: keyword + description: The error code set when the error happened, e.g. database error code. + - name: message + type: text + description: The original error message. + - name: module + type: keyword + description: The module namespace of the original error. + - name: type + type: keyword + - name: handled + type: boolean + description: Indicator whether the error was caught somewhere in the code or not. + - name: log + type: group + description: | + Additional information added by logging the error. + fields: + - name: level + type: keyword + description: The severity of the record. + - name: logger_name + type: keyword + description: The name of the logger instance used. + - name: message + type: text + description: The additionally logged error message. + - name: param_message + type: keyword + description: | + A parametrized message. E.g. 'Could not connect to %s'. The property message is still required, and should be equal to the param_message, but with placeholders replaced. In some situations the param_message is used to group errors together. diff --git a/apmpackage/apm/0.1.0/data_stream/logs/manifest.yml b/apmpackage/apm/0.1.0/data_stream/logs/manifest.yml new file mode 100644 index 0000000000..cef82f3837 --- /dev/null +++ b/apmpackage/apm/0.1.0/data_stream/logs/manifest.yml @@ -0,0 +1,2 @@ +title: APM logs and errors +type: logs diff --git a/apmpackage/apm/0.1.0/data_stream/metrics/fields/base-fields.yml b/apmpackage/apm/0.1.0/data_stream/metrics/fields/base-fields.yml new file mode 100644 index 0000000000..bef973826b --- /dev/null +++ b/apmpackage/apm/0.1.0/data_stream/metrics/fields/base-fields.yml @@ -0,0 +1,12 @@ +- name: '@timestamp' + type: date + description: Event timestamp. +- name: data_stream.type + type: constant_keyword + description: Data stream type. +- name: data_stream.dataset + type: constant_keyword + description: Data stream dataset. +- name: data_stream.namespace + type: constant_keyword + description: Data stream namespace. diff --git a/apmpackage/apm/0.1.0/data_stream/metrics/fields/ecs.yml b/apmpackage/apm/0.1.0/data_stream/metrics/fields/ecs.yml new file mode 100644 index 0000000000..fcaf9a55b6 --- /dev/null +++ b/apmpackage/apm/0.1.0/data_stream/metrics/fields/ecs.yml @@ -0,0 +1,614 @@ +- name: labels + type: object + description: | + A flat mapping of user-defined labels with string, boolean or number values. +- name: service + type: group + description: | + Service fields. + fields: + - name: name + type: keyword + description: | + Immutable name of the service emitting this event. + - name: version + type: keyword + description: | + Version of the service emitting this event. + - name: node + type: group + fields: + - name: name + type: keyword + description: | + Unique meaningful name of the service node. +- name: transaction + type: group + fields: + - name: id + type: keyword + description: | + The transaction ID. +- name: agent + type: group + fields: + - name: name + type: keyword + description: | + Name of the agent used. + - name: version + type: keyword + description: | + Version of the agent used. + - name: ephemeral_id + type: keyword + description: | + The Ephemeral ID identifies a running process. +- name: container + title: Container + type: group + description: | + Container fields are used for meta information about the specific container that is the source of information. These fields help correlate data based containers from any runtime. + fields: + - name: id + type: keyword + description: | + Unique container id. +- name: host + type: group + description: | + Optional host fields. + fields: + - name: architecture + type: keyword + description: | + The architecture of the host the event was recorded on. + - name: hostname + type: keyword + description: | + The hostname of the host the event was recorded on. + - name: name + type: keyword + description: | + Name of the host the event was recorded on. It can contain same information as host.hostname or a name specified by the user. + - name: ip + type: ip + description: | + IP of the host that records the event. + - name: os + title: Operating System + group: 2 + type: group + description: | + The OS fields contain information about the operating system. + fields: + - name: platform + type: keyword + description: | + The platform of the host the event was recorded on. +- name: process + type: group + description: | + Information pertaining to the running process where the data was collected + fields: + - name: args + level: extended + type: keyword + description: | + Process arguments. May be filtered to protect sensitive information. + - name: pid + type: long + description: | + Numeric process ID of the service process. + - name: ppid + type: long + description: | + Numeric ID of the service's parent process. + - name: title + type: keyword + description: | + Service process title. +- name: observer + type: group + fields: + - name: hostname + type: keyword + description: | + Hostname of the APM Server. + - name: version + type: keyword + description: | + APM Server version. + - name: type + type: keyword + description: | + The type will be set to `apm-server`. +- name: user + type: group + fields: + - name: name + type: keyword + description: | + The username of the logged in user. + - name: id + type: keyword + description: | + Identifier of the logged in user. + - name: email + type: keyword + description: | + Email of the logged in user. +- name: client + type: group + fields: + - name: ip + type: ip + description: | + IP address of the client of a recorded event. This is typically obtained from a request's X-Forwarded-For or the X-Real-IP header or falls back to a given configuration for remote address. +- name: source + type: group + fields: + - name: ip + type: ip + description: | + IP address of the source of a recorded event. This is typically obtained from a request's X-Forwarded-For or the X-Real-IP header or falls back to a given configuration for remote address. +- name: destination + title: Destination + group: 2 + type: group + description: |- + Destination fields describe details about the destination of a packet/event. + Destination fields are usually populated in conjunction with source fields. + fields: + - name: address + level: extended + type: keyword + description: Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. Then it should be duplicated to `.ip` or `.domain`, depending on which one it is. + ignore_above: 1024 + - name: ip + level: core + type: ip + description: IP addess of the destination. Can be one of multiple IPv4 or IPv6 addresses. + - name: port + level: core + type: long + format: string + description: Port of the destination. +- name: user_agent + title: User agent + type: group + description: | + The user_agent fields normally come from a browser request. They often show up in web service logs coming from the parsed user agent string. + fields: + - name: original + type: keyword + description: | + Unparsed version of the user_agent. + multi_fields: + - name: text + type: text + - name: name + type: keyword + description: | + Name of the user agent. + - name: version + type: keyword + description: | + Version of the user agent. + - name: device + title: Device + type: group + description: | + Information concerning the device. + fields: + - name: name + type: keyword + description: | + Name of the device. + - name: os + title: Operating System + type: group + description: | + The OS fields contain information about the operating system. + fields: + - name: platform + type: keyword + description: | + Operating system platform (such centos, ubuntu, windows). + - name: name + type: keyword + description: | + Operating system name, without the version. + - name: full + type: keyword + description: | + Operating system name, including the version or code name. + - name: family + type: keyword + description: | + OS family (such as redhat, debian, freebsd, windows). + - name: version + type: keyword + description: | + Operating system version as a raw string. + - name: kernel + type: keyword + description: | + Operating system kernel version as a raw string. +- name: cloud + title: Cloud + group: 2 + type: group + description: | + Cloud metadata reported by agents + fields: + - name: account + type: group + fields: + - name: id + level: extended + type: keyword + description: Cloud account ID + ignore_above: 1024 + - name: name + level: extended + type: keyword + description: Cloud account name + ignore_above: 1024 + - name: availability_zone + level: extended + type: keyword + description: Cloud availability zone name + ignore_above: 1024 + - name: instance + type: group + fields: + - name: id + level: extended + type: keyword + description: Cloud instance/machine ID + ignore_above: 1024 + - name: name + level: extended + type: keyword + description: Cloud instance/machine name + ignore_above: 1024 + - name: machine + type: group + fields: + - name: type + level: extended + type: keyword + description: Cloud instance/machine type + ignore_above: 1024 + - name: project + type: group + fields: + - name: id + level: extended + type: keyword + description: Cloud project ID + ignore_above: 1024 + - name: name + level: extended + type: keyword + description: Cloud project name + ignore_above: 1024 + - name: provider + level: extended + type: keyword + description: Cloud provider name + ignore_above: 1024 + - name: region + level: extended + type: keyword + description: Cloud region name + ignore_above: 1024 +- name: event + type: group + fields: + - name: outcome + level: core + type: keyword + description: | + `event.outcome` simply denotes whether the event represents a success or a failure from the perspective of the entity that produced the event. + ignore_above: 1024 +- name: labels + type: object + description: | + A flat mapping of user-defined labels with string, boolean or number values. +- name: service + type: group + description: | + Service fields. + fields: + - name: name + type: keyword + description: | + Immutable name of the service emitting this event. + - name: version + type: keyword + description: | + Version of the service emitting this event. + - name: node + type: group + fields: + - name: name + type: keyword + description: | + Unique meaningful name of the service node. +- name: agent + type: group + fields: + - name: name + type: keyword + description: | + Name of the agent used. + - name: version + type: keyword + description: | + Version of the agent used. + - name: ephemeral_id + type: keyword + description: | + The Ephemeral ID identifies a running process. +- name: container + title: Container + type: group + description: | + Container fields are used for meta information about the specific container that is the source of information. These fields help correlate data based containers from any runtime. + fields: + - name: id + type: keyword + description: | + Unique container id. +- name: host + type: group + description: | + Optional host fields. + fields: + - name: architecture + type: keyword + description: | + The architecture of the host the event was recorded on. + - name: hostname + type: keyword + description: | + The hostname of the host the event was recorded on. + - name: name + type: keyword + description: | + Name of the host the event was recorded on. It can contain same information as host.hostname or a name specified by the user. + - name: ip + type: ip + description: | + IP of the host that records the event. + - name: os + title: Operating System + group: 2 + type: group + description: | + The OS fields contain information about the operating system. + fields: + - name: platform + type: keyword + description: | + The platform of the host the event was recorded on. +- name: process + type: group + description: | + Information pertaining to the running process where the data was collected + fields: + - name: args + level: extended + type: keyword + description: | + Process arguments. May be filtered to protect sensitive information. + - name: pid + type: long + description: | + Numeric process ID of the service process. + - name: ppid + type: long + description: | + Numeric ID of the service's parent process. + - name: title + type: keyword + description: | + Service process title. +- name: observer + type: group + fields: + - name: hostname + type: keyword + description: | + Hostname of the APM Server. + - name: version + type: keyword + description: | + APM Server version. + - name: type + type: keyword + description: | + The type will be set to `apm-server`. +- name: user + type: group + fields: + - name: name + type: keyword + description: | + The username of the logged in user. + - name: id + type: keyword + description: | + Identifier of the logged in user. + - name: email + type: keyword + description: | + Email of the logged in user. +- name: client + type: group + fields: + - name: ip + type: ip + description: | + IP address of the client of a recorded event. This is typically obtained from a request's X-Forwarded-For or the X-Real-IP header or falls back to a given configuration for remote address. +- name: source + type: group + fields: + - name: ip + type: ip + description: | + IP address of the source of a recorded event. This is typically obtained from a request's X-Forwarded-For or the X-Real-IP header or falls back to a given configuration for remote address. +- name: destination + title: Destination + group: 2 + type: group + description: |- + Destination fields describe details about the destination of a packet/event. + Destination fields are usually populated in conjunction with source fields. + fields: + - name: address + level: extended + type: keyword + description: Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. Then it should be duplicated to `.ip` or `.domain`, depending on which one it is. + ignore_above: 1024 + - name: ip + level: core + type: ip + description: IP addess of the destination. Can be one of multiple IPv4 or IPv6 addresses. + - name: port + level: core + type: long + format: string + description: Port of the destination. +- name: user_agent + title: User agent + type: group + description: | + The user_agent fields normally come from a browser request. They often show up in web service logs coming from the parsed user agent string. + fields: + - name: original + type: keyword + description: | + Unparsed version of the user_agent. + multi_fields: + - name: text + type: text + - name: name + type: keyword + description: | + Name of the user agent. + - name: version + type: keyword + description: | + Version of the user agent. + - name: device + title: Device + type: group + description: | + Information concerning the device. + fields: + - name: name + type: keyword + description: | + Name of the device. + - name: os + title: Operating System + type: group + description: | + The OS fields contain information about the operating system. + fields: + - name: platform + type: keyword + description: | + Operating system platform (such centos, ubuntu, windows). + - name: name + type: keyword + description: | + Operating system name, without the version. + - name: full + type: keyword + description: | + Operating system name, including the version or code name. + - name: family + type: keyword + description: | + OS family (such as redhat, debian, freebsd, windows). + - name: version + type: keyword + description: | + Operating system version as a raw string. + - name: kernel + type: keyword + description: | + Operating system kernel version as a raw string. +- name: cloud + title: Cloud + group: 2 + type: group + description: | + Cloud metadata reported by agents + fields: + - name: account + type: group + fields: + - name: id + level: extended + type: keyword + description: Cloud account ID + ignore_above: 1024 + - name: name + level: extended + type: keyword + description: Cloud account name + ignore_above: 1024 + - name: availability_zone + level: extended + type: keyword + description: Cloud availability zone name + ignore_above: 1024 + - name: instance + type: group + fields: + - name: id + level: extended + type: keyword + description: Cloud instance/machine ID + ignore_above: 1024 + - name: name + level: extended + type: keyword + description: Cloud instance/machine name + ignore_above: 1024 + - name: machine + type: group + fields: + - name: type + level: extended + type: keyword + description: Cloud instance/machine type + ignore_above: 1024 + - name: project + type: group + fields: + - name: id + level: extended + type: keyword + description: Cloud project ID + ignore_above: 1024 + - name: name + level: extended + type: keyword + description: Cloud project name + ignore_above: 1024 + - name: provider + level: extended + type: keyword + description: Cloud provider name + ignore_above: 1024 + - name: region + level: extended + type: keyword + description: Cloud region name + ignore_above: 1024 diff --git a/apmpackage/apm/0.1.0/data_stream/metrics/fields/fields.yml b/apmpackage/apm/0.1.0/data_stream/metrics/fields/fields.yml new file mode 100644 index 0000000000..35720942e4 --- /dev/null +++ b/apmpackage/apm/0.1.0/data_stream/metrics/fields/fields.yml @@ -0,0 +1,461 @@ +- name: processor.name + type: keyword + description: Processor name. +- name: processor.event + type: keyword + description: Processor event. +- name: timestamp + type: group + fields: + - name: us + type: long + description: | + Timestamp of the event in microseconds since Unix epoch. +- name: service + type: group + description: | + Service fields. + fields: + - name: environment + type: keyword + description: | + Service environment. + - name: language + type: group + fields: + - name: name + type: keyword + description: | + Name of the programming language used. + - name: version + type: keyword + description: | + Version of the programming language used. + - name: runtime + type: group + fields: + - name: name + type: keyword + description: | + Name of the runtime used. + - name: version + type: keyword + description: | + Version of the runtime used. + - name: framework + type: group + fields: + - name: name + type: keyword + description: | + Name of the framework used. + - name: version + type: keyword + description: | + Version of the framework used. +- name: transaction + type: group + fields: + - name: sampled + type: boolean + description: | + Transactions that are 'sampled' will include all available information. Transactions that are not sampled will not have spans or context. + - name: type + type: keyword + description: | + Keyword of specific relevance in the service's domain (eg. 'request', 'backgroundjob', etc) + - name: name + type: keyword + description: | + Generic designation of a transaction in the scope of a single service (eg. 'GET /users/:id'). + multi_fields: + - name: text + type: text + - name: duration + type: group + fields: + - name: count + type: long + - name: sum + type: group + fields: + - name: us + type: long + - name: self_time + type: group + description: | + Portion of the transaction's duration where no direct child was running + fields: + - name: count + type: long + - name: sum + type: group + fields: + - name: us + type: long + - name: breakdown + type: group + description: | + Counter for collected breakdowns for the transaction + fields: + - name: count + type: long + - name: root + type: boolean + description: | + Identifies metrics for root transactions. This can be used for calculating metrics for traces. +- name: span + type: group + fields: + - name: type + type: keyword + description: | + Keyword of specific relevance in the service's domain (eg: 'db.postgresql.query', 'template.erb', 'cache', etc). + - name: subtype + type: keyword + description: | + A further sub-division of the type (e.g. postgresql, elasticsearch) + - name: self_time + type: group + description: | + Portion of the span's duration where no direct child was running + fields: + - name: count + type: long + - name: sum + type: group + fields: + - name: us + type: long +- name: kubernetes + title: Kubernetes + type: group + description: | + Kubernetes metadata reported by agents + fields: + - name: namespace + type: keyword + description: | + Kubernetes namespace + - name: node + type: group + fields: + - name: name + type: keyword + description: | + Kubernetes node name + - name: pod + type: group + fields: + - name: name + type: keyword + description: | + Kubernetes pod name + - name: uid + type: keyword + description: | + Kubernetes Pod UID +- name: observer + type: group + fields: + - name: listening + type: keyword + description: | + Address the server is listening on. + - name: version_major + type: byte + description: | + Major version number of the observer +- name: experimental + type: object + description: Additional experimental data sent by the agents. +- name: system + type: group + description: | + `system` contains local system metrics. + fields: + - name: cpu + type: group + description: | + `cpu` contains local CPU stats. + fields: + - name: total.norm.pct + type: scaled_float + format: percent + description: | + The percentage of CPU time spent by the process since the last event. This value is normalized by the number of CPU cores and it ranges from 0 to 100%. + - name: memory + type: group + description: | + `memory` contains local memory stats. + fields: + - name: total + type: long + format: bytes + description: | + Total memory. + - name: actual + type: group + description: | + Actual memory used and free. + fields: + - name: free + type: long + format: bytes + description: | + Actual free memory in bytes. It is calculated based on the OS. On Linux it consists of the free memory plus caches and buffers. On OSX it is a sum of free memory and the inactive memory. On Windows, it is equal to `system.memory.free`. + - name: process + type: group + description: | + `process` contains process metadata, CPU metrics, and memory metrics. + fields: + - name: cpu + type: group + description: | + `cpu` contains local CPU stats. + fields: + - name: total.norm.pct + type: scaled_float + format: percent + description: | + The percentage of CPU time spent by the process since the last event. This value is normalized by the number of CPU cores and it ranges from 0 to 100%. + - name: memory + type: group + description: Memory-specific statistics per process. + fields: + - name: size + type: long + format: bytes + description: | + The total virtual memory the process has. + - name: rss.bytes + type: long + format: bytes + description: | + The Resident Set Size. The amount of memory the process occupied in main memory (RAM). + - name: cgroup + type: group + description: Metrics and limits for the cgroup, collected by APM agents on Linux. + fields: + - name: memory + type: group + description: Memory-specific cgroup metrics and limits. + fields: + - name: mem.limit.bytes + type: long + format: bytes + description: Memory limit for the current cgroup slice. + - name: mem.usage.bytes + type: long + format: bytes + description: Memory usage by the current cgroup slice. +- name: processor.name + type: keyword + description: Processor name. +- name: processor.event + type: keyword + description: Processor event. +- name: timestamp + type: group + fields: + - name: us + type: long + description: | + Timestamp of the event in microseconds since Unix epoch. +- name: service + type: group + description: | + Service fields. + fields: + - name: environment + type: keyword + description: | + Service environment. + - name: language + type: group + fields: + - name: name + type: keyword + description: | + Name of the programming language used. + - name: version + type: keyword + description: | + Version of the programming language used. + - name: runtime + type: group + fields: + - name: name + type: keyword + description: | + Name of the runtime used. + - name: version + type: keyword + description: | + Version of the runtime used. + - name: framework + type: group + fields: + - name: name + type: keyword + description: | + Name of the framework used. + - name: version + type: keyword + description: | + Version of the framework used. +- name: kubernetes + title: Kubernetes + type: group + description: | + Kubernetes metadata reported by agents + fields: + - name: namespace + type: keyword + description: | + Kubernetes namespace + - name: node + type: group + fields: + - name: name + type: keyword + description: | + Kubernetes node name + - name: pod + type: group + fields: + - name: name + type: keyword + description: | + Kubernetes pod name + - name: uid + type: keyword + description: | + Kubernetes Pod UID +- name: observer + type: group + fields: + - name: listening + type: keyword + description: | + Address the server is listening on. + - name: version_major + type: byte + description: | + Major version number of the observer +- name: experimental + type: object + description: Additional experimental data sent by the agents. +- name: profile + type: group + fields: + - name: id + type: keyword + description: | + Unique ID for the profile. All samples within a profile will have the same profile ID. + - name: duration + type: long + description: | + Duration of the profile, in microseconds. All samples within a profile will have the same duration. To aggregate durations, you should first group by the profile ID. + - name: cpu + type: group + fields: + - name: ns + type: long + description: | + Amount of CPU time profiled, in nanoseconds. + - name: samples + type: group + fields: + - name: count + type: long + description: | + Number of profile samples for the profiling period. + - name: alloc_objects + type: group + fields: + - name: count + type: long + description: | + Number of objects allocated since the process started. + - name: alloc_space + type: group + fields: + - name: bytes + type: long + description: | + Amount of memory allocated, in bytes, since the process started. + - name: inuse_objects + type: group + fields: + - name: count + type: long + description: | + Number of objects allocated and currently in use. + - name: inuse_space + type: group + fields: + - name: bytes + type: long + description: | + Amount of memory allocated, in bytes, and currently in use. + - name: top + type: group + fields: + - name: id + type: keyword + description: | + Unique ID for the top stack frame in the context of its callers. + - name: function + type: keyword + description: | + Function name for the top stack frame. + - name: filename + type: keyword + description: | + Source code filename for the top stack frame. + - name: line + type: long + description: | + Source code line number for the top stack frame. + - name: stack + type: group + fields: + - name: id + type: keyword + description: | + Unique ID for a stack frame in the context of its callers. + - name: function + type: keyword + description: | + Function name for a stack frame. + - name: filename + type: keyword + description: | + Source code filename for a stack frame. + - name: line + type: long + description: | + Source code line number for a stack frame. +- name: transaction + type: group + fields: + - name: duration + type: group + fields: + - name: histogram + type: histogram + description: | + Pre-aggregated histogram of transaction durations. +- name: metricset.period + type: long +- name: span + type: group + fields: + - name: destination.service + type: group + fields: + - name: response_time.count + type: long + - name: response_time.sum.us + type: long diff --git a/apmpackage/apm/0.1.0/data_stream/metrics/manifest.yml b/apmpackage/apm/0.1.0/data_stream/metrics/manifest.yml new file mode 100644 index 0000000000..fe1408e888 --- /dev/null +++ b/apmpackage/apm/0.1.0/data_stream/metrics/manifest.yml @@ -0,0 +1,2 @@ +title: APM metrics +type: metrics diff --git a/apmpackage/apm/0.1.0/data_stream/traces/fields/base-fields.yml b/apmpackage/apm/0.1.0/data_stream/traces/fields/base-fields.yml new file mode 100644 index 0000000000..bef973826b --- /dev/null +++ b/apmpackage/apm/0.1.0/data_stream/traces/fields/base-fields.yml @@ -0,0 +1,12 @@ +- name: '@timestamp' + type: date + description: Event timestamp. +- name: data_stream.type + type: constant_keyword + description: Data stream type. +- name: data_stream.dataset + type: constant_keyword + description: Data stream dataset. +- name: data_stream.namespace + type: constant_keyword + description: Data stream namespace. diff --git a/apmpackage/apm/0.1.0/data_stream/traces/fields/ecs.yml b/apmpackage/apm/0.1.0/data_stream/traces/fields/ecs.yml new file mode 100644 index 0000000000..0948ef2f3a --- /dev/null +++ b/apmpackage/apm/0.1.0/data_stream/traces/fields/ecs.yml @@ -0,0 +1,709 @@ +- name: url + type: group + description: | + A complete Url, with scheme, host and path. + fields: + - name: scheme + type: keyword + description: | + The protocol of the request, e.g. "https:". + - name: full + type: keyword + description: | + The full, possibly agent-assembled URL of the request, e.g https://example.com:443/search?q=elasticsearch#top. + - name: domain + type: keyword + description: | + The hostname of the request, e.g. "example.com". + - name: port + type: long + description: | + The port of the request, e.g. 443. + - name: path + type: keyword + description: | + The path of the request, e.g. "/search". + - name: query + type: keyword + description: | + The query string of the request, e.g. "q=elasticsearch". + - name: fragment + type: keyword + description: | + A fragment specifying a location in a web page , e.g. "top". +- name: http + type: group + fields: + - name: version + type: keyword + description: | + The http version of the request leading to this event. + - name: request + type: group + fields: + - name: method + type: keyword + description: | + The http method of the request leading to this event. + - name: referrer + type: keyword + description: Referrer for this HTTP request. + ignore_above: 1024 + - name: response + type: group + fields: + - name: status_code + type: long + description: | + The status code of the HTTP response. +- name: labels + type: object + description: | + A flat mapping of user-defined labels with string, boolean or number values. +- name: service + type: group + description: | + Service fields. + fields: + - name: name + type: keyword + description: | + Immutable name of the service emitting this event. + - name: version + type: keyword + description: | + Version of the service emitting this event. + - name: node + type: group + fields: + - name: name + type: keyword + description: | + Unique meaningful name of the service node. +- name: transaction + type: group + fields: + - name: id + type: keyword + description: | + The transaction ID. +- name: trace + type: group + fields: + - name: id + type: keyword + description: | + The ID of the trace to which the event belongs to. +- name: agent + type: group + fields: + - name: name + type: keyword + description: | + Name of the agent used. + - name: version + type: keyword + description: | + Version of the agent used. + - name: ephemeral_id + type: keyword + description: | + The Ephemeral ID identifies a running process. +- name: container + title: Container + type: group + description: | + Container fields are used for meta information about the specific container that is the source of information. These fields help correlate data based containers from any runtime. + fields: + - name: id + type: keyword + description: | + Unique container id. +- name: host + type: group + description: | + Optional host fields. + fields: + - name: architecture + type: keyword + description: | + The architecture of the host the event was recorded on. + - name: hostname + type: keyword + description: | + The hostname of the host the event was recorded on. + - name: name + type: keyword + description: | + Name of the host the event was recorded on. It can contain same information as host.hostname or a name specified by the user. + - name: ip + type: ip + description: | + IP of the host that records the event. + - name: os + title: Operating System + group: 2 + type: group + description: | + The OS fields contain information about the operating system. + fields: + - name: platform + type: keyword + description: | + The platform of the host the event was recorded on. +- name: process + type: group + description: | + Information pertaining to the running process where the data was collected + fields: + - name: args + level: extended + type: keyword + description: | + Process arguments. May be filtered to protect sensitive information. + - name: pid + type: long + description: | + Numeric process ID of the service process. + - name: ppid + type: long + description: | + Numeric ID of the service's parent process. + - name: title + type: keyword + description: | + Service process title. +- name: observer + type: group + fields: + - name: hostname + type: keyword + description: | + Hostname of the APM Server. + - name: version + type: keyword + description: | + APM Server version. + - name: type + type: keyword + description: | + The type will be set to `apm-server`. +- name: user + type: group + fields: + - name: name + type: keyword + description: | + The username of the logged in user. + - name: id + type: keyword + description: | + Identifier of the logged in user. + - name: email + type: keyword + description: | + Email of the logged in user. +- name: client + type: group + fields: + - name: ip + type: ip + description: | + IP address of the client of a recorded event. This is typically obtained from a request's X-Forwarded-For or the X-Real-IP header or falls back to a given configuration for remote address. +- name: source + type: group + fields: + - name: ip + type: ip + description: | + IP address of the source of a recorded event. This is typically obtained from a request's X-Forwarded-For or the X-Real-IP header or falls back to a given configuration for remote address. +- name: destination + title: Destination + group: 2 + type: group + description: |- + Destination fields describe details about the destination of a packet/event. + Destination fields are usually populated in conjunction with source fields. + fields: + - name: address + level: extended + type: keyword + description: Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. Then it should be duplicated to `.ip` or `.domain`, depending on which one it is. + ignore_above: 1024 + - name: ip + level: core + type: ip + description: IP addess of the destination. Can be one of multiple IPv4 or IPv6 addresses. + - name: port + level: core + type: long + format: string + description: Port of the destination. +- name: user_agent + title: User agent + type: group + description: | + The user_agent fields normally come from a browser request. They often show up in web service logs coming from the parsed user agent string. + fields: + - name: original + type: keyword + description: | + Unparsed version of the user_agent. + multi_fields: + - name: text + type: text + - name: name + type: keyword + description: | + Name of the user agent. + - name: version + type: keyword + description: | + Version of the user agent. + - name: device + title: Device + type: group + description: | + Information concerning the device. + fields: + - name: name + type: keyword + description: | + Name of the device. + - name: os + title: Operating System + type: group + description: | + The OS fields contain information about the operating system. + fields: + - name: platform + type: keyword + description: | + Operating system platform (such centos, ubuntu, windows). + - name: name + type: keyword + description: | + Operating system name, without the version. + - name: full + type: keyword + description: | + Operating system name, including the version or code name. + - name: family + type: keyword + description: | + OS family (such as redhat, debian, freebsd, windows). + - name: version + type: keyword + description: | + Operating system version as a raw string. + - name: kernel + type: keyword + description: | + Operating system kernel version as a raw string. +- name: cloud + title: Cloud + group: 2 + type: group + description: | + Cloud metadata reported by agents + fields: + - name: account + type: group + fields: + - name: id + level: extended + type: keyword + description: Cloud account ID + ignore_above: 1024 + - name: name + level: extended + type: keyword + description: Cloud account name + ignore_above: 1024 + - name: availability_zone + level: extended + type: keyword + description: Cloud availability zone name + ignore_above: 1024 + - name: instance + type: group + fields: + - name: id + level: extended + type: keyword + description: Cloud instance/machine ID + ignore_above: 1024 + - name: name + level: extended + type: keyword + description: Cloud instance/machine name + ignore_above: 1024 + - name: machine + type: group + fields: + - name: type + level: extended + type: keyword + description: Cloud instance/machine type + ignore_above: 1024 + - name: project + type: group + fields: + - name: id + level: extended + type: keyword + description: Cloud project ID + ignore_above: 1024 + - name: name + level: extended + type: keyword + description: Cloud project name + ignore_above: 1024 + - name: provider + level: extended + type: keyword + description: Cloud provider name + ignore_above: 1024 + - name: region + level: extended + type: keyword + description: Cloud region name + ignore_above: 1024 +- name: event + type: group + fields: + - name: outcome + level: core + type: keyword + description: | + `event.outcome` simply denotes whether the event represents a success or a failure from the perspective of the entity that produced the event. + ignore_above: 1024 +- name: labels + type: object + description: | + A flat mapping of user-defined labels with string, boolean or number values. +- name: service + type: group + description: | + Service fields. + fields: + - name: name + type: keyword + description: | + Immutable name of the service emitting this event. + - name: version + type: keyword + description: | + Version of the service emitting this event. + - name: node + type: group + fields: + - name: name + type: keyword + description: | + Unique meaningful name of the service node. +- name: transaction + type: group + fields: + - name: id + type: keyword + description: | + The transaction ID. +- name: trace + type: group + fields: + - name: id + type: keyword + description: | + The ID of the trace to which the event belongs to. +- name: agent + type: group + fields: + - name: name + type: keyword + description: | + Name of the agent used. + - name: version + type: keyword + description: | + Version of the agent used. + - name: ephemeral_id + type: keyword + description: | + The Ephemeral ID identifies a running process. +- name: container + title: Container + type: group + description: | + Container fields are used for meta information about the specific container that is the source of information. These fields help correlate data based containers from any runtime. + fields: + - name: id + type: keyword + description: | + Unique container id. +- name: host + type: group + description: | + Optional host fields. + fields: + - name: architecture + type: keyword + description: | + The architecture of the host the event was recorded on. + - name: hostname + type: keyword + description: | + The hostname of the host the event was recorded on. + - name: name + type: keyword + description: | + Name of the host the event was recorded on. It can contain same information as host.hostname or a name specified by the user. + - name: ip + type: ip + description: | + IP of the host that records the event. + - name: os + title: Operating System + group: 2 + type: group + description: | + The OS fields contain information about the operating system. + fields: + - name: platform + type: keyword + description: | + The platform of the host the event was recorded on. +- name: process + type: group + description: | + Information pertaining to the running process where the data was collected + fields: + - name: args + level: extended + type: keyword + description: | + Process arguments. May be filtered to protect sensitive information. + - name: pid + type: long + description: | + Numeric process ID of the service process. + - name: ppid + type: long + description: | + Numeric ID of the service's parent process. + - name: title + type: keyword + description: | + Service process title. +- name: observer + type: group + fields: + - name: hostname + type: keyword + description: | + Hostname of the APM Server. + - name: version + type: keyword + description: | + APM Server version. + - name: type + type: keyword + description: | + The type will be set to `apm-server`. +- name: user + type: group + fields: + - name: name + type: keyword + description: | + The username of the logged in user. + - name: id + type: keyword + description: | + Identifier of the logged in user. + - name: email + type: keyword + description: | + Email of the logged in user. +- name: client + type: group + fields: + - name: ip + type: ip + description: | + IP address of the client of a recorded event. This is typically obtained from a request's X-Forwarded-For or the X-Real-IP header or falls back to a given configuration for remote address. +- name: source + type: group + fields: + - name: ip + type: ip + description: | + IP address of the source of a recorded event. This is typically obtained from a request's X-Forwarded-For or the X-Real-IP header or falls back to a given configuration for remote address. +- name: destination + title: Destination + group: 2 + type: group + description: |- + Destination fields describe details about the destination of a packet/event. + Destination fields are usually populated in conjunction with source fields. + fields: + - name: address + level: extended + type: keyword + description: Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. Then it should be duplicated to `.ip` or `.domain`, depending on which one it is. + ignore_above: 1024 + - name: ip + level: core + type: ip + description: IP addess of the destination. Can be one of multiple IPv4 or IPv6 addresses. + - name: port + level: core + type: long + format: string + description: Port of the destination. +- name: user_agent + title: User agent + type: group + description: | + The user_agent fields normally come from a browser request. They often show up in web service logs coming from the parsed user agent string. + fields: + - name: original + type: keyword + description: | + Unparsed version of the user_agent. + multi_fields: + - name: text + type: text + - name: name + type: keyword + description: | + Name of the user agent. + - name: version + type: keyword + description: | + Version of the user agent. + - name: device + title: Device + type: group + description: | + Information concerning the device. + fields: + - name: name + type: keyword + description: | + Name of the device. + - name: os + title: Operating System + type: group + description: | + The OS fields contain information about the operating system. + fields: + - name: platform + type: keyword + description: | + Operating system platform (such centos, ubuntu, windows). + - name: name + type: keyword + description: | + Operating system name, without the version. + - name: full + type: keyword + description: | + Operating system name, including the version or code name. + - name: family + type: keyword + description: | + OS family (such as redhat, debian, freebsd, windows). + - name: version + type: keyword + description: | + Operating system version as a raw string. + - name: kernel + type: keyword + description: | + Operating system kernel version as a raw string. +- name: cloud + title: Cloud + group: 2 + type: group + description: | + Cloud metadata reported by agents + fields: + - name: account + type: group + fields: + - name: id + level: extended + type: keyword + description: Cloud account ID + ignore_above: 1024 + - name: name + level: extended + type: keyword + description: Cloud account name + ignore_above: 1024 + - name: availability_zone + level: extended + type: keyword + description: Cloud availability zone name + ignore_above: 1024 + - name: instance + type: group + fields: + - name: id + level: extended + type: keyword + description: Cloud instance/machine ID + ignore_above: 1024 + - name: name + level: extended + type: keyword + description: Cloud instance/machine name + ignore_above: 1024 + - name: machine + type: group + fields: + - name: type + level: extended + type: keyword + description: Cloud instance/machine type + ignore_above: 1024 + - name: project + type: group + fields: + - name: id + level: extended + type: keyword + description: Cloud project ID + ignore_above: 1024 + - name: name + level: extended + type: keyword + description: Cloud project name + ignore_above: 1024 + - name: provider + level: extended + type: keyword + description: Cloud provider name + ignore_above: 1024 + - name: region + level: extended + type: keyword + description: Cloud region name + ignore_above: 1024 +- name: event + type: group + fields: + - name: outcome + level: core + type: keyword + description: | + `event.outcome` simply denotes whether the event represents a success or a failure from the perspective of the entity that produced the event. + ignore_above: 1024 +- name: span + type: group + fields: + - name: id + type: keyword + description: | + The ID of the span stored as hex encoded string. diff --git a/apmpackage/apm/0.1.0/data_stream/traces/fields/fields.yml b/apmpackage/apm/0.1.0/data_stream/traces/fields/fields.yml new file mode 100644 index 0000000000..a1839bc0cc --- /dev/null +++ b/apmpackage/apm/0.1.0/data_stream/traces/fields/fields.yml @@ -0,0 +1,523 @@ +- name: processor.name + type: keyword + description: Processor name. +- name: processor.event + type: keyword + description: Processor event. +- name: timestamp + type: group + fields: + - name: us + type: long + description: | + Timestamp of the event in microseconds since Unix epoch. +- name: http + type: group + fields: + - name: request + type: group + fields: + - name: headers + type: object + description: | + The canonical headers of the monitored HTTP request. + - name: response + type: group + fields: + - name: finished + type: boolean + description: | + Used by the Node agent to indicate when in the response life cycle an error has occurred. + - name: headers + type: object + description: | + The canonical headers of the monitored HTTP response. +- name: service + type: group + description: | + Service fields. + fields: + - name: environment + type: keyword + description: | + Service environment. + - name: language + type: group + fields: + - name: name + type: keyword + description: | + Name of the programming language used. + - name: version + type: keyword + description: | + Version of the programming language used. + - name: runtime + type: group + fields: + - name: name + type: keyword + description: | + Name of the runtime used. + - name: version + type: keyword + description: | + Version of the runtime used. + - name: framework + type: group + fields: + - name: name + type: keyword + description: | + Name of the framework used. + - name: version + type: keyword + description: | + Version of the framework used. +- name: transaction + type: group + fields: + - name: sampled + type: boolean + description: | + Transactions that are 'sampled' will include all available information. Transactions that are not sampled will not have spans or context. + - name: type + type: keyword + description: | + Keyword of specific relevance in the service's domain (eg. 'request', 'backgroundjob', etc) + - name: name + type: keyword + description: | + Generic designation of a transaction in the scope of a single service (eg. 'GET /users/:id'). + multi_fields: + - name: text + type: text + - name: duration + type: group + fields: + - name: count + type: long + - name: sum + type: group + fields: + - name: us + type: long + - name: self_time + type: group + description: | + Portion of the transaction's duration where no direct child was running + fields: + - name: count + type: long + - name: sum + type: group + fields: + - name: us + type: long + - name: breakdown + type: group + description: | + Counter for collected breakdowns for the transaction + fields: + - name: count + type: long +- name: span + type: group + fields: + - name: type + type: keyword + description: | + Keyword of specific relevance in the service's domain (eg: 'db.postgresql.query', 'template.erb', 'cache', etc). + - name: subtype + type: keyword + description: | + A further sub-division of the type (e.g. postgresql, elasticsearch) + - name: self_time + type: group + description: | + Portion of the span's duration where no direct child was running + fields: + - name: count + type: long + - name: sum + type: group + fields: + - name: us + type: long +- name: parent + type: group + fields: + - name: id + type: keyword + description: | + The ID of the parent event. +- name: kubernetes + title: Kubernetes + type: group + description: | + Kubernetes metadata reported by agents + fields: + - name: namespace + type: keyword + description: | + Kubernetes namespace + - name: node + type: group + fields: + - name: name + type: keyword + description: | + Kubernetes node name + - name: pod + type: group + fields: + - name: name + type: keyword + description: | + Kubernetes pod name + - name: uid + type: keyword + description: | + Kubernetes Pod UID +- name: observer + type: group + fields: + - name: listening + type: keyword + description: | + Address the server is listening on. + - name: version_major + type: byte + description: | + Major version number of the observer +- name: experimental + type: object + description: Additional experimental data sent by the agents. +- name: transaction + type: group + fields: + - name: duration + type: group + fields: + - name: us + type: long + description: | + Total duration of this transaction, in microseconds. + - name: result + type: keyword + description: | + The result of the transaction. HTTP status code for HTTP-related transactions. + - name: marks + type: object + description: | + A user-defined mapping of groups of marks in milliseconds. + - name: marks.*.* + type: object + - name: experience + type: group + fields: + - name: cls + type: scaled_float + description: The Cumulative Layout Shift metric + - name: fid + type: scaled_float + description: The First Input Delay metric + - name: tbt + type: scaled_float + description: The Total Blocking Time metric + - name: longtask + type: group + description: Longtask duration/count metrics + fields: + - name: count + type: long + description: The total number of of longtasks + - name: sum + type: scaled_float + description: The sum of longtask durations + - name: max + type: scaled_float + description: The max longtask duration + - name: span_count + type: group + fields: + - name: dropped + type: long + description: The total amount of dropped spans for this transaction. + - name: message + type: group + fields: + - name: queue + type: group + fields: + - name: name + type: keyword + description: | + Name of the message queue or topic where the message is published or received. + - name: age + type: group + fields: + - name: ms + type: long + description: | + Age of a message in milliseconds. +- name: processor.name + type: keyword + description: Processor name. +- name: processor.event + type: keyword + description: Processor event. +- name: timestamp + type: group + fields: + - name: us + type: long + description: | + Timestamp of the event in microseconds since Unix epoch. +- name: service + type: group + description: | + Service fields. + fields: + - name: environment + type: keyword + description: | + Service environment. + - name: language + type: group + fields: + - name: name + type: keyword + description: | + Name of the programming language used. + - name: version + type: keyword + description: | + Version of the programming language used. + - name: runtime + type: group + fields: + - name: name + type: keyword + description: | + Name of the runtime used. + - name: version + type: keyword + description: | + Version of the runtime used. + - name: framework + type: group + fields: + - name: name + type: keyword + description: | + Name of the framework used. + - name: version + type: keyword + description: | + Version of the framework used. +- name: transaction + type: group + fields: + - name: sampled + type: boolean + description: | + Transactions that are 'sampled' will include all available information. Transactions that are not sampled will not have spans or context. + - name: type + type: keyword + description: | + Keyword of specific relevance in the service's domain (eg. 'request', 'backgroundjob', etc) + - name: name + type: keyword + description: | + Generic designation of a transaction in the scope of a single service (eg. 'GET /users/:id'). + multi_fields: + - name: text + type: text + - name: duration + type: group + fields: + - name: count + type: long + - name: sum + type: group + fields: + - name: us + type: long + - name: self_time + type: group + description: | + Portion of the transaction's duration where no direct child was running + fields: + - name: count + type: long + - name: sum + type: group + fields: + - name: us + type: long + - name: breakdown + type: group + description: | + Counter for collected breakdowns for the transaction + fields: + - name: count + type: long +- name: span + type: group + fields: + - name: type + type: keyword + description: | + Keyword of specific relevance in the service's domain (eg: 'db.postgresql.query', 'template.erb', 'cache', etc). + - name: subtype + type: keyword + description: | + A further sub-division of the type (e.g. postgresql, elasticsearch) + - name: self_time + type: group + description: | + Portion of the span's duration where no direct child was running + fields: + - name: count + type: long + - name: sum + type: group + fields: + - name: us + type: long +- name: parent + type: group + fields: + - name: id + type: keyword + description: | + The ID of the parent event. +- name: kubernetes + title: Kubernetes + type: group + description: | + Kubernetes metadata reported by agents + fields: + - name: namespace + type: keyword + description: | + Kubernetes namespace + - name: node + type: group + fields: + - name: name + type: keyword + description: | + Kubernetes node name + - name: pod + type: group + fields: + - name: name + type: keyword + description: | + Kubernetes pod name + - name: uid + type: keyword + description: | + Kubernetes Pod UID +- name: observer + type: group + fields: + - name: listening + type: keyword + description: | + Address the server is listening on. + - name: version_major + type: byte + description: | + Major version number of the observer +- name: experimental + type: object + description: Additional experimental data sent by the agents. +- name: view spans + type: keyword + format: url +- name: child + type: group + fields: + - name: id + type: keyword + description: | + The ID(s)s of the child event(s). +- name: span + type: group + fields: + - name: name + type: keyword + description: | + Generic designation of a span in the scope of a transaction. + - name: action + type: keyword + description: | + The specific kind of event within the sub-type represented by the span (e.g. query, connect) + - name: start + type: group + fields: + - name: us + type: long + description: | + Offset relative to the transaction's timestamp identifying the start of the span, in microseconds. + - name: duration + type: group + fields: + - name: us + type: long + description: | + Duration of the span, in microseconds. + - name: sync + type: boolean + description: | + Indicates whether the span was executed synchronously or asynchronously. + - name: db + type: group + fields: + - name: link + type: keyword + description: | + Database link. + - name: rows_affected + type: long + description: | + Number of rows affected by the database statement. + - name: destination + type: group + fields: + - name: service + type: group + description: Destination service context + fields: + - name: type + type: keyword + description: | + Type of the destination service (e.g. 'db', 'elasticsearch'). Should typically be the same as span.type. + - name: name + type: keyword + description: | + Identifier for the destination service (e.g. 'http://elastic.co', 'elasticsearch', 'rabbitmq') + - name: resource + type: keyword + description: | + Identifier for the destination service resource being operated on (e.g. 'http://elastic.co:80', 'elasticsearch', 'rabbitmq/queue_name') + - name: message + type: group + fields: + - name: queue + type: group + fields: + - name: name + type: keyword + description: | + Name of the message queue or topic where the message is published or received. + - name: age + type: group + fields: + - name: ms + type: long + description: | + Age of a message in milliseconds. diff --git a/apmpackage/apm/0.1.0/data_stream/traces/manifest.yml b/apmpackage/apm/0.1.0/data_stream/traces/manifest.yml new file mode 100644 index 0000000000..2734366240 --- /dev/null +++ b/apmpackage/apm/0.1.0/data_stream/traces/manifest.yml @@ -0,0 +1,2 @@ +title: APM traces +type: traces diff --git a/apmpackage/apm/0.1.0/docs/README.md b/apmpackage/apm/0.1.0/docs/README.md new file mode 100644 index 0000000000..d14954a78e --- /dev/null +++ b/apmpackage/apm/0.1.0/docs/README.md @@ -0,0 +1,921 @@ +# APM Integration + +The APM integration installs templates and pipelines for APM data. +If a policy contains an `apm` input, any Elastic Agent(s) set up with that policy will run an APM Server binary, and bind to `localhost:8200`. +You must configure your APM Agents to communicate with that APM Server. + +If you have RUM enabled, you must run APM Server centrally. Otherwise, you can run it at the edge machines. +To do so, download and enroll an Elastic Agent in the same machines where your instrumented services run. + + +### Compatibility and limitations + +The APM integration requires Kibana 7.11 and Elasticsearch with basic license. +This version is experimental and has some limitations, listed bellow: + +- Elastic Cloud is not supported. +- Standalone mode is not supported. +- If you need to customize settings for APM Server, you need to update the agent policy manually. +Look for `apm-server` in the `apm` input. +- It is not possible to change APM Server settings dynamically. +You must update the policy with any changes you need and stop the APM Server process. + + +### Configuration parameters + +- `RUM`: Enables support for RUM monitoring. See the [documentation](https://www.elastic.co/guide/en/apm/server/current/configuration-rum.html) for details. + + +### Traces + +Traces are comprised of [spans and transactions](https://www.elastic.co/guide/en/apm/get-started/current/apm-data-model.html). +Traces are written to `traces-apm.*` indices. + +**Exported Fields** + +| Field | Description | Type | ECS | +|---|---|---|:---:| +|@timestamp|Event timestamp.|date| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|data_stream.type|Data stream type.|constant_keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|data_stream.dataset|Data stream dataset.|constant_keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|data_stream.namespace|Data stream namespace.|constant_keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|agent.ephemeral_id|The Ephemeral ID identifies a running process.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|agent.ephemeral_id|The Ephemeral ID identifies a running process.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|agent.name|Name of the agent used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|agent.name|Name of the agent used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|agent.version|Version of the agent used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|agent.version|Version of the agent used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|child.id|The ID(s)s of the child event(s).|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|client.ip|IP address of the client of a recorded event. This is typically obtained from a request's X-Forwarded-For or the X-Real-IP header or falls back to a given configuration for remote address.|ip| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|client.ip|IP address of the client of a recorded event. This is typically obtained from a request's X-Forwarded-For or the X-Real-IP header or falls back to a given configuration for remote address.|ip| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.account.id|Cloud account ID|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.account.id|Cloud account ID|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.account.name|Cloud account name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.account.name|Cloud account name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.availability_zone|Cloud availability zone name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.availability_zone|Cloud availability zone name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.instance.id|Cloud instance/machine ID|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.instance.id|Cloud instance/machine ID|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.instance.name|Cloud instance/machine name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.instance.name|Cloud instance/machine name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.machine.type|Cloud instance/machine type|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.machine.type|Cloud instance/machine type|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.project.id|Cloud project ID|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.project.id|Cloud project ID|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.project.name|Cloud project name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.project.name|Cloud project name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.provider|Cloud provider name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.provider|Cloud provider name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.region|Cloud region name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.region|Cloud region name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|container.id|Unique container id.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|container.id|Unique container id.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|destination.address|Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. Then it should be duplicated to `.ip` or `.domain`, depending on which one it is.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|destination.address|Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. Then it should be duplicated to `.ip` or `.domain`, depending on which one it is.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|destination.ip|IP addess of the destination. Can be one of multiple IPv4 or IPv6 addresses.|ip| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|destination.ip|IP addess of the destination. Can be one of multiple IPv4 or IPv6 addresses.|ip| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|destination.port|Port of the destination.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|destination.port|Port of the destination.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|event.outcome|`event.outcome` simply denotes whether the event represents a success or a failure from the perspective of the entity that produced the event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|event.outcome|`event.outcome` simply denotes whether the event represents a success or a failure from the perspective of the entity that produced the event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|experimental|Additional experimental data sent by the agents.|object| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|experimental|Additional experimental data sent by the agents.|object| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|host.architecture|The architecture of the host the event was recorded on.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|host.architecture|The architecture of the host the event was recorded on.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|host.hostname|The hostname of the host the event was recorded on.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|host.hostname|The hostname of the host the event was recorded on.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|host.ip|IP of the host that records the event.|ip| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|host.ip|IP of the host that records the event.|ip| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|host.name|Name of the host the event was recorded on. It can contain same information as host.hostname or a name specified by the user.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|host.name|Name of the host the event was recorded on. It can contain same information as host.hostname or a name specified by the user.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|host.os.platform|The platform of the host the event was recorded on.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|host.os.platform|The platform of the host the event was recorded on.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|http.request.headers|The canonical headers of the monitored HTTP request.|object| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|http.request.method|The http method of the request leading to this event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|http.request.referrer|Referrer for this HTTP request.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|http.response.finished|Used by the Node agent to indicate when in the response life cycle an error has occurred.|boolean| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|http.response.headers|The canonical headers of the monitored HTTP response.|object| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|http.response.status_code|The status code of the HTTP response.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|http.version|The http version of the request leading to this event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|kubernetes.namespace|Kubernetes namespace|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|kubernetes.namespace|Kubernetes namespace|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|kubernetes.node.name|Kubernetes node name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|kubernetes.node.name|Kubernetes node name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|kubernetes.pod.name|Kubernetes pod name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|kubernetes.pod.name|Kubernetes pod name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|kubernetes.pod.uid|Kubernetes Pod UID|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|kubernetes.pod.uid|Kubernetes Pod UID|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|labels|A flat mapping of user-defined labels with string, boolean or number values.|object| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|labels|A flat mapping of user-defined labels with string, boolean or number values.|object| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|observer.hostname|Hostname of the APM Server.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|observer.hostname|Hostname of the APM Server.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|observer.listening|Address the server is listening on.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|observer.listening|Address the server is listening on.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|observer.type|The type will be set to `apm-server`.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|observer.type|The type will be set to `apm-server`.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|observer.version|APM Server version.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|observer.version|APM Server version.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|observer.version_major|Major version number of the observer|byte| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|observer.version_major|Major version number of the observer|byte| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|parent.id|The ID of the parent event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|parent.id|The ID of the parent event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|process.args|Process arguments. May be filtered to protect sensitive information.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|process.args|Process arguments. May be filtered to protect sensitive information.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|process.pid|Numeric process ID of the service process.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|process.pid|Numeric process ID of the service process.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|process.ppid|Numeric ID of the service's parent process.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|process.ppid|Numeric ID of the service's parent process.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|process.title|Service process title.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|process.title|Service process title.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|processor.event|Processor event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|processor.event|Processor event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|processor.name|Processor name.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|processor.name|Processor name.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.environment|Service environment.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.environment|Service environment.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.framework.name|Name of the framework used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.framework.name|Name of the framework used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.framework.version|Version of the framework used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.framework.version|Version of the framework used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.language.name|Name of the programming language used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.language.name|Name of the programming language used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.language.version|Version of the programming language used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.language.version|Version of the programming language used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.name|Immutable name of the service emitting this event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|service.name|Immutable name of the service emitting this event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|service.node.name|Unique meaningful name of the service node.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|service.node.name|Unique meaningful name of the service node.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|service.runtime.name|Name of the runtime used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.runtime.name|Name of the runtime used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.runtime.version|Version of the runtime used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.runtime.version|Version of the runtime used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.version|Version of the service emitting this event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|service.version|Version of the service emitting this event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|source.ip|IP address of the source of a recorded event. This is typically obtained from a request's X-Forwarded-For or the X-Real-IP header or falls back to a given configuration for remote address.|ip| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|source.ip|IP address of the source of a recorded event. This is typically obtained from a request's X-Forwarded-For or the X-Real-IP header or falls back to a given configuration for remote address.|ip| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|span.action|The specific kind of event within the sub-type represented by the span (e.g. query, connect)|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.db.link|Database link.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.db.rows_affected|Number of rows affected by the database statement.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.destination.service.name|Identifier for the destination service (e.g. 'http://elastic.co', 'elasticsearch', 'rabbitmq')|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.destination.service.resource|Identifier for the destination service resource being operated on (e.g. 'http://elastic.co:80', 'elasticsearch', 'rabbitmq/queue_name')|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.destination.service.type|Type of the destination service (e.g. 'db', 'elasticsearch'). Should typically be the same as span.type.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.duration.us|Duration of the span, in microseconds.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.id|The ID of the span stored as hex encoded string.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|span.message.age.ms|Age of a message in milliseconds.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.message.queue.name|Name of the message queue or topic where the message is published or received.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.name|Generic designation of a span in the scope of a transaction.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.self_time.count||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.self_time.count||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.self_time.sum.us||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.self_time.sum.us||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.start.us|Offset relative to the transaction's timestamp identifying the start of the span, in microseconds.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.subtype|A further sub-division of the type (e.g. postgresql, elasticsearch)|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.subtype|A further sub-division of the type (e.g. postgresql, elasticsearch)|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.sync|Indicates whether the span was executed synchronously or asynchronously.|boolean| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.type|Keyword of specific relevance in the service's domain (eg: 'db.postgresql.query', 'template.erb', 'cache', etc).|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.type|Keyword of specific relevance in the service's domain (eg: 'db.postgresql.query', 'template.erb', 'cache', etc).|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|timestamp.us|Timestamp of the event in microseconds since Unix epoch.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|timestamp.us|Timestamp of the event in microseconds since Unix epoch.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|trace.id|The ID of the trace to which the event belongs to.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|trace.id|The ID of the trace to which the event belongs to.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|transaction.breakdown.count||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.breakdown.count||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.duration.count||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.duration.count||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.duration.sum.us||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.duration.sum.us||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.duration.us|Total duration of this transaction, in microseconds.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.experience.cls|The Cumulative Layout Shift metric|scaled_float| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.experience.fid|The First Input Delay metric|scaled_float| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.experience.longtask.count|The total number of of longtasks|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.experience.longtask.max|The max longtask duration|scaled_float| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.experience.longtask.sum|The sum of longtask durations|scaled_float| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.experience.tbt|The Total Blocking Time metric|scaled_float| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.id|The transaction ID.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|transaction.id|The transaction ID.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|transaction.marks|A user-defined mapping of groups of marks in milliseconds.|object| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.marks.*.*||object| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.message.age.ms|Age of a message in milliseconds.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.message.queue.name|Name of the message queue or topic where the message is published or received.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.name|Generic designation of a transaction in the scope of a single service (eg. 'GET /users/:id').|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.name|Generic designation of a transaction in the scope of a single service (eg. 'GET /users/:id').|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.result|The result of the transaction. HTTP status code for HTTP-related transactions.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.sampled|Transactions that are 'sampled' will include all available information. Transactions that are not sampled will not have spans or context.|boolean| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.sampled|Transactions that are 'sampled' will include all available information. Transactions that are not sampled will not have spans or context.|boolean| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.self_time.count||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.self_time.count||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.self_time.sum.us||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.self_time.sum.us||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.span_count.dropped|The total amount of dropped spans for this transaction.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.type|Keyword of specific relevance in the service's domain (eg. 'request', 'backgroundjob', etc)|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.type|Keyword of specific relevance in the service's domain (eg. 'request', 'backgroundjob', etc)|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|url.domain|The hostname of the request, e.g. "example.com".|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|url.fragment|A fragment specifying a location in a web page , e.g. "top".|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|url.full|The full, possibly agent-assembled URL of the request, e.g https://example.com:443/search?q=elasticsearch#top.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|url.path|The path of the request, e.g. "/search".|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|url.port|The port of the request, e.g. 443.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|url.query|The query string of the request, e.g. "q=elasticsearch".|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|url.scheme|The protocol of the request, e.g. "https:".|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user.email|Email of the logged in user.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user.email|Email of the logged in user.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user.id|Identifier of the logged in user.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user.id|Identifier of the logged in user.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user.name|The username of the logged in user.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user.name|The username of the logged in user.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.device.name|Name of the device.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.device.name|Name of the device.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.name|Name of the user agent.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.name|Name of the user agent.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.original|Unparsed version of the user_agent.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.original|Unparsed version of the user_agent.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.family|OS family (such as redhat, debian, freebsd, windows).|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.family|OS family (such as redhat, debian, freebsd, windows).|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.full|Operating system name, including the version or code name.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.full|Operating system name, including the version or code name.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.kernel|Operating system kernel version as a raw string.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.kernel|Operating system kernel version as a raw string.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.name|Operating system name, without the version.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.name|Operating system name, without the version.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.platform|Operating system platform (such centos, ubuntu, windows).|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.platform|Operating system platform (such centos, ubuntu, windows).|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.version|Operating system version as a raw string.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.version|Operating system version as a raw string.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.version|Version of the user agent.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.version|Version of the user agent.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|view spans||keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | + + +#### Examples + +```json +{ + "@timestamp": "2017-05-30T18:53:42.281Z", + "agent": { + "name": "elastic-node", + "version": "3.14.0" + }, + "container": { + "id": "container-id" + }, + "ecs": { + "version": "1.6.0" + }, + "event": { + "ingested": "2020-08-11T09:55:04.391451Z", + "outcome": "unknown" + }, + "host": { + "architecture": "x64", + "ip": "127.0.0.1", + "os": { + "platform": "darwin" + } + }, + "kubernetes": { + "namespace": "namespace1", + "pod": { + "name": "pod-name", + "uid": "pod-uid" + } + }, + "observer": { + "ephemeral_id": "f78f6762-2157-4322-95aa-aecd2f486c1a", + "hostname": "ix.lan", + "id": "80b79979-4a7d-450d-b2ce-75c589f7fffd", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { + "args": [ + "node", + "server.js" + ], + "pid": 1234, + "ppid": 6789, + "title": "node" + }, + "processor": { + "event": "transaction", + "name": "transaction" + }, + "service": { + "environment": "staging", + "framework": { + "name": "Express", + "version": "1.2.3" + }, + "language": { + "name": "ecmascript", + "version": "8" + }, + "name": "1234_service-12a3", + "node": { + "name": "container-id" + }, + "runtime": { + "name": "node", + "version": "8.0.0" + }, + "version": "5.1.3" + }, + "timestamp": { + "us": 1496170422281000 + }, + "trace": { + "id": "85925e55b43f4340aaaaaaaaaaaaaaaa" + }, + "transaction": { + "duration": { + "us": 13980 + }, + "id": "85925e55b43f4340", + "name": "GET /api/types", + "result": "failure", + "sampled": true, + "span_count": { + "started": 0 + }, + "type": "request" + }, + "user": { + "email": "foo@bar.com", + "id": "123user", + "name": "foo" + } +} +``` + +```json +{ + "@timestamp": "2017-05-30T18:53:27.154Z", + "agent": { + "name": "elastic-node", + "version": "3.14.0" + }, + "ecs": { + "version": "1.6.0" + }, + "event": { + "outcome": "unknown" + }, + "labels": { + "span_tag": "something" + }, + "observer": { + "ephemeral_id": "c0cea3b6-97d7-4e15-9e35-c868e7a3c869", + "hostname": "ix.lan", + "id": "a49b4a08-689a-4724-8050-8bd0ae043281", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "parent": { + "id": "945254c567a5417e" + }, + "processor": { + "event": "span", + "name": "transaction" + }, + "service": { + "environment": "staging", + "name": "1234_service-12a3" + }, + "span": { + "action": "query", + "db": { + "instance": "customers", + "statement": "SELECT * FROM product_types WHERE user_id=?", + "type": "sql", + "user": { + "name": "readonly_user" + } + }, + "duration": { + "us": 3781 + }, + "http": { + "method": "GET", + "response": { + "status_code": 200 + }, + "url": { + "original": "http://localhost:8000" + } + }, + "id": "0aaaaaaaaaaaaaaa", + "name": "SELECT FROM product_types", + "stacktrace": [ + { + "abs_path": "net.js", + "context": { + "post": [ + " ins.currentTransaction = prev", + " return result", + "}" + ], + "pre": [ + " var trans = this.currentTransaction", + "" + ] + }, + "exclude_from_grouping": false, + "filename": "net.js", + "function": "onread", + "library_frame": true, + "line": { + "column": 4, + "context": "line3", + "number": 547 + }, + "module": "some module", + "vars": { + "key": "value" + } + }, + { + "exclude_from_grouping": false, + "filename": "my2file.js", + "line": { + "number": 10 + } + } + ], + "start": { + "us": 2830 + }, + "subtype": "postgresql", + "sync": false, + "type": "db" + }, + "timestamp": { + "us": 1496170407154000 + }, + "trace": { + "id": "945254c567a5417eaaaaaaaaaaaaaaaa" + }, + "transaction": { + "id": "945254c567a5417e" + } +} +``` + + +### Metrics + +Metrics include application-based metrics and some basic system metrics. +Metrics are written to `metrics-apm.*`, `metrics-apm.internal.*` and `metrics-apm.profiling.*` indices. + +**Exported Fields** + +| Field | Description | Type | ECS | +|---|---|---|:---:| +|@timestamp|Event timestamp.|date| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|data_stream.type|Data stream type.|constant_keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|data_stream.dataset|Data stream dataset.|constant_keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|data_stream.namespace|Data stream namespace.|constant_keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|agent.ephemeral_id|The Ephemeral ID identifies a running process.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|agent.ephemeral_id|The Ephemeral ID identifies a running process.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|agent.name|Name of the agent used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|agent.name|Name of the agent used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|agent.version|Version of the agent used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|agent.version|Version of the agent used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|client.ip|IP address of the client of a recorded event. This is typically obtained from a request's X-Forwarded-For or the X-Real-IP header or falls back to a given configuration for remote address.|ip| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|client.ip|IP address of the client of a recorded event. This is typically obtained from a request's X-Forwarded-For or the X-Real-IP header or falls back to a given configuration for remote address.|ip| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.account.id|Cloud account ID|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.account.id|Cloud account ID|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.account.name|Cloud account name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.account.name|Cloud account name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.availability_zone|Cloud availability zone name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.availability_zone|Cloud availability zone name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.instance.id|Cloud instance/machine ID|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.instance.id|Cloud instance/machine ID|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.instance.name|Cloud instance/machine name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.instance.name|Cloud instance/machine name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.machine.type|Cloud instance/machine type|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.machine.type|Cloud instance/machine type|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.project.id|Cloud project ID|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.project.id|Cloud project ID|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.project.name|Cloud project name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.project.name|Cloud project name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.provider|Cloud provider name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.provider|Cloud provider name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.region|Cloud region name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.region|Cloud region name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|container.id|Unique container id.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|container.id|Unique container id.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|destination.address|Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. Then it should be duplicated to `.ip` or `.domain`, depending on which one it is.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|destination.address|Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. Then it should be duplicated to `.ip` or `.domain`, depending on which one it is.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|destination.ip|IP addess of the destination. Can be one of multiple IPv4 or IPv6 addresses.|ip| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|destination.ip|IP addess of the destination. Can be one of multiple IPv4 or IPv6 addresses.|ip| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|destination.port|Port of the destination.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|destination.port|Port of the destination.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|event.outcome|`event.outcome` simply denotes whether the event represents a success or a failure from the perspective of the entity that produced the event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|experimental|Additional experimental data sent by the agents.|object| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|experimental|Additional experimental data sent by the agents.|object| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|host.architecture|The architecture of the host the event was recorded on.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|host.architecture|The architecture of the host the event was recorded on.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|host.hostname|The hostname of the host the event was recorded on.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|host.hostname|The hostname of the host the event was recorded on.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|host.ip|IP of the host that records the event.|ip| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|host.ip|IP of the host that records the event.|ip| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|host.name|Name of the host the event was recorded on. It can contain same information as host.hostname or a name specified by the user.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|host.name|Name of the host the event was recorded on. It can contain same information as host.hostname or a name specified by the user.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|host.os.platform|The platform of the host the event was recorded on.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|host.os.platform|The platform of the host the event was recorded on.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|kubernetes.namespace|Kubernetes namespace|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|kubernetes.namespace|Kubernetes namespace|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|kubernetes.node.name|Kubernetes node name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|kubernetes.node.name|Kubernetes node name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|kubernetes.pod.name|Kubernetes pod name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|kubernetes.pod.name|Kubernetes pod name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|kubernetes.pod.uid|Kubernetes Pod UID|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|kubernetes.pod.uid|Kubernetes Pod UID|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|labels|A flat mapping of user-defined labels with string, boolean or number values.|object| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|labels|A flat mapping of user-defined labels with string, boolean or number values.|object| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|metricset.period||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|observer.hostname|Hostname of the APM Server.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|observer.hostname|Hostname of the APM Server.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|observer.listening|Address the server is listening on.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|observer.listening|Address the server is listening on.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|observer.type|The type will be set to `apm-server`.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|observer.type|The type will be set to `apm-server`.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|observer.version|APM Server version.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|observer.version|APM Server version.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|observer.version_major|Major version number of the observer|byte| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|observer.version_major|Major version number of the observer|byte| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|process.args|Process arguments. May be filtered to protect sensitive information.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|process.args|Process arguments. May be filtered to protect sensitive information.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|process.pid|Numeric process ID of the service process.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|process.pid|Numeric process ID of the service process.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|process.ppid|Numeric ID of the service's parent process.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|process.ppid|Numeric ID of the service's parent process.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|process.title|Service process title.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|process.title|Service process title.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|processor.event|Processor event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|processor.event|Processor event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|processor.name|Processor name.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|processor.name|Processor name.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|profile.alloc_objects.count|Number of objects allocated since the process started.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|profile.alloc_space.bytes|Amount of memory allocated, in bytes, since the process started.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|profile.cpu.ns|Amount of CPU time profiled, in nanoseconds.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|profile.duration|Duration of the profile, in microseconds. All samples within a profile will have the same duration. To aggregate durations, you should first group by the profile ID.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|profile.id|Unique ID for the profile. All samples within a profile will have the same profile ID.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|profile.inuse_objects.count|Number of objects allocated and currently in use.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|profile.inuse_space.bytes|Amount of memory allocated, in bytes, and currently in use.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|profile.samples.count|Number of profile samples for the profiling period.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|profile.stack.filename|Source code filename for a stack frame.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|profile.stack.function|Function name for a stack frame.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|profile.stack.id|Unique ID for a stack frame in the context of its callers.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|profile.stack.line|Source code line number for a stack frame.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|profile.top.filename|Source code filename for the top stack frame.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|profile.top.function|Function name for the top stack frame.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|profile.top.id|Unique ID for the top stack frame in the context of its callers.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|profile.top.line|Source code line number for the top stack frame.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.environment|Service environment.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.environment|Service environment.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.framework.name|Name of the framework used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.framework.name|Name of the framework used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.framework.version|Version of the framework used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.framework.version|Version of the framework used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.language.name|Name of the programming language used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.language.name|Name of the programming language used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.language.version|Version of the programming language used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.language.version|Version of the programming language used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.name|Immutable name of the service emitting this event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|service.name|Immutable name of the service emitting this event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|service.node.name|Unique meaningful name of the service node.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|service.node.name|Unique meaningful name of the service node.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|service.runtime.name|Name of the runtime used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.runtime.name|Name of the runtime used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.runtime.version|Version of the runtime used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.runtime.version|Version of the runtime used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.version|Version of the service emitting this event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|service.version|Version of the service emitting this event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|source.ip|IP address of the source of a recorded event. This is typically obtained from a request's X-Forwarded-For or the X-Real-IP header or falls back to a given configuration for remote address.|ip| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|source.ip|IP address of the source of a recorded event. This is typically obtained from a request's X-Forwarded-For or the X-Real-IP header or falls back to a given configuration for remote address.|ip| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|span.destination.service.response_time.count||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.destination.service.response_time.sum.us||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.self_time.count||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.self_time.sum.us||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.subtype|A further sub-division of the type (e.g. postgresql, elasticsearch)|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|span.type|Keyword of specific relevance in the service's domain (eg: 'db.postgresql.query', 'template.erb', 'cache', etc).|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|system.cpu.total.norm.pct|The percentage of CPU time spent by the process since the last event. This value is normalized by the number of CPU cores and it ranges from 0 to 100%.|scaled_float| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|system.memory.actual.free|Actual free memory in bytes. It is calculated based on the OS. On Linux it consists of the free memory plus caches and buffers. On OSX it is a sum of free memory and the inactive memory. On Windows, it is equal to `system.memory.free`.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|system.memory.total|Total memory.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|system.process.cgroup.memory.mem.limit.bytes|Memory limit for the current cgroup slice.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|system.process.cgroup.memory.mem.usage.bytes|Memory usage by the current cgroup slice.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|system.process.cpu.total.norm.pct|The percentage of CPU time spent by the process since the last event. This value is normalized by the number of CPU cores and it ranges from 0 to 100%.|scaled_float| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|system.process.memory.rss.bytes|The Resident Set Size. The amount of memory the process occupied in main memory (RAM).|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|system.process.memory.size|The total virtual memory the process has.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|timestamp.us|Timestamp of the event in microseconds since Unix epoch.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|timestamp.us|Timestamp of the event in microseconds since Unix epoch.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.breakdown.count||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.duration.count||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.duration.histogram|Pre-aggregated histogram of transaction durations.|histogram| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.duration.sum.us||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.id|The transaction ID.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|transaction.name|Generic designation of a transaction in the scope of a single service (eg. 'GET /users/:id').|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.root|Identifies metrics for root transactions. This can be used for calculating metrics for traces.|boolean| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.sampled|Transactions that are 'sampled' will include all available information. Transactions that are not sampled will not have spans or context.|boolean| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.self_time.count||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.self_time.sum.us||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.type|Keyword of specific relevance in the service's domain (eg. 'request', 'backgroundjob', etc)|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|user.email|Email of the logged in user.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user.email|Email of the logged in user.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user.id|Identifier of the logged in user.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user.id|Identifier of the logged in user.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user.name|The username of the logged in user.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user.name|The username of the logged in user.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.device.name|Name of the device.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.device.name|Name of the device.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.name|Name of the user agent.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.name|Name of the user agent.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.original|Unparsed version of the user_agent.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.original|Unparsed version of the user_agent.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.family|OS family (such as redhat, debian, freebsd, windows).|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.family|OS family (such as redhat, debian, freebsd, windows).|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.full|Operating system name, including the version or code name.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.full|Operating system name, including the version or code name.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.kernel|Operating system kernel version as a raw string.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.kernel|Operating system kernel version as a raw string.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.name|Operating system name, without the version.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.name|Operating system name, without the version.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.platform|Operating system platform (such centos, ubuntu, windows).|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.platform|Operating system platform (such centos, ubuntu, windows).|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.version|Operating system version as a raw string.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.version|Operating system version as a raw string.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.version|Version of the user agent.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.version|Version of the user agent.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | + + +#### Example + +```json +{ + "@timestamp": "2017-05-30T18:53:41.364Z", + "agent": { + "name": "elastic-node", + "version": "3.14.0" + }, + "ecs": { + "version": "1.6.0" + }, + "event": { + "ingested": "2020-04-22T14:55:05.425020Z" + }, + "go": { + "memstats": { + "heap": { + "sys": { + "bytes": 6520832 + } + } + } + }, + "host": { + "ip": "127.0.0.1" + }, + "labels": { + "tag1": "one", + "tag2": 2 + }, + "observer": { + "ephemeral_id": "8785cbe1-7f89-4279-84c2-6c33979531fb", + "hostname": "ix.lan", + "id": "b0cfe4b7-76c9-4159-95ff-e558db368cbe", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { + "pid": 1234 + }, + "processor": { + "event": "metric", + "name": "metric" + }, + "service": { + "language": { + "name": "ecmascript" + }, + "name": "1234_service-12a3", + "node": { + "name": "node-1" + } + }, + "user": { + "email": "user@mail.com", + "id": "axb123hg", + "name": "logged-in-user" + } +} +``` + +### Logs + +Logs are application log and error events. +Logs are written to `logs-apm.*` and `logs-apm.error.*` indices. + +**Exported Fields** + +| Field | Description | Type | ECS | +|---|---|---|:---:| +|@timestamp|Event timestamp.|date| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|data_stream.type|Data stream type.|constant_keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|data_stream.dataset|Data stream dataset.|constant_keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|data_stream.namespace|Data stream namespace.|constant_keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|agent.ephemeral_id|The Ephemeral ID identifies a running process.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|agent.name|Name of the agent used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|agent.version|Version of the agent used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|client.ip|IP address of the client of a recorded event. This is typically obtained from a request's X-Forwarded-For or the X-Real-IP header or falls back to a given configuration for remote address.|ip| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.account.id|Cloud account ID|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.account.name|Cloud account name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.availability_zone|Cloud availability zone name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.instance.id|Cloud instance/machine ID|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.instance.name|Cloud instance/machine name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.machine.type|Cloud instance/machine type|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.project.id|Cloud project ID|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.project.name|Cloud project name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.provider|Cloud provider name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|cloud.region|Cloud region name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|container.id|Unique container id.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|destination.address|Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. Then it should be duplicated to `.ip` or `.domain`, depending on which one it is.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|destination.ip|IP addess of the destination. Can be one of multiple IPv4 or IPv6 addresses.|ip| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|destination.port|Port of the destination.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|error.culprit|Function call which was the primary perpetrator of this event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|error.exception.code|The error code set when the error happened, e.g. database error code.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|error.exception.handled|Indicator whether the error was caught somewhere in the code or not.|boolean| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|error.exception.message|The original error message.|text| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|error.exception.module|The module namespace of the original error.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|error.exception.type||keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|error.grouping_key|GroupingKey of the logged error for use in grouping.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|error.id|The ID of the error.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|error.log.level|The severity of the record.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|error.log.logger_name|The name of the logger instance used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|error.log.message|The additionally logged error message.|text| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|error.log.param_message|A parametrized message. E.g. 'Could not connect to %s'. The property message is still required, and should be equal to the param_message, but with placeholders replaced. In some situations the param_message is used to group errors together.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|experimental|Additional experimental data sent by the agents.|object| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|host.architecture|The architecture of the host the event was recorded on.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|host.hostname|The hostname of the host the event was recorded on.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|host.ip|IP of the host that records the event.|ip| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|host.name|Name of the host the event was recorded on. It can contain same information as host.hostname or a name specified by the user.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|host.os.platform|The platform of the host the event was recorded on.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|http.request.headers|The canonical headers of the monitored HTTP request.|object| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|http.request.method|The http method of the request leading to this event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|http.request.referrer|Referrer for this HTTP request.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|http.response.finished|Used by the Node agent to indicate when in the response life cycle an error has occurred.|boolean| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|http.response.headers|The canonical headers of the monitored HTTP response.|object| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|http.response.status_code|The status code of the HTTP response.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|http.version|The http version of the request leading to this event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|kubernetes.namespace|Kubernetes namespace|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|kubernetes.node.name|Kubernetes node name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|kubernetes.pod.name|Kubernetes pod name|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|kubernetes.pod.uid|Kubernetes Pod UID|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|labels|A flat mapping of user-defined labels with string, boolean or number values.|object| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|observer.hostname|Hostname of the APM Server.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|observer.listening|Address the server is listening on.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|observer.type|The type will be set to `apm-server`.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|observer.version|APM Server version.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|observer.version_major|Major version number of the observer|byte| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|parent.id|The ID of the parent event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|process.args|Process arguments. May be filtered to protect sensitive information.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|process.pid|Numeric process ID of the service process.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|process.ppid|Numeric ID of the service's parent process.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|process.title|Service process title.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|processor.event|Processor event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|processor.name|Processor name.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.environment|Service environment.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.framework.name|Name of the framework used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.framework.version|Version of the framework used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.language.name|Name of the programming language used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.language.version|Version of the programming language used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.name|Immutable name of the service emitting this event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|service.node.name|Unique meaningful name of the service node.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|service.runtime.name|Name of the runtime used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.runtime.version|Version of the runtime used.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|service.version|Version of the service emitting this event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|source.ip|IP address of the source of a recorded event. This is typically obtained from a request's X-Forwarded-For or the X-Real-IP header or falls back to a given configuration for remote address.|ip| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|timestamp.us|Timestamp of the event in microseconds since Unix epoch.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|trace.id|The ID of the trace to which the event belongs to.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|transaction.breakdown.count||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.duration.count||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.duration.sum.us||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.id|The transaction ID.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|transaction.name|Generic designation of a transaction in the scope of a single service (eg. 'GET /users/:id').|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.sampled|Transactions that are 'sampled' will include all available information. Transactions that are not sampled will not have spans or context.|boolean| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.self_time.count||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.self_time.sum.us||long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|transaction.type|Keyword of specific relevance in the service's domain (eg. 'request', 'backgroundjob', etc)|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|url.domain|The hostname of the request, e.g. "example.com".|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|url.fragment|A fragment specifying a location in a web page , e.g. "top".|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|url.full|The full, possibly agent-assembled URL of the request, e.g https://example.com:443/search?q=elasticsearch#top.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|url.path|The path of the request, e.g. "/search".|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|url.port|The port of the request, e.g. 443.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|url.query|The query string of the request, e.g. "q=elasticsearch".|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|url.scheme|The protocol of the request, e.g. "https:".|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user.email|Email of the logged in user.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user.id|Identifier of the logged in user.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user.name|The username of the logged in user.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.device.name|Name of the device.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.name|Name of the user agent.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.original|Unparsed version of the user_agent.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.family|OS family (such as redhat, debian, freebsd, windows).|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.full|Operating system name, including the version or code name.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.kernel|Operating system kernel version as a raw string.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.name|Operating system name, without the version.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.platform|Operating system platform (such centos, ubuntu, windows).|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.os.version|Operating system version as a raw string.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | +|user_agent.version|Version of the user agent.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | + + +#### Example + +```json +{ + "@timestamp": "2017-05-09T15:04:05.999Z", + "agent": { + "name": "elastic-node", + "version": "3.14.0" + }, + "container": { + "id": "container-id" + }, + "ecs": { + "version": "1.6.0" + }, + "error": { + "grouping_key": "d6b3f958dfea98dc9ed2b57d5f0c48bb", + "id": "0f0e9d67c1854d21a6f44673ed561ec8", + "log": { + "level": "custom log level", + "message": "Cannot read property 'baz' of undefined" + } + }, + "event": { + "ingested": "2020-04-22T14:52:08.436124Z" + }, + "host": { + "architecture": "x64", + "ip": "127.0.0.1", + "os": { + "platform": "darwin" + } + }, + "kubernetes": { + "namespace": "namespace1", + "pod": { + "name": "pod-name", + "uid": "pod-uid" + } + }, + "labels": { + "tag1": "one", + "tag2": 2 + }, + "observer": { + "ephemeral_id": "f1838cde-80dd-4af5-b7ac-ffc2d3fccc9d", + "hostname": "ix.lan", + "id": "5d4dc8fe-cb14-47ee-b720-d6bf49f87ef0", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { + "args": [ + "node", + "server.js" + ], + "pid": 1234, + "ppid": 7788, + "title": "node" + }, + "processor": { + "event": "error", + "name": "error" + }, + "service": { + "environment": "staging", + "framework": { + "name": "Express", + "version": "1.2.3" + }, + "language": { + "name": "ecmascript", + "version": "8" + }, + "name": "1234_service-12a3", + "node": { + "name": "myservice-node" + }, + "runtime": { + "name": "node", + "version": "8.0.0" + }, + "version": "5.1.3" + }, + "timestamp": { + "us": 1494342245999000 + } +} +``` diff --git a/apmpackage/apm/0.1.0/manifest.yml b/apmpackage/apm/0.1.0/manifest.yml new file mode 100644 index 0000000000..774aec5d4b --- /dev/null +++ b/apmpackage/apm/0.1.0/manifest.yml @@ -0,0 +1,30 @@ +format_version: 1.0.0 +name: apm +title: Elastic APM +version: 0.1.0 +license: basic +description: Ingest APM data +type: solution # integration / solution +categories: + - monitoring # TODO do we need a new category? +release: experimental # experimental / beta / ga +conditions: + kibana.version: '^7.11.0' +policy_templates: +- name: apmserver + title: Elastic APM Integration + description: Elastic APM Integration + inputs: + - type: apm + title: Collect application traces + description: Collect application traces + vars: + - name: enable_rum + type: bool + title: Enable RUM + required: true + show_user: true + default: false + template_path: template.yml.hbs +owner: + github: elastic/apm-server diff --git a/apmpackage/cmd/gen-package/field.go b/apmpackage/cmd/gen-package/field.go new file mode 100644 index 0000000000..bde7617acd --- /dev/null +++ b/apmpackage/cmd/gen-package/field.go @@ -0,0 +1,56 @@ +// 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. + +package main + +type field struct { + Name string `yaml:"name,omitempty"` + Key string `yaml:"key,omitempty"` + Title string `yaml:"title,omitempty"` + Group *int `yaml:"group,omitempty"` + Level string `yaml:"level,omitempty"` + Required *bool `yaml:"required,omitempty"` + Type string `yaml:"type,omitempty"` + Format string `yaml:"format,omitempty"` + Description string `yaml:"description,omitempty"` + Release string `yaml:"release,omitempty"` + Alias string `yaml:"alias,omitempty"` + Path string `yaml:"path,omitempty"` + Footnote string `yaml:"footnote,omitempty"` + IgnoreAbove *int `yaml:"ignore_above,omitempty"` + MultiFields []multiFieldDefinition `yaml:"multi_fields,omitempty"` + Fields []field `yaml:"fields,omitempty"` + IsECS bool `yaml:"-"` + HasECS bool `yaml:"-"` + HasNonECS bool `yaml:"-"` +} + +func (f field) isNonECSLeaf() bool { + return f.Type != "group" && !f.IsECS +} + +type multiFieldDefinition struct { + Name string `yaml:"name,omitempty"` + Type string `yaml:"type,omitempty"` + Norms *bool `yaml:"norms,omitempty"` + DefaultField *bool `yaml:"default_field,omitempty"` +} + +func copyFieldRoot(f field) field { + f.Fields = nil + return f +} diff --git a/apmpackage/cmd/gen-package/gendocs.go b/apmpackage/cmd/gen-package/gendocs.go new file mode 100644 index 0000000000..e6dbc8fe56 --- /dev/null +++ b/apmpackage/cmd/gen-package/gendocs.go @@ -0,0 +1,119 @@ +// 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. + +package main + +import ( + "encoding/json" + "io/ioutil" + "os" + "path" + "sort" + "strings" + "text/template" +) + +func generateDocs(inputFields map[string][]field, version string) { + data := docsData{ + Traces: prepareFields(inputFields, version, "traces"), + Metrics: prepareFields(inputFields, version, "metrics"), + Logs: prepareFields(inputFields, version, "logs"), + TransactionExample: loadExample("transactions.json"), + SpanExample: loadExample("spans.json"), + MetricsExample: loadExample("metricsets.json"), + ErrorExample: loadExample("errors.json"), + } + t := template.New(docsTemplateFilePath) + tmpl, err := t.Funcs(map[string]interface{}{ + "Trim": strings.TrimSpace, + }).ParseFiles(docsTemplateFilePath) + if err != nil { + panic(err) + } + path := docsFilePath(version) + file, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644) + if err != nil { + panic(err) + } + defer file.Close() + err = tmpl.ExecuteTemplate(file, "README.template.md", data) + if err != nil { + panic(err) + } +} + +type docsData struct { + Traces []field + Metrics []field + Logs []field + TransactionExample string + SpanExample string + MetricsExample string + ErrorExample string +} + +func prepareFields(inputFields map[string][]field, version, streamType string) []field { + extend := func(fs []field) []field { + var baseFields []field + for _, f := range loadFieldsFile(baseFieldsFilePath(version, streamType)) { + f.IsECS = true + baseFields = append(baseFields, f) + } + fs = append(baseFields, fs...) + return fs + } + return extend(order(flatten("", inputFields[streamType]))) +} + +func order(fs []field) []field { + sort.Slice(fs, func(i, j int) bool { + return fs[i].Name < fs[j].Name + }) + return fs +} + +func flatten(name string, fs []field) []field { + var ret []field + for _, f := range fs { + if name != "" { + f.Name = name + "." + f.Name + } + if f.Type == "group" { + ret = append(ret, flatten(f.Name, f.Fields)...) + } else { + ret = append(ret, f) + } + } + return ret +} + +func loadExample(file string) string { + in, err := ioutil.ReadFile(path.Join("docs/data/elasticsearch/generated/", file)) + if err != nil { + panic(err) + } + var aux []map[string]interface{} + err = json.Unmarshal(in, &aux) + if err != nil { + panic(err) + } + out, err := json.MarshalIndent(aux[0], "", " ") + if err != nil { + panic(err) + } + return string(out) +} diff --git a/apmpackage/cmd/gen-package/genfields.go b/apmpackage/cmd/gen-package/genfields.go new file mode 100644 index 0000000000..a55d5f7193 --- /dev/null +++ b/apmpackage/cmd/gen-package/genfields.go @@ -0,0 +1,165 @@ +// 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. + +package main + +import ( + "io/ioutil" + "net/http" + "path/filepath" + + "gopkg.in/yaml.v2" + + "github.com/elastic/ecs/code/go/ecs" +) + +func generateFields(version string) map[string][]field { + + ecsFlatFields := loadECSFields() + + inputFieldsFiles := map[string][]field{ + "logs": concatFields("model/error/_meta/fields.yml"), + "metrics": concatFields("model/metricset/_meta/fields.yml", "model/profile/_meta/fields.yml", "x-pack/apm-server/fields/_meta/fields.yml"), + "traces": concatFields("model/transaction/_meta/fields.yml", "model/span/_meta/fields.yml"), + } + + for streamType, inputFields := range inputFieldsFiles { + var ecsFields []field + var nonECSFields []field + for _, fields := range populateECSInfo(ecsFlatFields, inputFields) { + ecs, nonECS := splitECSFields(fields) + if len(ecs.Fields) > 0 || ecs.IsECS { + ecsFields = append(ecsFields, ecs) + } + if len(nonECS.Fields) > 0 || ecs.isNonECSLeaf() { + nonECSFields = append(nonECSFields, nonECS) + } + } + var writeOutFields = func(fName string, data []field) { + bytes, err := yaml.Marshal(&data) + if err != nil { + panic(err) + } + err = ioutil.WriteFile(filepath.Join(fieldsPath(version, streamType), fName), bytes, 0644) + if err != nil { + panic(err) + } + } + if len(ecsFields) > 0 { + writeOutFields("ecs.yml", ecsFields) + } + if len(nonECSFields) > 0 { + writeOutFields("fields.yml", nonECSFields) + } + } + return inputFieldsFiles +} + +func populateECSInfo(ecsFlatFields map[string]interface{}, inputFields []field) []field { + var traverse func(string, []field) ([]field, bool, bool) + traverse = func(fName string, fs []field) ([]field, bool, bool) { + var ecsCount int + for idx, field := range fs { + fieldName := field.Name + if fName != "" { + fieldName = fName + "." + fieldName + } + if field.Type != "group" { + _, ok := ecsFlatFields[fieldName] + fs[idx].IsECS = ok + if ok { + ecsCount = ecsCount + 1 + } + } else { + fs[idx].Fields, fs[idx].HasECS, fs[idx].HasNonECS = traverse(fieldName, field.Fields) + } + } + // first boolean returned indicates whether there is at least an ECS field in the group + // second boolean returned indicates whether there is at least a non-ECS field in the group + return fs, ecsCount > 0, ecsCount < len(fs) + } + ret, _, _ := traverse("", inputFields) + return ret +} + +func splitECSFields(parent field) (field, field) { + ecsCopy := copyFieldRoot(parent) + nonECSCopy := copyFieldRoot(parent) + for _, field := range parent.Fields { + ecsChild, nonECSChild := splitECSFields(field) + if ecsChild.HasECS || ecsChild.IsECS { + ecsCopy.Fields = append(ecsCopy.Fields, ecsChild) + } + if nonECSChild.HasNonECS || nonECSChild.isNonECSLeaf() { + nonECSCopy.Fields = append(nonECSCopy.Fields, nonECSChild) + } + } + return ecsCopy, nonECSCopy +} + +func loadECSFields() map[string]interface{} { + url := "https://raw.githubusercontent.com/elastic/ecs/v" + ecs.Version + "/generated/ecs/ecs_flat.yml" + // TODO cache this to avoid fetching each time + resp, err := http.Get(url) + if err != nil { + panic(err) + } + defer resp.Body.Close() + var ret map[string]interface{} + err = yaml.NewDecoder(resp.Body).Decode(&ret) + if err != nil { + panic(err) + } + return ret +} + +func concatFields(fileNames ...string) []field { + var ret []field + for _, fname := range fileNames { + fs := loadFieldsFile(fname) + for _, key := range fs { + ret = append(ret, key.Fields...) + } + } + return ret +} + +func loadFieldsFile(path string) []field { + fields, err := ioutil.ReadFile(path) + if err != nil { + panic(err) + } + + var fs []field + err = yaml.Unmarshal(fields, &fs) + if err != nil { + panic(err) + } + return overrideFieldValues(fs) +} + +func overrideFieldValues(fs []field) []field { + var ret []field + for _, f := range fs { + if f.Type == "" { + f.Type = "keyword" + } + f.Fields = overrideFieldValues(f.Fields) + ret = append(ret, f) + } + return ret +} diff --git a/apmpackage/cmd/gen-package/main.go b/apmpackage/cmd/gen-package/main.go new file mode 100644 index 0000000000..cedadf4e36 --- /dev/null +++ b/apmpackage/cmd/gen-package/main.go @@ -0,0 +1,62 @@ +// 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. + +package main + +import ( + "errors" + "fmt" + "github.com/elastic/apm-server/cmd" + "github.com/elastic/beats/v7/libbeat/common" + "io/ioutil" + "log" + "os" +) + +var versionMapping = map[string]string{ + "7.11": "0.1.0", + "8.0": "0.1.0", +} + +func main() { + stackVersion := common.MustNewVersion(cmd.DefaultSettings().Version) + shortVersion := fmt.Sprintf("%d.%d", stackVersion.Major, stackVersion.Minor) + packageVersion, ok := versionMapping[shortVersion] + if !ok { + panic(errors.New("package can't be generated for current apm-server version")) + } + clear(packageVersion) + inputFields := generateFields(packageVersion) + generateDocs(inputFields, packageVersion) + log.Printf("Package fields and docs generated for version %s (stack %s)", packageVersion, stackVersion.String()) +} + +func clear(version string) { + fileInfo, err := ioutil.ReadDir(dataStreamPath(version)) + if err != nil { + log.Printf("NOTE: if you are adding a new package version, you must create the folder"+ + " `apmpackage/apm/%s/` and copy all the contents from the previous version.", version) + panic(err) + } + for _, f := range fileInfo { + if f.IsDir() { + os.Remove(ecsFilePath(version, f.Name())) + os.Remove(fieldsFilePath(version, f.Name())) + } + } + ioutil.WriteFile(docsFilePath(version), nil, 0644) +} diff --git a/apmpackage/cmd/gen-package/paths.go b/apmpackage/cmd/gen-package/paths.go new file mode 100644 index 0000000000..73c01e9065 --- /dev/null +++ b/apmpackage/cmd/gen-package/paths.go @@ -0,0 +1,46 @@ +// 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. + +package main + +import "path/filepath" + +var docsTemplateFilePath = "apmpackage/docs/README.template.md" + +func docsFilePath(version string) string { + return filepath.Join("apmpackage/apm/", version, "/docs/README.md") +} + +func dataStreamPath(version string) string { + return filepath.Join("apmpackage/apm/", version, "/data_stream/") +} + +func fieldsPath(version, dataStream string) string { + return filepath.Join(dataStreamPath(version), dataStream, "fields/") +} + +func ecsFilePath(version, dataStream string) string { + return filepath.Join(fieldsPath(version, dataStream), "ecs.yml") +} + +func fieldsFilePath(version, dataStream string) string { + return filepath.Join(fieldsPath(version, dataStream), "fields.yml") +} + +func baseFieldsFilePath(version, dataStream string) string { + return filepath.Join(fieldsPath(version, dataStream), "base-fields.yml") +} diff --git a/apmpackage/docs/README.template.md b/apmpackage/docs/README.template.md new file mode 100644 index 0000000000..d66347cdb1 --- /dev/null +++ b/apmpackage/docs/README.template.md @@ -0,0 +1,89 @@ +# APM Integration + +The APM integration installs templates and pipelines for APM data. +If a policy contains an `apm` input, any Elastic Agent(s) set up with that policy will run an APM Server binary, and bind to `localhost:8200`. +You must configure your APM Agents to communicate with that APM Server. + +If you have RUM enabled, you must run APM Server centrally. Otherwise, you can run it at the edge machines. +To do so, download and enroll an Elastic Agent in the same machines where your instrumented services run. + + +### Compatibility and limitations + +The APM integration requires Kibana 7.11 and Elasticsearch with basic license. +This version is experimental and has some limitations, listed bellow: + +- Elastic Cloud is not supported. +- Standalone mode is not supported. +- If you need to customize settings for APM Server, you need to update the agent policy manually. +Look for `apm-server` in the `apm` input. +- It is not possible to change APM Server settings dynamically. +You must update the policy with any changes you need and stop the APM Server process. + + +### Configuration parameters + +- `RUM`: Enables support for RUM monitoring. See the [documentation](https://www.elastic.co/guide/en/apm/server/current/configuration-rum.html) for details. + + +### Traces + +Traces are comprised of [spans and transactions](https://www.elastic.co/guide/en/apm/get-started/current/apm-data-model.html). +Traces are written to `traces-apm.*` indices. + +**Exported Fields** + +| Field | Description | Type | ECS | +|---|---|---|:---:| +{{range .Traces -}} +| {{- Trim .Name -}} | {{- Trim .Description -}} | {{- Trim .Type -}} | {{if .IsECS}} ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) {{else}} ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) {{end}} | +{{end}} + +#### Examples + +```json +{{.TransactionExample}} +``` + +```json +{{.SpanExample}} +``` + + +### Metrics + +Metrics include application-based metrics and some basic system metrics. +Metrics are written to `metrics-apm.*`, `metrics-apm.internal.*` and `metrics-apm.profiling.*` indices. + +**Exported Fields** + +| Field | Description | Type | ECS | +|---|---|---|:---:| +{{range .Metrics -}} +| {{- Trim .Name -}} | {{- Trim .Description -}} | {{- Trim .Type -}} | {{if .IsECS}} ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) {{else}} ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) {{end}} | +{{end}} + +#### Example + +```json +{{.MetricsExample}} +``` + +### Logs + +Logs are application log and error events. +Logs are written to `logs-apm.*` and `logs-apm.error.*` indices. + +**Exported Fields** + +| Field | Description | Type | ECS | +|---|---|---|:---:| +{{range .Logs -}} +| {{- Trim .Name -}} | {{- Trim .Description -}} | {{- Trim .Type -}} | {{if .IsECS}} ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) {{else}} ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) {{end}} | +{{end}} + +#### Example + +```json +{{.ErrorExample}} +``` diff --git a/docs/fields.asciidoc b/docs/fields.asciidoc index 18927bd334..5ba7b0da0c 100644 --- a/docs/fields.asciidoc +++ b/docs/fields.asciidoc @@ -682,8 +682,7 @@ Information pertaining to the running process where the data was collected *`process.args`*:: + -- -Process arguments. -May be filtered to protect sensitive information. +Process arguments. May be filtered to protect sensitive information. type: keyword @@ -858,8 +857,7 @@ Destination fields are usually populated in conjunction with source fields. *`destination.address`*:: + -- -Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. -Then it should be duplicated to `.ip` or `.domain`, depending on which one it is. +Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. Then it should be duplicated to `.ip` or `.domain`, depending on which one it is. type: keyword @@ -870,8 +868,7 @@ type: keyword *`destination.ip`*:: + -- -IP addess of the destination. -Can be one of multiple IPv4 or IPv6 addresses. +IP addess of the destination. Can be one of multiple IPv4 or IPv6 addresses. type: ip @@ -1688,8 +1685,7 @@ Information pertaining to the running process where the data was collected *`process.args`*:: + -- -Process arguments. -May be filtered to protect sensitive information. +Process arguments. May be filtered to protect sensitive information. type: keyword @@ -1864,8 +1860,7 @@ Destination fields are usually populated in conjunction with source fields. *`destination.address`*:: + -- -Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. -Then it should be duplicated to `.ip` or `.domain`, depending on which one it is. +Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. Then it should be duplicated to `.ip` or `.domain`, depending on which one it is. type: keyword @@ -1876,8 +1871,7 @@ type: keyword *`destination.ip`*:: + -- -IP addess of the destination. -Can be one of multiple IPv4 or IPv6 addresses. +IP addess of the destination. Can be one of multiple IPv4 or IPv6 addresses. type: ip @@ -2213,8 +2207,7 @@ example: us-east1 *`profile.id`*:: + -- -Unique ID for the profile. -All samples within a profile will have the same profile ID. +Unique ID for the profile. All samples within a profile will have the same profile ID. type: keyword @@ -2224,8 +2217,7 @@ type: keyword *`profile.duration`*:: + -- -Duration of the profile, in microseconds. -All samples within a profile will have the same duration. To aggregate durations, you should first group by the profile ID. +Duration of the profile, in microseconds. All samples within a profile will have the same duration. To aggregate durations, you should first group by the profile ID. type: long @@ -3043,8 +3035,7 @@ Information pertaining to the running process where the data was collected *`process.args`*:: + -- -Process arguments. -May be filtered to protect sensitive information. +Process arguments. May be filtered to protect sensitive information. type: keyword @@ -3219,8 +3210,7 @@ Destination fields are usually populated in conjunction with source fields. *`destination.address`*:: + -- -Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. -Then it should be duplicated to `.ip` or `.domain`, depending on which one it is. +Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. Then it should be duplicated to `.ip` or `.domain`, depending on which one it is. type: keyword @@ -3231,8 +3221,7 @@ type: keyword *`destination.ip`*:: + -- -IP addess of the destination. -Can be one of multiple IPv4 or IPv6 addresses. +IP addess of the destination. Can be one of multiple IPv4 or IPv6 addresses. type: ip @@ -4355,8 +4344,7 @@ Information pertaining to the running process where the data was collected *`process.args`*:: + -- -Process arguments. -May be filtered to protect sensitive information. +Process arguments. May be filtered to protect sensitive information. type: keyword @@ -4531,8 +4519,7 @@ Destination fields are usually populated in conjunction with source fields. *`destination.address`*:: + -- -Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. -Then it should be duplicated to `.ip` or `.domain`, depending on which one it is. +Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. Then it should be duplicated to `.ip` or `.domain`, depending on which one it is. type: keyword @@ -4543,8 +4530,7 @@ type: keyword *`destination.ip`*:: + -- -IP addess of the destination. -Can be one of multiple IPv4 or IPv6 addresses. +IP addess of the destination. Can be one of multiple IPv4 or IPv6 addresses. type: ip @@ -5398,8 +5384,7 @@ Information pertaining to the running process where the data was collected *`process.args`*:: + -- -Process arguments. -May be filtered to protect sensitive information. +Process arguments. May be filtered to protect sensitive information. type: keyword @@ -5574,8 +5559,7 @@ Destination fields are usually populated in conjunction with source fields. *`destination.address`*:: + -- -Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. -Then it should be duplicated to `.ip` or `.domain`, depending on which one it is. +Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. Then it should be duplicated to `.ip` or `.domain`, depending on which one it is. type: keyword @@ -5586,8 +5570,7 @@ type: keyword *`destination.ip`*:: + -- -IP addess of the destination. -Can be one of multiple IPv4 or IPv6 addresses. +IP addess of the destination. Can be one of multiple IPv4 or IPv6 addresses. type: ip diff --git a/go.mod b/go.mod index 5768a9e6ef..3cde986f9a 100644 --- a/go.mod +++ b/go.mod @@ -16,12 +16,13 @@ require ( github.com/dustin/go-humanize v1.0.0 github.com/elastic/apm-server/approvaltest v0.0.0-00010101000000-000000000000 github.com/elastic/beats/v7 v7.0.0-alpha2.0.20201112141016-0fda3061815d + github.com/elastic/ecs v1.6.0 github.com/elastic/go-elasticsearch/v7 v7.5.1-0.20201007132508-ff965d99ba02 github.com/elastic/go-elasticsearch/v8 v8.0.0-20201007143536-4b4020669208 github.com/elastic/go-hdrhistogram v0.1.0 github.com/elastic/go-licenser v0.3.1 github.com/elastic/go-sysinfo v1.4.0 // indirect - github.com/elastic/go-ucfg v0.8.3 + github.com/elastic/go-ucfg v0.8.4-0.20200415140258-1232bd4774a6 github.com/fatih/color v1.10.0 // indirect github.com/go-sourcemap/sourcemap v2.1.3+incompatible github.com/gofrs/uuid v3.3.0+incompatible @@ -29,6 +30,7 @@ require ( github.com/golang/protobuf v1.4.2 github.com/google/addlicense v0.0.0-20190907113143-be125746c2c4 // indirect github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99 + github.com/gorilla/mux v1.7.4 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.0 github.com/hashicorp/golang-lru v0.5.3 diff --git a/go.sum b/go.sum index 9e7429c83a..c0a724715b 100644 --- a/go.sum +++ b/go.sum @@ -279,6 +279,8 @@ github.com/elastic/go-txfile v0.0.7/go.mod h1:H0nCoFae0a4ga57apgxFsgmRjevNCsEaT6 github.com/elastic/go-ucfg v0.7.0/go.mod h1:iaiY0NBIYeasNgycLyTvhJftQlQEUO2hpF+FX0JKxzo= github.com/elastic/go-ucfg v0.8.3 h1:leywnFjzr2QneZZWhE6uWd+QN/UpP0sdJRHYyuFvkeo= github.com/elastic/go-ucfg v0.8.3/go.mod h1:iaiY0NBIYeasNgycLyTvhJftQlQEUO2hpF+FX0JKxzo= +github.com/elastic/go-ucfg v0.8.4-0.20200415140258-1232bd4774a6 h1:Ehbr7du4rSSEypR8zePr0XRbMhO4PJgcHC9f8fDbgAg= +github.com/elastic/go-ucfg v0.8.4-0.20200415140258-1232bd4774a6/go.mod h1:iaiY0NBIYeasNgycLyTvhJftQlQEUO2hpF+FX0JKxzo= github.com/elastic/go-windows v1.0.0/go.mod h1:TsU0Nrp7/y3+VwE82FoZF8gC/XFg/Elz6CcloAxnPgU= github.com/elastic/go-windows v1.0.1 h1:AlYZOldA+UJ0/2nBuqWdo90GFCgG9xuyw9SYzGUtJm0= github.com/elastic/go-windows v1.0.1/go.mod h1:FoVvqWSun28vaDQPbj2Elfc0JahhPB7WQEGa3c814Ss= @@ -539,6 +541,8 @@ github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2z github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3 h1:gnP5JzjVOuiZD07fKKToCAOjS0yOpj/qPETTXCCS6hw= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc= +github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= diff --git a/include/fields.go b/include/fields.go index e5b178fc68..a3cc17ef5d 100644 --- a/include/fields.go +++ b/include/fields.go @@ -32,5 +32,5 @@ func init() { // AssetBuildFieldsFieldsYml returns asset data. // This is the base64 encoded gzipped contents of build/fields/fields.yml. func AssetBuildFieldsFieldsYml() string { - return "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" + return "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" } diff --git a/model/error/_meta/fields.yml b/model/error/_meta/fields.yml index 8975da87a7..330ba9a1f8 100644 --- a/model/error/_meta/fields.yml +++ b/model/error/_meta/fields.yml @@ -417,7 +417,6 @@ type: keyword description: > Process arguments. - May be filtered to protect sensitive information. overwrite: true @@ -532,7 +531,6 @@ description: 'Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. - Then it should be duplicated to `.ip` or `.domain`, depending on which one it is.' overwrite: true @@ -541,7 +539,6 @@ level: core type: ip description: 'IP addess of the destination. - Can be one of multiple IPv4 or IPv6 addresses.' overwrite: true diff --git a/model/metricset/_meta/fields.yml b/model/metricset/_meta/fields.yml index dc8396d566..0ab675b084 100644 --- a/model/metricset/_meta/fields.yml +++ b/model/metricset/_meta/fields.yml @@ -333,7 +333,6 @@ type: keyword description: > Process arguments. - May be filtered to protect sensitive information. overwrite: true @@ -448,7 +447,6 @@ description: 'Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. - Then it should be duplicated to `.ip` or `.domain`, depending on which one it is.' overwrite: true @@ -457,7 +455,6 @@ level: core type: ip description: 'IP addess of the destination. - Can be one of multiple IPv4 or IPv6 addresses.' overwrite: true diff --git a/model/profile/_meta/fields.yml b/model/profile/_meta/fields.yml index fc3fc7adab..1dddaac956 100644 --- a/model/profile/_meta/fields.yml +++ b/model/profile/_meta/fields.yml @@ -239,7 +239,6 @@ type: keyword description: > Process arguments. - May be filtered to protect sensitive information. overwrite: true @@ -354,7 +353,6 @@ description: 'Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. - Then it should be duplicated to `.ip` or `.domain`, depending on which one it is.' overwrite: true @@ -363,7 +361,6 @@ level: core type: ip description: 'IP addess of the destination. - Can be one of multiple IPv4 or IPv6 addresses.' overwrite: true @@ -579,7 +576,6 @@ count: 1 description: > Unique ID for the profile. - All samples within a profile will have the same profile ID. - name: duration @@ -587,7 +583,6 @@ count: 1 description: > Duration of the profile, in microseconds. - All samples within a profile will have the same duration. To aggregate durations, you should first group by the profile ID. diff --git a/model/span/_meta/fields.yml b/model/span/_meta/fields.yml index be958fe1fe..5747956385 100644 --- a/model/span/_meta/fields.yml +++ b/model/span/_meta/fields.yml @@ -342,7 +342,6 @@ type: keyword description: > Process arguments. - May be filtered to protect sensitive information. overwrite: true @@ -457,7 +456,6 @@ description: 'Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. - Then it should be duplicated to `.ip` or `.domain`, depending on which one it is.' overwrite: true @@ -466,7 +464,6 @@ level: core type: ip description: 'IP addess of the destination. - Can be one of multiple IPv4 or IPv6 addresses.' overwrite: true diff --git a/model/transaction/_meta/fields.yml b/model/transaction/_meta/fields.yml index 32d4181fe3..28941558be 100644 --- a/model/transaction/_meta/fields.yml +++ b/model/transaction/_meta/fields.yml @@ -446,7 +446,6 @@ type: keyword description: > Process arguments. - May be filtered to protect sensitive information. overwrite: true @@ -561,7 +560,6 @@ description: 'Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. - Then it should be duplicated to `.ip` or `.domain`, depending on which one it is.' overwrite: true @@ -570,7 +568,6 @@ level: core type: ip description: 'IP addess of the destination. - Can be one of multiple IPv4 or IPv6 addresses.' overwrite: true diff --git a/tests/system/test_tls.py b/tests/system/test_tls.py index 686e39458d..d7f13e0e0f 100644 --- a/tests/system/test_tls.py +++ b/tests/system/test_tls.py @@ -1,3 +1,5 @@ +from apmserver import TimeoutError, integration_test +from apmserver import ServerBaseTest import os import requests import shutil @@ -6,8 +8,8 @@ import socket import pytest from requests.packages.urllib3.exceptions import SubjectAltNameWarning -from apmserver import ServerBaseTest -from apmserver import TimeoutError, integration_test +requests.packages.urllib3.disable_warnings(SubjectAltNameWarning) + INTEGRATION_TESTS = os.environ.get('INTEGRATION_TESTS', False)