From fb72b942c4268788b1fcb2c0f1d9cab70275f994 Mon Sep 17 00:00:00 2001 From: Juan Date: Tue, 17 Nov 2020 08:30:33 +0100 Subject: [PATCH 01/15] Generate fields for APM package --- .../data_stream/logs/fields/base-fields.yml | 12 + .../apm/0.1.0/data_stream/logs/fields/ecs.yml | 7 + .../0.1.0/data_stream/logs/fields/fields.yml | 35 ++ .../apm/0.1.0/data_stream/logs/manifest.yml | 2 + .../metrics/fields/base-fields.yml | 12 + .../data_stream/metrics/fields/fields.yml | 136 ++++++++ .../0.1.0/data_stream/metrics/manifest.yml | 2 + .../data_stream/traces/fields/base-fields.yml | 12 + .../0.1.0/data_stream/traces/fields/ecs.yml | 307 +++++++++++++++++ .../data_stream/traces/fields/fields.yml | 311 ++++++++++++++++++ .../apm/0.1.0/data_stream/traces/manifest.yml | 2 + apmpackage/apm/0.1.0/docs/README.md | 1 + apmpackage/apm/0.1.0/manifest.yml | 30 ++ apmpackage/cmd/gen-package/main.go | 30 ++ apmpackage/genfields.go | 172 ++++++++++ apmpackage/model.go | 73 ++++ 16 files changed, 1144 insertions(+) create mode 100644 apmpackage/apm/0.1.0/data_stream/logs/fields/base-fields.yml create mode 100644 apmpackage/apm/0.1.0/data_stream/logs/fields/ecs.yml create mode 100644 apmpackage/apm/0.1.0/data_stream/logs/fields/fields.yml create mode 100644 apmpackage/apm/0.1.0/data_stream/logs/manifest.yml create mode 100644 apmpackage/apm/0.1.0/data_stream/metrics/fields/base-fields.yml create mode 100644 apmpackage/apm/0.1.0/data_stream/metrics/fields/fields.yml create mode 100644 apmpackage/apm/0.1.0/data_stream/metrics/manifest.yml create mode 100644 apmpackage/apm/0.1.0/data_stream/traces/fields/base-fields.yml create mode 100644 apmpackage/apm/0.1.0/data_stream/traces/fields/ecs.yml create mode 100644 apmpackage/apm/0.1.0/data_stream/traces/fields/fields.yml create mode 100644 apmpackage/apm/0.1.0/data_stream/traces/manifest.yml create mode 100644 apmpackage/apm/0.1.0/docs/README.md create mode 100644 apmpackage/apm/0.1.0/manifest.yml create mode 100644 apmpackage/cmd/gen-package/main.go create mode 100644 apmpackage/genfields.go create mode 100644 apmpackage/model.go 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 00000000000..7c798f4534c --- /dev/null +++ b/apmpackage/apm/0.1.0/data_stream/logs/fields/base-fields.yml @@ -0,0 +1,12 @@ +- 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. +- name: '@timestamp' + type: date + description: Event timestamp. 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 00000000000..d09e46315cf --- /dev/null +++ b/apmpackage/apm/0.1.0/data_stream/logs/fields/ecs.yml @@ -0,0 +1,7 @@ +- name: error + description: | + Data captured by an agent representing an event occurring in a monitored service. + fields: + - name: id + 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 00000000000..c46239863cc --- /dev/null +++ b/apmpackage/apm/0.1.0/data_stream/logs/fields/fields.yml @@ -0,0 +1,35 @@ +- name: error + description: | + Data captured by an agent representing an event occurring in a monitored service. + fields: + - name: culprit + description: Function call which was the primary perpetrator of this event. + - name: grouping_key + description: | + GroupingKey of the logged error for use in grouping. + - name: exception + description: | + Information about the originally thrown error. + fields: + - name: code + description: The error code set when the error happened, e.g. database error code. + - name: message + description: The original error message. + - name: module + description: The module namespace of the original error. + - name: type + - name: handled + description: Indicator whether the error was caught somewhere in the code or not. + - name: log + description: | + Additional information added by logging the error. + fields: + - name: level + description: The severity of the record. + - name: logger_name + description: The name of the logger instance used. + - name: message + description: The additionally logged error message. + - name: param_message + 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 00000000000..cef82f38378 --- /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 00000000000..7c798f4534c --- /dev/null +++ b/apmpackage/apm/0.1.0/data_stream/metrics/fields/base-fields.yml @@ -0,0 +1,12 @@ +- 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. +- name: '@timestamp' + type: date + description: Event timestamp. 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 00000000000..cfec7bbd2fb --- /dev/null +++ b/apmpackage/apm/0.1.0/data_stream/metrics/fields/fields.yml @@ -0,0 +1,136 @@ +- name: system + description: | + `system` contains local system metrics. + fields: + - name: cpu + description: | + `cpu` contains local CPU stats. + fields: + - name: total.norm.pct + 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 + description: | + `memory` contains local memory stats. + fields: + - name: total + format: bytes + description: | + Total memory. + - name: actual + description: | + Actual memory used and free. + fields: + - name: free + 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 + description: | + `process` contains process metadata, CPU metrics, and memory metrics. + fields: + - name: cpu + description: | + `cpu` contains local CPU stats. + fields: + - name: total.norm.pct + 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 + description: Memory-specific statistics per process. + fields: + - name: size + format: bytes + description: | + The total virtual memory the process has. + - name: rss.bytes + format: bytes + description: | + The Resident Set Size. The amount of memory the process occupied in main memory (RAM). + - name: cgroup + description: Metrics and limits for the cgroup, collected by APM agents on Linux. + fields: + - name: memory + description: Memory-specific cgroup metrics and limits. + fields: + - name: mem.limit.bytes + format: bytes + description: Memory limit for the current cgroup slice. + - name: mem.usage.bytes + format: bytes + description: Memory usage by the current cgroup slice. +- name: transaction + fields: + - name: root + description: | + Identifies metrics for root transactions. This can be used for calculating metrics for traces. +- name: profile + fields: + - name: id + description: | + Unique ID for the profile. + All samples within a profile will have the same profile ID. + - name: duration + 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 + fields: + - name: ns + description: | + Amount of CPU time profiled, in nanoseconds. + - name: samples + fields: + - name: count + description: | + Number of profile samples for the profiling period. + - name: alloc_objects + fields: + - name: count + description: | + Number of objects allocated since the process started. + - name: alloc_space + fields: + - name: bytes + description: | + Amount of memory allocated, in bytes, since the process started. + - name: inuse_objects + fields: + - name: count + description: | + Number of objects allocated and currently in use. + - name: inuse_space + fields: + - name: bytes + description: | + Amount of memory allocated, in bytes, and currently in use. + - name: top + fields: + - name: id + description: | + Unique ID for the top stack frame in the context of its callers. + - name: function + description: | + Function name for the top stack frame. + - name: filename + description: | + Source code filename for the top stack frame. + - name: line + description: | + Source code line number for the top stack frame. + - name: stack + fields: + - name: id + description: | + Unique ID for a stack frame in the context of its callers. + - name: function + description: | + Function name for a stack frame. + - name: filename + description: | + Source code filename for a stack frame. + - name: line + description: | + Source code line number for a stack frame. 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 00000000000..fe1408e8883 --- /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 00000000000..7c798f4534c --- /dev/null +++ b/apmpackage/apm/0.1.0/data_stream/traces/fields/base-fields.yml @@ -0,0 +1,12 @@ +- 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. +- name: '@timestamp' + type: date + description: Event timestamp. 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 00000000000..dcc4484392a --- /dev/null +++ b/apmpackage/apm/0.1.0/data_stream/traces/fields/ecs.yml @@ -0,0 +1,307 @@ +- name: url + description: | + A complete Url, with scheme, host and path. + fields: + - name: scheme + description: | + The protocol of the request, e.g. "https:". + - name: full + description: | + The full, possibly agent-assembled URL of the request, e.g https://example.com:443/search?q=elasticsearch#top. + - name: domain + description: | + The hostname of the request, e.g. "example.com". + - name: port + description: | + The port of the request, e.g. 443. + - name: path + description: | + The path of the request, e.g. "/search". + - name: query + description: | + The query string of the request, e.g. "q=elasticsearch". + - name: fragment + description: | + A fragment specifying a location in a web page , e.g. "top". +- name: http + fields: + - name: version + description: | + The http version of the request leading to this event. + - name: request + fields: + - name: method + description: | + The http method of the request leading to this event. + - name: referrer + description: Referrer for this HTTP request. + ignore_above: 1024 + - name: response + fields: + - name: status_code + description: | + The status code of the HTTP response. +- name: labels + description: | + A flat mapping of user-defined labels with string, boolean or number values. +- name: service + description: | + Service fields. + fields: + - name: name + description: | + Immutable name of the service emitting this event. + - name: version + description: | + Version of the service emitting this event. + - name: node + fields: + - name: name + description: | + Unique meaningful name of the service node. +- name: transaction + fields: + - name: id + description: | + The transaction ID. +- name: trace + fields: + - name: id + description: | + The ID of the trace to which the event belongs to. +- name: agent + fields: + - name: name + description: | + Name of the agent used. + - name: version + description: | + Version of the agent used. + - name: ephemeral_id + description: | + The Ephemeral ID identifies a running process. +- name: container + title: Container + type: Container + 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 + description: | + Unique container id. +- name: host + description: | + Optional host fields. + fields: + - name: architecture + description: | + The architecture of the host the event was recorded on. + - name: hostname + description: | + The hostname of the host the event was recorded on. + - name: name + 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 + description: | + IP of the host that records the event. + - name: os + title: Operating System + group: 2 + type: Operating System + description: | + The OS fields contain information about the operating system. + fields: + - name: platform + description: | + The platform of the host the event was recorded on. +- name: process + description: | + Information pertaining to the running process where the data was collected + fields: + - name: args + level: extended + description: | + Process arguments. + May be filtered to protect sensitive information. + - name: pid + description: | + Numeric process ID of the service process. + - name: ppid + description: | + Numeric ID of the service's parent process. + - name: title + description: | + Service process title. +- name: observer + fields: + - name: hostname + description: | + Hostname of the APM Server. + - name: version + description: | + APM Server version. + - name: type + description: | + The type will be set to `apm-server`. +- name: user + fields: + - name: name + description: | + The username of the logged in user. + - name: id + description: | + Identifier of the logged in user. + - name: email + description: | + Email of the logged in user. +- name: client + fields: + - name: 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 + fields: + - name: 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: Destination + 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 + 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 + description: |- + IP addess of the destination. + Can be one of multiple IPv4 or IPv6 addresses. + - name: port + level: core + format: string + description: Port of the destination. +- name: user_agent + title: User agent + type: User agent + 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 + description: | + Unparsed version of the user_agent. + multi_fields: + - type: text + - name: name + description: | + Name of the user agent. + - name: version + description: | + Version of the user agent. + - name: device + title: Device + type: Device + description: | + Information concerning the device. + fields: + - name: name + description: | + Name of the device. + - name: os + title: Operating System + type: Operating System + description: | + The OS fields contain information about the operating system. + fields: + - name: platform + description: | + Operating system platform (such centos, ubuntu, windows). + - name: name + description: | + Operating system name, without the version. + - name: full + description: | + Operating system name, including the version or code name. + - name: family + description: | + OS family (such as redhat, debian, freebsd, windows). + - name: version + description: | + Operating system version as a raw string. + - name: kernel + description: | + Operating system kernel version as a raw string. +- name: cloud + title: Cloud + group: 2 + type: Cloud + description: | + Cloud metadata reported by agents + fields: + - name: account + fields: + - name: id + level: extended + description: Cloud account ID + ignore_above: 1024 + - name: name + level: extended + description: Cloud account name + ignore_above: 1024 + - name: availability_zone + level: extended + description: Cloud availability zone name + ignore_above: 1024 + - name: instance + fields: + - name: id + level: extended + description: Cloud instance/machine ID + ignore_above: 1024 + - name: name + level: extended + description: Cloud instance/machine name + ignore_above: 1024 + - name: machine + fields: + - name: type + level: extended + description: Cloud instance/machine type + ignore_above: 1024 + - name: project + fields: + - name: id + level: extended + description: Cloud project ID + ignore_above: 1024 + - name: name + level: extended + description: Cloud project name + ignore_above: 1024 + - name: provider + level: extended + description: Cloud provider name + ignore_above: 1024 + - name: region + level: extended + description: Cloud region name + ignore_above: 1024 +- name: event + fields: + - name: outcome + level: core + 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 + fields: + - name: id + 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 00000000000..8c69bbffb61 --- /dev/null +++ b/apmpackage/apm/0.1.0/data_stream/traces/fields/fields.yml @@ -0,0 +1,311 @@ +- name: processor.name + description: Processor name. +- name: processor.event + description: Processor event. +- name: timestamp + fields: + - name: us + description: | + Timestamp of the event in microseconds since Unix epoch. +- name: url + description: | + A complete Url, with scheme, host and path. +- name: http + fields: + - name: request + fields: + - name: headers + description: | + The canonical headers of the monitored HTTP request. + - name: response + fields: + - name: finished + description: | + Used by the Node agent to indicate when in the response life cycle an error has occurred. + - name: headers + description: | + The canonical headers of the monitored HTTP response. +- name: service + description: | + Service fields. + fields: + - name: environment + description: | + Service environment. + - name: node + - name: language + fields: + - name: name + description: | + Name of the programming language used. + - name: version + description: | + Version of the programming language used. + - name: runtime + fields: + - name: name + description: | + Name of the runtime used. + - name: version + description: | + Version of the runtime used. + - name: framework + fields: + - name: name + description: | + Name of the framework used. + - name: version + description: | + Version of the framework used. +- name: transaction + fields: + - name: sampled + description: | + Transactions that are 'sampled' will include all available information. Transactions that are not sampled will not have spans or context. + - name: type + description: | + Keyword of specific relevance in the service's domain (eg. 'request', 'backgroundjob', etc) + - name: name + description: | + Generic designation of a transaction in the scope of a single service (eg. 'GET /users/:id'). + multi_fields: + - type: text + - name: duration + fields: + - name: count + - name: sum + fields: + - name: us + - name: self_time + description: | + Portion of the transaction's duration where no direct child was running + fields: + - name: count + - name: sum + fields: + - name: us + - name: breakdown + description: | + Counter for collected breakdowns for the transaction + fields: + - name: count +- name: span + fields: + - name: type + description: | + Keyword of specific relevance in the service's domain (eg: 'db.postgresql.query', 'template.erb', 'cache', etc). + - name: subtype + description: | + A further sub-division of the type (e.g. postgresql, elasticsearch) + - name: self_time + description: | + Portion of the span's duration where no direct child was running + fields: + - name: count + - name: sum + fields: + - name: us +- name: trace +- name: parent + fields: + - name: id + description: | + The ID of the parent event. +- name: agent +- name: container + title: Container + type: Container + 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. +- name: kubernetes + title: Kubernetes + type: Kubernetes + description: | + Kubernetes metadata reported by agents + fields: + - name: namespace + description: | + Kubernetes namespace + - name: node + fields: + - name: name + description: | + Kubernetes node name + - name: pod + fields: + - name: name + description: | + Kubernetes pod name + - name: uid + description: | + Kubernetes Pod UID +- name: host + description: | + Optional host fields. + fields: + - name: os + title: Operating System + group: 2 + type: Operating System + description: | + The OS fields contain information about the operating system. +- name: process + description: | + Information pertaining to the running process where the data was collected +- name: observer + fields: + - name: listening + description: | + Address the server is listening on. + - name: version_major + description: | + Major version number of the observer +- name: user +- name: client +- name: source +- name: destination + title: Destination + group: 2 + type: Destination + description: |- + Destination fields describe details about the destination of a packet/event. + Destination fields are usually populated in conjunction with source fields. +- name: user_agent + title: User agent + type: User agent + 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: device + title: Device + type: Device + description: | + Information concerning the device. + - name: os + title: Operating System + type: Operating System + description: | + The OS fields contain information about the operating system. +- name: experimental + description: Additional experimental data sent by the agents. +- name: cloud + title: Cloud + group: 2 + type: Cloud + description: | + Cloud metadata reported by agents + fields: + - name: account + - name: instance + - name: machine + - name: project +- name: event +- name: transaction + fields: + - name: duration + fields: + - name: us + description: | + Total duration of this transaction, in microseconds. + - name: result + description: | + The result of the transaction. HTTP status code for HTTP-related transactions. + - name: marks + description: | + A user-defined mapping of groups of marks in milliseconds. + - name: marks.*.* + - name: experience + fields: + - name: cls + description: The Cumulative Layout Shift metric + - name: fid + description: The First Input Delay metric + - name: tbt + description: The Total Blocking Time metric + - name: longtask + description: Longtask duration/count metrics + fields: + - name: count + description: The total number of of longtasks + - name: sum + description: The sum of longtask durations + - name: max + description: The max longtask duration + - name: span_count + fields: + - name: dropped + description: The total amount of dropped spans for this transaction. + - name: message + fields: + - name: queue + fields: + - name: name + description: | + Name of the message queue or topic where the message is published or received. + - name: age + fields: + - name: ms + description: | + Age of a message in milliseconds. +- name: view spans + format: url +- name: child + fields: + - name: id + description: | + The ID(s)s of the child event(s). +- name: span + fields: + - name: name + description: | + Generic designation of a span in the scope of a transaction. + - name: action + description: | + The specific kind of event within the sub-type represented by the span (e.g. query, connect) + - name: start + fields: + - name: us + description: | + Offset relative to the transaction's timestamp identifying the start of the span, in microseconds. + - name: duration + fields: + - name: us + description: | + Duration of the span, in microseconds. + - name: sync + description: | + Indicates whether the span was executed synchronously or asynchronously. + - name: db + fields: + - name: link + description: | + Database link. + - name: rows_affected + description: | + Number of rows affected by the database statement. + - name: destination + fields: + - name: service + description: Destination service context + fields: + - name: type + description: | + Type of the destination service (e.g. 'db', 'elasticsearch'). Should typically be the same as span.type. + - name: name + description: | + Identifier for the destination service (e.g. 'http://elastic.co', 'elasticsearch', 'rabbitmq') + - name: resource + description: | + Identifier for the destination service resource being operated on (e.g. 'http://elastic.co:80', 'elasticsearch', 'rabbitmq/queue_name') + - name: message + fields: + - name: queue + fields: + - name: name + description: | + Name of the message queue or topic where the message is published or received. + - name: age + fields: + - name: ms + 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 00000000000..2734366240d --- /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 00000000000..e14230020b3 --- /dev/null +++ b/apmpackage/apm/0.1.0/docs/README.md @@ -0,0 +1 @@ +### TODO... diff --git a/apmpackage/apm/0.1.0/manifest.yml b/apmpackage/apm/0.1.0/manifest.yml new file mode 100644 index 00000000000..be3d9c9d1a1 --- /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: Manage Elastic APM agents +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 # Not shown in UI ? + inputs: + - type: apm + title: Collect application traces + description: Collect application traces + vars: + - name: enable_rum + type: bool + title: Enable RUM + # TODO would be nice a link to a description + required: true + show_user: true + default: false +owner: + github: elastic/apm-server diff --git a/apmpackage/cmd/gen-package/main.go b/apmpackage/cmd/gen-package/main.go new file mode 100644 index 00000000000..b8bcba37fd3 --- /dev/null +++ b/apmpackage/cmd/gen-package/main.go @@ -0,0 +1,30 @@ +// 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 ( + "flag" + "github.com/elastic/apm-server/apmpackage" +) + +var ecsDir string + +func main() { + flag.StringVar(&ecsDir, "ecsDir", "../ecs", "Path to the Elastic Common Schema repository") + apmpackage.GenerateFields(ecsDir) +} diff --git a/apmpackage/genfields.go b/apmpackage/genfields.go new file mode 100644 index 00000000000..3995f4a0452 --- /dev/null +++ b/apmpackage/genfields.go @@ -0,0 +1,172 @@ +package apmpackage + +import ( + "github.com/pkg/errors" + "gopkg.in/yaml.v2" + "io/ioutil" + "os" + "path/filepath" +) + +func GenerateFields(ecsDir string) { + + // TODO get this from GH directly + ecsFlatFields := loadECSFields(ecsDir) + + inputFieldsFiles := map[string][]string{ + "logs": {"model/error/_meta/fields.yml"}, + "metrics": {"model/metricset/_meta/fields.yml", "model/profile/_meta/fields.yml"}, + "traces": {"_meta/fields.common.yml", "model/transaction/_meta/fields.yml", "model/span/_meta/fields.yml"}, + } + + for streamType, fieldsFiles := range inputFieldsFiles { + var ecsFields []FieldDefinition + var nonECSFields []FieldDefinition + for _, fieldsFile := range fieldsFiles { + for _, fields := range populateECSInfo(ecsFlatFields, loadFields(fieldsFile)) { + ecs, nonECS := splitECSFields(fields) + if len(ecs.Fields) > 0 || ecs.IsECS { + ecsFields = append(ecsFields, ecs) + } + // TODO probably should check type + if len(nonECS.Fields) > 0 || !ecs.IsECS { + nonECSFields = append(nonECSFields, nonECS) + } + } + } + // TODO handle version better + dataStreamFieldsPath := filepath.Join("apmpackage/apm/0.1.0/data_stream", streamType, "fields") + var writeOutFields = func(fName string, data []FieldDefinition) { + data = rmGroupDescriptions(data) + bytes, err := yaml.Marshal(&data) + if err != nil { + panic(err) + } + err = ioutil.WriteFile(filepath.Join(dataStreamFieldsPath, fName), bytes, 0644) + if err != nil { + panic(err) + } + } + if len(ecsFields) > 0 { + writeOutFields("ecs.yml", ecsFields) + } + if len(nonECSFields) > 0 { + writeOutFields("fields.yml", nonECSFields) + } + } +} + +// TODO move functionality to loadDefaultFieldValues +func rmGroupDescriptions(data []FieldDefinition) []FieldDefinition { + var ret []FieldDefinition + for _, f := range data { + copy := f + if f.Type == "group" { + copy.Description = "" + } + copy.Fields = rmGroupDescriptions(copy.Fields) + ret = append(ret, copy) + } + return ret +} + +func populateECSInfo(ecsFlatFields map[string]interface{}, fields []FieldDefinition) []FieldDefinition { + var traverse func(string, []FieldDefinition) ([]FieldDefinition, bool, bool) + traverse = func(fName string, fs []FieldDefinition) ([]FieldDefinition, 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("", fields) + return ret +} + +func splitECSFields(parent FieldDefinition) (FieldDefinition, FieldDefinition) { + 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.IsECS { + nonECSCopy.Fields = append(nonECSCopy.Fields, nonECSChild) + } + } + return ecsCopy, nonECSCopy +} + +// adapted from https://github.com/elastic/integrations/tree/master/dev/import-beats + +func loadECSFields(ecsDir string) map[string]interface{} { + path := filepath.Join(ecsDir, "generated/ecs/ecs_flat.yml") + fields, err := ioutil.ReadFile(path) + if err != nil { + panic(err) + } + var ret map[string]interface{} + err = yaml.Unmarshal(fields, &ret) + if err != nil { + panic(err) + } + return ret +} + +func loadFields(fileName string) []FieldDefinition { + fs, err := loadFieldsFile(fileName) + if err != nil { + panic(errors.Wrapf(err, "loading module fields file failed")) + } + var ret []FieldDefinition + for _, key := range fs { + ret = append(ret, key.Fields...) + } + return ret +} + +func loadFieldsFile(path string) ([]FieldDefinition, error) { + fields, err := ioutil.ReadFile(path) + if os.IsNotExist(err) { + return []FieldDefinition{}, nil // return empty array, this is a valid state + } + if err != nil { + return nil, errors.Wrapf(err, "reading fields failed (path: %s)", path) + } + + var fs []FieldDefinition + + err = yaml.Unmarshal(fields, &fs) + if err != nil { + return nil, errors.Wrapf(err, "unmarshalling fields file failed (path: %s)", path) + } + fs = loadDefaultFieldValues(fs) + return fs, nil +} + +func loadDefaultFieldValues(fs []FieldDefinition) []FieldDefinition { + var withDefaults []FieldDefinition + for _, f := range fs { + if f.Type == "" { + f.Type = "keyword" + } + f.Fields = loadDefaultFieldValues(f.Fields) + withDefaults = append(withDefaults, f) + } + return withDefaults +} diff --git a/apmpackage/model.go b/apmpackage/model.go new file mode 100644 index 00000000000..9c597230ccd --- /dev/null +++ b/apmpackage/model.go @@ -0,0 +1,73 @@ +// 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 apmpackage + +type FieldDefinition 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"` + // Example is not consistent in ECS schema (either single field or array) + //Example string `yaml:"example,omitempty"` + IgnoreAbove *int `yaml:"ignore_above,omitempty"` + MultiFields []MultiFieldDefinition `yaml:"multi_fields,omitempty"` + Fields []FieldDefinition `yaml:"fields,omitempty"` + IsECS bool `yaml:"-"` + HasECS bool `yaml:"-"` + HasNonECS bool `yaml:"-"` +} + +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 FieldDefinition) FieldDefinition { + return FieldDefinition{ + Name: f.Name, + Key: f.Key, + Title: f.Title, + Group: f.Group, + Level: f.Level, + Required: f.Required, + Type: f.Title, + Format: f.Format, + Description: f.Description, + Release: f.Release, + Alias: f.Alias, + Path: f.Path, + Footnote: f.Footnote, + IgnoreAbove: f.IgnoreAbove, + Fields: nil, + MultiFields: f.MultiFields, + IsECS: f.IsECS, + HasECS: f.HasECS, + HasNonECS: f.HasNonECS, + } +} From bb37e3e0b068208ca037374d336242847b15f063 Mon Sep 17 00:00:00 2001 From: Juan Date: Tue, 17 Nov 2020 12:01:49 +0100 Subject: [PATCH 02/15] fix bits here and there --- apmpackage/cmd/gen-package/main.go | 1 + apmpackage/genfields.go | 57 +++++++++--------------------- apmpackage/model.go | 4 +++ 3 files changed, 22 insertions(+), 40 deletions(-) diff --git a/apmpackage/cmd/gen-package/main.go b/apmpackage/cmd/gen-package/main.go index b8bcba37fd3..247f2be6483 100644 --- a/apmpackage/cmd/gen-package/main.go +++ b/apmpackage/cmd/gen-package/main.go @@ -26,5 +26,6 @@ var ecsDir string func main() { flag.StringVar(&ecsDir, "ecsDir", "../ecs", "Path to the Elastic Common Schema repository") + flag.Parse() apmpackage.GenerateFields(ecsDir) } diff --git a/apmpackage/genfields.go b/apmpackage/genfields.go index 3995f4a0452..12dd4a26974 100644 --- a/apmpackage/genfields.go +++ b/apmpackage/genfields.go @@ -1,14 +1,13 @@ package apmpackage import ( - "github.com/pkg/errors" "gopkg.in/yaml.v2" "io/ioutil" - "os" "path/filepath" ) func GenerateFields(ecsDir string) { + // TODO remove all field files before generate them // TODO get this from GH directly ecsFlatFields := loadECSFields(ecsDir) @@ -23,13 +22,12 @@ func GenerateFields(ecsDir string) { var ecsFields []FieldDefinition var nonECSFields []FieldDefinition for _, fieldsFile := range fieldsFiles { - for _, fields := range populateECSInfo(ecsFlatFields, loadFields(fieldsFile)) { + for _, fields := range populateECSInfo(ecsFlatFields, concatFields(fieldsFile)) { ecs, nonECS := splitECSFields(fields) if len(ecs.Fields) > 0 || ecs.IsECS { ecsFields = append(ecsFields, ecs) } - // TODO probably should check type - if len(nonECS.Fields) > 0 || !ecs.IsECS { + if len(nonECS.Fields) > 0 || ecs.IsNonECSLeaf() { nonECSFields = append(nonECSFields, nonECS) } } @@ -37,7 +35,6 @@ func GenerateFields(ecsDir string) { // TODO handle version better dataStreamFieldsPath := filepath.Join("apmpackage/apm/0.1.0/data_stream", streamType, "fields") var writeOutFields = func(fName string, data []FieldDefinition) { - data = rmGroupDescriptions(data) bytes, err := yaml.Marshal(&data) if err != nil { panic(err) @@ -56,20 +53,6 @@ func GenerateFields(ecsDir string) { } } -// TODO move functionality to loadDefaultFieldValues -func rmGroupDescriptions(data []FieldDefinition) []FieldDefinition { - var ret []FieldDefinition - for _, f := range data { - copy := f - if f.Type == "group" { - copy.Description = "" - } - copy.Fields = rmGroupDescriptions(copy.Fields) - ret = append(ret, copy) - } - return ret -} - func populateECSInfo(ecsFlatFields map[string]interface{}, fields []FieldDefinition) []FieldDefinition { var traverse func(string, []FieldDefinition) ([]FieldDefinition, bool, bool) traverse = func(fName string, fs []FieldDefinition) ([]FieldDefinition, bool, bool) { @@ -105,7 +88,7 @@ func splitECSFields(parent FieldDefinition) (FieldDefinition, FieldDefinition) { if ecsChild.HasECS || ecsChild.IsECS { ecsCopy.Fields = append(ecsCopy.Fields, ecsChild) } - if nonECSChild.HasNonECS || !nonECSChild.IsECS { + if nonECSChild.HasNonECS || nonECSChild.IsNonECSLeaf() { nonECSCopy.Fields = append(nonECSCopy.Fields, nonECSChild) } } @@ -128,11 +111,8 @@ func loadECSFields(ecsDir string) map[string]interface{} { return ret } -func loadFields(fileName string) []FieldDefinition { - fs, err := loadFieldsFile(fileName) - if err != nil { - panic(errors.Wrapf(err, "loading module fields file failed")) - } +func concatFields(fileName string) []FieldDefinition { + fs := loadFieldsFile(fileName) var ret []FieldDefinition for _, key := range fs { ret = append(ret, key.Fields...) @@ -140,33 +120,30 @@ func loadFields(fileName string) []FieldDefinition { return ret } -func loadFieldsFile(path string) ([]FieldDefinition, error) { +func loadFieldsFile(path string) []FieldDefinition { fields, err := ioutil.ReadFile(path) - if os.IsNotExist(err) { - return []FieldDefinition{}, nil // return empty array, this is a valid state - } if err != nil { - return nil, errors.Wrapf(err, "reading fields failed (path: %s)", path) + panic(err) } var fs []FieldDefinition - err = yaml.Unmarshal(fields, &fs) if err != nil { - return nil, errors.Wrapf(err, "unmarshalling fields file failed (path: %s)", path) + panic(err) } - fs = loadDefaultFieldValues(fs) - return fs, nil + return overrideFieldValues(fs) } -func loadDefaultFieldValues(fs []FieldDefinition) []FieldDefinition { - var withDefaults []FieldDefinition +func overrideFieldValues(fs []FieldDefinition) []FieldDefinition { + var ret []FieldDefinition for _, f := range fs { if f.Type == "" { f.Type = "keyword" + } else if f.Type == "group" { + // f.Description = "" TODO beats does this after } - f.Fields = loadDefaultFieldValues(f.Fields) - withDefaults = append(withDefaults, f) + f.Fields = overrideFieldValues(f.Fields) + ret = append(ret, f) } - return withDefaults + return ret } diff --git a/apmpackage/model.go b/apmpackage/model.go index 9c597230ccd..275a20311cd 100644 --- a/apmpackage/model.go +++ b/apmpackage/model.go @@ -41,6 +41,10 @@ type FieldDefinition struct { HasNonECS bool `yaml:"-"` } +func (f FieldDefinition) IsNonECSLeaf() bool { + return f.Type != "group" && !f.IsECS +} + type MultiFieldDefinition struct { Name string `yaml:"Name,omitempty"` Type string `yaml:"type,omitempty"` From 3b19a246ce1d87dfc2f8b4de22553544829599fb Mon Sep 17 00:00:00 2001 From: Juan Date: Fri, 20 Nov 2020 13:44:05 +0100 Subject: [PATCH 03/15] Generate docs out of fields.yml files --- NOTICE.txt | 17 +- .../apm/0.1.0/data_stream/logs/fields/ecs.yml | 290 ++++++ .../0.1.0/data_stream/logs/fields/fields.yml | 185 ++++ .../data_stream/metrics/fields/fields.yml | 317 ++++++- .../0.1.0/data_stream/traces/fields/ecs.yml | 265 +++++- .../data_stream/traces/fields/fields.yml | 184 ++++ apmpackage/apm/0.1.0/docs/README.md | 887 +++++++++++++++++- apmpackage/cmd/gen-package/main.go | 4 +- apmpackage/docs/README.template.md | 70 ++ apmpackage/gendocs.go | 97 ++ apmpackage/genfields.go | 59 +- apmpackage/model.go | 6 + docs/fields.asciidoc | 61 +- include/fields.go | 2 +- model/error/_meta/fields.yml | 3 - model/metricset/_meta/fields.yml | 3 - model/profile/_meta/fields.yml | 5 - model/span/_meta/fields.yml | 3 - model/transaction/_meta/fields.yml | 3 - 19 files changed, 2355 insertions(+), 106 deletions(-) create mode 100644 apmpackage/docs/README.template.md create mode 100644 apmpackage/gendocs.go diff --git a/NOTICE.txt b/NOTICE.txt index f69c95a2377..c5d1a7ea587 100644 --- a/NOTICE.txt +++ b/NOTICE.txt @@ -639,7 +639,7 @@ Contents of "LICENSE": -------------------------------------------------------------------- Dependency: github.com/elastic/beats/v7 Version: v7.0.0 -Revision: 0fda3061815d +Revision: 633285e75a03 License type (autodetected): Apache-2.0 -------------------------------------------------------------------- @@ -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 -------------------------------------------------------------------- @@ -993,7 +994,8 @@ Contents of "NOTICE.txt": -------------------------------------------------------------------- Dependency: github.com/elastic/gosigar -Version: v0.12.0 +Version: v0.10.6 +Revision: f115143bb233 License type (autodetected): Apache-2.0 Contents of "NOTICE": @@ -1009,7 +1011,7 @@ Contents of "NOTICE": -------------------------------------------------------------------- Dependency: github.com/fatih/color -Version: v1.10.0 +Version: v1.9.0 License type (autodetected): MIT Contents of "LICENSE.md": @@ -3571,7 +3573,8 @@ License type (autodetected): Apache-2.0 -------------------------------------------------------------------- Dependency: go.elastic.co/apm -Version: v1.9.0 +Version: v1.8.1 +Revision: 2aef45b9cf4b License type (autodetected): Apache-2.0 Contents of "NOTICE": @@ -3902,7 +3905,7 @@ Contents of "LICENSE": -------------------------------------------------------------------- Dependency: golang.org/x/net -Revision: 69a78807bb2b +Revision: 942e2f445f3c License type (autodetected): BSD-3-Clause Contents of "LICENSE": @@ -4004,7 +4007,7 @@ Contents of "LICENSE": -------------------------------------------------------------------- Dependency: golang.org/x/sys -Revision: 5cba982894dd +Revision: 201ba4db2418 License type (autodetected): BSD-3-Clause Contents of "LICENSE": 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 index d09e46315cf..dafd2ede07c 100644 --- a/apmpackage/apm/0.1.0/data_stream/logs/fields/ecs.yml +++ b/apmpackage/apm/0.1.0/data_stream/logs/fields/ecs.yml @@ -1,3 +1,293 @@ +- name: url + description: | + A complete Url, with scheme, host and path. + fields: + - name: scheme + description: | + The protocol of the request, e.g. "https:". + - name: full + description: | + The full, possibly agent-assembled URL of the request, e.g https://example.com:443/search?q=elasticsearch#top. + - name: domain + description: | + The hostname of the request, e.g. "example.com". + - name: port + description: | + The port of the request, e.g. 443. + - name: path + description: | + The path of the request, e.g. "/search". + - name: query + description: | + The query string of the request, e.g. "q=elasticsearch". + - name: fragment + description: | + A fragment specifying a location in a web page , e.g. "top". +- name: http + fields: + - name: version + description: | + The http version of the request leading to this event. + - name: request + fields: + - name: method + description: | + The http method of the request leading to this event. + - name: referrer + description: Referrer for this HTTP request. + ignore_above: 1024 + - name: response + fields: + - name: status_code + description: | + The status code of the HTTP response. +- name: labels + description: | + A flat mapping of user-defined labels with string, boolean or number values. +- name: service + description: | + Service fields. + fields: + - name: name + description: | + Immutable name of the service emitting this event. + - name: version + description: | + Version of the service emitting this event. + - name: node + fields: + - name: name + description: | + Unique meaningful name of the service node. +- name: transaction + fields: + - name: id + description: | + The transaction ID. +- name: trace + fields: + - name: id + description: | + The ID of the trace to which the event belongs to. +- name: agent + fields: + - name: name + description: | + Name of the agent used. + - name: version + description: | + Version of the agent used. + - name: ephemeral_id + description: | + The Ephemeral ID identifies a running process. +- name: container + title: Container + type: Container + 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 + description: | + Unique container id. +- name: host + description: | + Optional host fields. + fields: + - name: architecture + description: | + The architecture of the host the event was recorded on. + - name: hostname + description: | + The hostname of the host the event was recorded on. + - name: name + 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 + description: | + IP of the host that records the event. + - name: os + title: Operating System + group: 2 + type: Operating System + description: | + The OS fields contain information about the operating system. + fields: + - name: platform + description: | + The platform of the host the event was recorded on. +- name: process + description: | + Information pertaining to the running process where the data was collected + fields: + - name: args + level: extended + description: | + Process arguments. May be filtered to protect sensitive information. + - name: pid + description: | + Numeric process ID of the service process. + - name: ppid + description: | + Numeric ID of the service's parent process. + - name: title + description: | + Service process title. +- name: observer + fields: + - name: hostname + description: | + Hostname of the APM Server. + - name: version + description: | + APM Server version. + - name: type + description: | + The type will be set to `apm-server`. +- name: user + fields: + - name: name + description: | + The username of the logged in user. + - name: id + description: | + Identifier of the logged in user. + - name: email + description: | + Email of the logged in user. +- name: client + fields: + - name: 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 + fields: + - name: 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: Destination + 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 + 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 + description: IP addess of the destination. Can be one of multiple IPv4 or IPv6 addresses. + - name: port + level: core + format: string + description: Port of the destination. +- name: user_agent + title: User agent + type: User agent + 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 + description: | + Unparsed version of the user_agent. + multi_fields: + - type: text + - name: name + description: | + Name of the user agent. + - name: version + description: | + Version of the user agent. + - name: device + title: Device + type: Device + description: | + Information concerning the device. + fields: + - name: name + description: | + Name of the device. + - name: os + title: Operating System + type: Operating System + description: | + The OS fields contain information about the operating system. + fields: + - name: platform + description: | + Operating system platform (such centos, ubuntu, windows). + - name: name + description: | + Operating system name, without the version. + - name: full + description: | + Operating system name, including the version or code name. + - name: family + description: | + OS family (such as redhat, debian, freebsd, windows). + - name: version + description: | + Operating system version as a raw string. + - name: kernel + description: | + Operating system kernel version as a raw string. +- name: cloud + title: Cloud + group: 2 + type: Cloud + description: | + Cloud metadata reported by agents + fields: + - name: account + fields: + - name: id + level: extended + description: Cloud account ID + ignore_above: 1024 + - name: name + level: extended + description: Cloud account name + ignore_above: 1024 + - name: availability_zone + level: extended + description: Cloud availability zone name + ignore_above: 1024 + - name: instance + fields: + - name: id + level: extended + description: Cloud instance/machine ID + ignore_above: 1024 + - name: name + level: extended + description: Cloud instance/machine name + ignore_above: 1024 + - name: machine + fields: + - name: type + level: extended + description: Cloud instance/machine type + ignore_above: 1024 + - name: project + fields: + - name: id + level: extended + description: Cloud project ID + ignore_above: 1024 + - name: name + level: extended + description: Cloud project name + ignore_above: 1024 + - name: provider + level: extended + description: Cloud provider name + ignore_above: 1024 + - name: region + level: extended + description: Cloud region name + ignore_above: 1024 - name: error description: | Data captured by an agent representing an event occurring in a monitored service. 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 index c46239863cc..d0aba4a4f17 100644 --- a/apmpackage/apm/0.1.0/data_stream/logs/fields/fields.yml +++ b/apmpackage/apm/0.1.0/data_stream/logs/fields/fields.yml @@ -1,3 +1,188 @@ +- name: processor.name + description: Processor name. +- name: processor.event + description: Processor event. +- name: timestamp + fields: + - name: us + description: | + Timestamp of the event in microseconds since Unix epoch. +- name: url + description: | + A complete Url, with scheme, host and path. +- name: http + fields: + - name: request + fields: + - name: headers + description: | + The canonical headers of the monitored HTTP request. + - name: response + fields: + - name: finished + description: | + Used by the Node agent to indicate when in the response life cycle an error has occurred. + - name: headers + description: | + The canonical headers of the monitored HTTP response. +- name: service + description: | + Service fields. + fields: + - name: environment + description: | + Service environment. + - name: node + - name: language + fields: + - name: name + description: | + Name of the programming language used. + - name: version + description: | + Version of the programming language used. + - name: runtime + fields: + - name: name + description: | + Name of the runtime used. + - name: version + description: | + Version of the runtime used. + - name: framework + fields: + - name: name + description: | + Name of the framework used. + - name: version + description: | + Version of the framework used. +- name: transaction + fields: + - name: sampled + description: | + Transactions that are 'sampled' will include all available information. Transactions that are not sampled will not have spans or context. + - name: type + description: | + Keyword of specific relevance in the service's domain (eg. 'request', 'backgroundjob', etc) + - name: name + description: | + Generic designation of a transaction in the scope of a single service (eg. 'GET /users/:id'). + multi_fields: + - type: text + - name: duration + fields: + - name: count + - name: sum + fields: + - name: us + - name: self_time + description: | + Portion of the transaction's duration where no direct child was running + fields: + - name: count + - name: sum + fields: + - name: us + - name: breakdown + description: | + Counter for collected breakdowns for the transaction + fields: + - name: count +- name: trace +- name: parent + fields: + - name: id + description: | + The ID of the parent event. +- name: agent +- name: container + title: Container + type: Container + 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. +- name: kubernetes + title: Kubernetes + type: Kubernetes + description: | + Kubernetes metadata reported by agents + fields: + - name: namespace + description: | + Kubernetes namespace + - name: node + fields: + - name: name + description: | + Kubernetes node name + - name: pod + fields: + - name: name + description: | + Kubernetes pod name + - name: uid + description: | + Kubernetes Pod UID +- name: host + description: | + Optional host fields. + fields: + - name: os + title: Operating System + group: 2 + type: Operating System + description: | + The OS fields contain information about the operating system. +- name: process + description: | + Information pertaining to the running process where the data was collected +- name: observer + fields: + - name: listening + description: | + Address the server is listening on. + - name: version_major + description: | + Major version number of the observer +- name: user +- name: client +- name: source +- name: destination + title: Destination + group: 2 + type: Destination + description: |- + Destination fields describe details about the destination of a packet/event. + Destination fields are usually populated in conjunction with source fields. +- name: user_agent + title: User agent + type: User agent + 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: device + title: Device + type: Device + description: | + Information concerning the device. + - name: os + title: Operating System + type: Operating System + description: | + The OS fields contain information about the operating system. +- name: experimental + description: Additional experimental data sent by the agents. +- name: cloud + title: Cloud + group: 2 + type: Cloud + description: | + Cloud metadata reported by agents + fields: + - name: account + - name: instance + - name: machine + - name: project - name: error description: | Data captured by an agent representing an event occurring in a monitored service. 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 index cfec7bbd2fb..d9c305b9f85 100644 --- a/apmpackage/apm/0.1.0/data_stream/metrics/fields/fields.yml +++ b/apmpackage/apm/0.1.0/data_stream/metrics/fields/fields.yml @@ -1,3 +1,184 @@ +- name: processor.name + description: Processor name. +- name: processor.event + description: Processor event. +- name: timestamp + fields: + - name: us + description: | + Timestamp of the event in microseconds since Unix epoch. +- name: service + description: | + Service fields. + fields: + - name: environment + description: | + Service environment. + - name: node + - name: language + fields: + - name: name + description: | + Name of the programming language used. + - name: version + description: | + Version of the programming language used. + - name: runtime + fields: + - name: name + description: | + Name of the runtime used. + - name: version + description: | + Version of the runtime used. + - name: framework + fields: + - name: name + description: | + Name of the framework used. + - name: version + description: | + Version of the framework used. +- name: transaction + fields: + - name: sampled + description: | + Transactions that are 'sampled' will include all available information. Transactions that are not sampled will not have spans or context. + - name: type + description: | + Keyword of specific relevance in the service's domain (eg. 'request', 'backgroundjob', etc) + - name: name + description: | + Generic designation of a transaction in the scope of a single service (eg. 'GET /users/:id'). + multi_fields: + - type: text + - name: duration + fields: + - name: count + - name: sum + fields: + - name: us + - name: self_time + description: | + Portion of the transaction's duration where no direct child was running + fields: + - name: count + - name: sum + fields: + - name: us + - name: breakdown + description: | + Counter for collected breakdowns for the transaction + fields: + - name: count + - name: root + description: | + Identifies metrics for root transactions. This can be used for calculating metrics for traces. +- name: span + fields: + - name: type + description: | + Keyword of specific relevance in the service's domain (eg: 'db.postgresql.query', 'template.erb', 'cache', etc). + - name: subtype + description: | + A further sub-division of the type (e.g. postgresql, elasticsearch) + - name: self_time + description: | + Portion of the span's duration where no direct child was running + fields: + - name: count + - name: sum + fields: + - name: us +- name: agent +- name: container + title: Container + type: Container + 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. +- name: kubernetes + title: Kubernetes + type: Kubernetes + description: | + Kubernetes metadata reported by agents + fields: + - name: namespace + description: | + Kubernetes namespace + - name: node + fields: + - name: name + description: | + Kubernetes node name + - name: pod + fields: + - name: name + description: | + Kubernetes pod name + - name: uid + description: | + Kubernetes Pod UID +- name: host + description: | + Optional host fields. + fields: + - name: os + title: Operating System + group: 2 + type: Operating System + description: | + The OS fields contain information about the operating system. +- name: process + description: | + Information pertaining to the running process where the data was collected +- name: observer + fields: + - name: listening + description: | + Address the server is listening on. + - name: version_major + description: | + Major version number of the observer +- name: user +- name: client +- name: source +- name: destination + title: Destination + group: 2 + type: Destination + description: |- + Destination fields describe details about the destination of a packet/event. + Destination fields are usually populated in conjunction with source fields. +- name: user_agent + title: User agent + type: User agent + 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: device + title: Device + type: Device + description: | + Information concerning the device. + - name: os + title: Operating System + type: Operating System + description: | + The OS fields contain information about the operating system. +- name: experimental + description: Additional experimental data sent by the agents. +- name: cloud + title: Cloud + group: 2 + type: Cloud + description: | + Cloud metadata reported by agents + fields: + - name: account + - name: instance + - name: machine + - name: project +- name: event - name: system description: | `system` contains local system metrics. @@ -61,21 +242,143 @@ - name: mem.usage.bytes format: bytes description: Memory usage by the current cgroup slice. -- name: transaction +- name: processor.name + description: Processor name. +- name: processor.event + description: Processor event. +- name: timestamp fields: - - name: root + - name: us description: | - Identifies metrics for root transactions. This can be used for calculating metrics for traces. + Timestamp of the event in microseconds since Unix epoch. +- name: service + description: | + Service fields. + fields: + - name: environment + description: | + Service environment. + - name: node + - name: language + fields: + - name: name + description: | + Name of the programming language used. + - name: version + description: | + Version of the programming language used. + - name: runtime + fields: + - name: name + description: | + Name of the runtime used. + - name: version + description: | + Version of the runtime used. + - name: framework + fields: + - name: name + description: | + Name of the framework used. + - name: version + description: | + Version of the framework used. +- name: agent +- name: container + title: Container + type: Container + 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. +- name: kubernetes + title: Kubernetes + type: Kubernetes + description: | + Kubernetes metadata reported by agents + fields: + - name: namespace + description: | + Kubernetes namespace + - name: node + fields: + - name: name + description: | + Kubernetes node name + - name: pod + fields: + - name: name + description: | + Kubernetes pod name + - name: uid + description: | + Kubernetes Pod UID +- name: host + description: | + Optional host fields. + fields: + - name: os + title: Operating System + group: 2 + type: Operating System + description: | + The OS fields contain information about the operating system. +- name: process + description: | + Information pertaining to the running process where the data was collected +- name: observer + fields: + - name: listening + description: | + Address the server is listening on. + - name: version_major + description: | + Major version number of the observer +- name: user +- name: client +- name: source +- name: destination + title: Destination + group: 2 + type: Destination + description: |- + Destination fields describe details about the destination of a packet/event. + Destination fields are usually populated in conjunction with source fields. +- name: user_agent + title: User agent + type: User agent + 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: device + title: Device + type: Device + description: | + Information concerning the device. + - name: os + title: Operating System + type: Operating System + description: | + The OS fields contain information about the operating system. +- name: experimental + description: Additional experimental data sent by the agents. +- name: cloud + title: Cloud + group: 2 + type: Cloud + description: | + Cloud metadata reported by agents + fields: + - name: account + - name: instance + - name: machine + - name: project - name: profile fields: - name: id description: | - 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. - name: duration 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. + 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 fields: - name: ns 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 index dcc4484392a..0d57b6586b0 100644 --- a/apmpackage/apm/0.1.0/data_stream/traces/fields/ecs.yml +++ b/apmpackage/apm/0.1.0/data_stream/traces/fields/ecs.yml @@ -122,8 +122,7 @@ - name: args level: extended description: | - Process arguments. - May be filtered to protect sensitive information. + Process arguments. May be filtered to protect sensitive information. - name: pid description: | Numeric process ID of the service process. @@ -175,15 +174,265 @@ fields: - name: address level: extended - 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. + 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 - description: |- - IP addess of the destination. - Can be one of multiple IPv4 or IPv6 addresses. + description: IP addess of the destination. Can be one of multiple IPv4 or IPv6 addresses. + - name: port + level: core + format: string + description: Port of the destination. +- name: user_agent + title: User agent + type: User agent + 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 + description: | + Unparsed version of the user_agent. + multi_fields: + - type: text + - name: name + description: | + Name of the user agent. + - name: version + description: | + Version of the user agent. + - name: device + title: Device + type: Device + description: | + Information concerning the device. + fields: + - name: name + description: | + Name of the device. + - name: os + title: Operating System + type: Operating System + description: | + The OS fields contain information about the operating system. + fields: + - name: platform + description: | + Operating system platform (such centos, ubuntu, windows). + - name: name + description: | + Operating system name, without the version. + - name: full + description: | + Operating system name, including the version or code name. + - name: family + description: | + OS family (such as redhat, debian, freebsd, windows). + - name: version + description: | + Operating system version as a raw string. + - name: kernel + description: | + Operating system kernel version as a raw string. +- name: cloud + title: Cloud + group: 2 + type: Cloud + description: | + Cloud metadata reported by agents + fields: + - name: account + fields: + - name: id + level: extended + description: Cloud account ID + ignore_above: 1024 + - name: name + level: extended + description: Cloud account name + ignore_above: 1024 + - name: availability_zone + level: extended + description: Cloud availability zone name + ignore_above: 1024 + - name: instance + fields: + - name: id + level: extended + description: Cloud instance/machine ID + ignore_above: 1024 + - name: name + level: extended + description: Cloud instance/machine name + ignore_above: 1024 + - name: machine + fields: + - name: type + level: extended + description: Cloud instance/machine type + ignore_above: 1024 + - name: project + fields: + - name: id + level: extended + description: Cloud project ID + ignore_above: 1024 + - name: name + level: extended + description: Cloud project name + ignore_above: 1024 + - name: provider + level: extended + description: Cloud provider name + ignore_above: 1024 + - name: region + level: extended + description: Cloud region name + ignore_above: 1024 +- name: event + fields: + - name: outcome + level: core + 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 + description: | + A flat mapping of user-defined labels with string, boolean or number values. +- name: service + description: | + Service fields. + fields: + - name: name + description: | + Immutable name of the service emitting this event. + - name: version + description: | + Version of the service emitting this event. + - name: node + fields: + - name: name + description: | + Unique meaningful name of the service node. +- name: transaction + fields: + - name: id + description: | + The transaction ID. +- name: trace + fields: + - name: id + description: | + The ID of the trace to which the event belongs to. +- name: agent + fields: + - name: name + description: | + Name of the agent used. + - name: version + description: | + Version of the agent used. + - name: ephemeral_id + description: | + The Ephemeral ID identifies a running process. +- name: container + title: Container + type: Container + 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 + description: | + Unique container id. +- name: host + description: | + Optional host fields. + fields: + - name: architecture + description: | + The architecture of the host the event was recorded on. + - name: hostname + description: | + The hostname of the host the event was recorded on. + - name: name + 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 + description: | + IP of the host that records the event. + - name: os + title: Operating System + group: 2 + type: Operating System + description: | + The OS fields contain information about the operating system. + fields: + - name: platform + description: | + The platform of the host the event was recorded on. +- name: process + description: | + Information pertaining to the running process where the data was collected + fields: + - name: args + level: extended + description: | + Process arguments. May be filtered to protect sensitive information. + - name: pid + description: | + Numeric process ID of the service process. + - name: ppid + description: | + Numeric ID of the service's parent process. + - name: title + description: | + Service process title. +- name: observer + fields: + - name: hostname + description: | + Hostname of the APM Server. + - name: version + description: | + APM Server version. + - name: type + description: | + The type will be set to `apm-server`. +- name: user + fields: + - name: name + description: | + The username of the logged in user. + - name: id + description: | + Identifier of the logged in user. + - name: email + description: | + Email of the logged in user. +- name: client + fields: + - name: 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 + fields: + - name: 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: Destination + 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 + 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 + description: IP addess of the destination. Can be one of multiple IPv4 or IPv6 addresses. - name: port level: core format: 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 index 8c69bbffb61..f2769698086 100644 --- a/apmpackage/apm/0.1.0/data_stream/traces/fields/fields.yml +++ b/apmpackage/apm/0.1.0/data_stream/traces/fields/fields.yml @@ -247,6 +247,190 @@ - name: ms description: | Age of a message in milliseconds. +- name: processor.name + description: Processor name. +- name: processor.event + description: Processor event. +- name: timestamp + fields: + - name: us + description: | + Timestamp of the event in microseconds since Unix epoch. +- name: service + description: | + Service fields. + fields: + - name: environment + description: | + Service environment. + - name: node + - name: language + fields: + - name: name + description: | + Name of the programming language used. + - name: version + description: | + Version of the programming language used. + - name: runtime + fields: + - name: name + description: | + Name of the runtime used. + - name: version + description: | + Version of the runtime used. + - name: framework + fields: + - name: name + description: | + Name of the framework used. + - name: version + description: | + Version of the framework used. +- name: transaction + fields: + - name: sampled + description: | + Transactions that are 'sampled' will include all available information. Transactions that are not sampled will not have spans or context. + - name: type + description: | + Keyword of specific relevance in the service's domain (eg. 'request', 'backgroundjob', etc) + - name: name + description: | + Generic designation of a transaction in the scope of a single service (eg. 'GET /users/:id'). + multi_fields: + - type: text + - name: duration + fields: + - name: count + - name: sum + fields: + - name: us + - name: self_time + description: | + Portion of the transaction's duration where no direct child was running + fields: + - name: count + - name: sum + fields: + - name: us + - name: breakdown + description: | + Counter for collected breakdowns for the transaction + fields: + - name: count +- name: span + fields: + - name: type + description: | + Keyword of specific relevance in the service's domain (eg: 'db.postgresql.query', 'template.erb', 'cache', etc). + - name: subtype + description: | + A further sub-division of the type (e.g. postgresql, elasticsearch) + - name: self_time + description: | + Portion of the span's duration where no direct child was running + fields: + - name: count + - name: sum + fields: + - name: us +- name: trace +- name: parent + fields: + - name: id + description: | + The ID of the parent event. +- name: agent +- name: container + title: Container + type: Container + 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. +- name: kubernetes + title: Kubernetes + type: Kubernetes + description: | + Kubernetes metadata reported by agents + fields: + - name: namespace + description: | + Kubernetes namespace + - name: node + fields: + - name: name + description: | + Kubernetes node name + - name: pod + fields: + - name: name + description: | + Kubernetes pod name + - name: uid + description: | + Kubernetes Pod UID +- name: host + description: | + Optional host fields. + fields: + - name: os + title: Operating System + group: 2 + type: Operating System + description: | + The OS fields contain information about the operating system. +- name: process + description: | + Information pertaining to the running process where the data was collected +- name: observer + fields: + - name: listening + description: | + Address the server is listening on. + - name: version_major + description: | + Major version number of the observer +- name: user +- name: client +- name: source +- name: destination + title: Destination + group: 2 + type: Destination + description: |- + Destination fields describe details about the destination of a packet/event. + Destination fields are usually populated in conjunction with source fields. +- name: user_agent + title: User agent + type: User agent + 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: device + title: Device + type: Device + description: | + Information concerning the device. + - name: os + title: Operating System + type: Operating System + description: | + The OS fields contain information about the operating system. +- name: experimental + description: Additional experimental data sent by the agents. +- name: cloud + title: Cloud + group: 2 + type: Cloud + description: | + Cloud metadata reported by agents + fields: + - name: account + - name: instance + - name: machine + - name: project +- name: event - name: view spans format: url - name: child diff --git a/apmpackage/apm/0.1.0/docs/README.md b/apmpackage/apm/0.1.0/docs/README.md index e14230020b3..91064346ce3 100644 --- a/apmpackage/apm/0.1.0/docs/README.md +++ b/apmpackage/apm/0.1.0/docs/README.md @@ -1 +1,886 @@ -### TODO... +# APM Integration + +Lorem ipsum descriptium + +## Compatibility + +Dragons + +## Configuration parameters + +Maybe RUM? + +## Traces + +Lorem ipsum descriptium + +**Exported Fields** + +| Field | Description | Type | ECS | +|---|---|---|:---:| +|processor.name|Processor name.|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) | +|timestamp.us|Timestamp of the event in microseconds since Unix epoch.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|url.scheme|The protocol of the request, e.g. "https:".|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.domain|The hostname of the request, e.g. "example.com".|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.path|The path of the request, e.g. "/search".|keyword| ![](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.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) | +|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) | +|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.headers|The canonical headers of the monitored HTTP request.|object| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|http.request.referrer|Referrer for this HTTP request.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.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.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) | +|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) | +|service.name|Immutable name 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) | +|service.environment|Service environment.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.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.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.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.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) | +|transaction.id|The transaction ID.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.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.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.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.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.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.breakdown.count||long| ![](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.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.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) | +|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) | +|parent.id|The ID of the parent event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.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.ephemeral_id|The Ephemeral ID identifies a running process.|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) | +|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) | +|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.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.ip|IP of the host that records the event.|ip| ![](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) | +|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) | +|observer.listening|Address the server is listening on.|keyword| ![](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.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.type|The type will be set to `apm-server`.|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.id|Identifier 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) | +|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) | +|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) | +|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) | +|user_agent.original|Unparsed version 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.version|Version of the user agent.|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.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.name|Operating system name, without the version.|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.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.version|Operating system 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) | +|experimental|Additional experimental data sent by the agents.|object| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.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) | +|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) | +|transaction.duration.us|Total duration of this transaction, in microseconds.|long| ![](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.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.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.tbt|The Total Blocking Time 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.sum|The sum of longtask durations|scaled_float| ![](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.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.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.message.age.ms|Age of a message in milliseconds.|long| ![](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.event|Processor event.|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) | +|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) | +|service.name|Immutable name 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) | +|service.environment|Service environment.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.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.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.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.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) | +|transaction.id|The transaction ID.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.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.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.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.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.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.breakdown.count||long| ![](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.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.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) | +|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) | +|parent.id|The ID of the parent event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.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.ephemeral_id|The Ephemeral ID identifies a running process.|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) | +|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) | +|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.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.ip|IP of the host that records the event.|ip| ![](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) | +|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) | +|observer.listening|Address the server is listening on.|keyword| ![](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.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.type|The type will be set to `apm-server`.|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.id|Identifier 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) | +|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) | +|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) | +|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) | +|user_agent.original|Unparsed version 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.version|Version of the user agent.|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.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.name|Operating system name, without the version.|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.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.version|Operating system 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) | +|experimental|Additional experimental data sent by the agents.|object| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.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) | +|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) | +|view spans||keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.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) | +|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.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.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.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.duration.us|Duration of the span, in microseconds.|long| ![](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.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.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.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.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.message.age.ms|Age of a message in milliseconds.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | + + +### Example + +```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 + +Lorem ipsum descriptium + +**Exported Fields** + +| Field | Description | Type | ECS | +|---|---|---|:---:| +|processor.name|Processor name.|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) | +|timestamp.us|Timestamp of the event in microseconds since Unix epoch.|long| ![](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) | +|service.name|Immutable name 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) | +|service.environment|Service environment.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.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.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.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.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) | +|transaction.id|The transaction ID.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.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.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.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.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.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.breakdown.count||long| ![](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) | +|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.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.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) | +|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.ephemeral_id|The Ephemeral ID identifies a running process.|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) | +|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) | +|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.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.ip|IP of the host that records the event.|ip| ![](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) | +|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) | +|observer.listening|Address the server is listening on.|keyword| ![](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.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.type|The type will be set to `apm-server`.|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.id|Identifier 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) | +|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) | +|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) | +|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) | +|user_agent.original|Unparsed version 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.version|Version of the user agent.|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.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.name|Operating system name, without the version.|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.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.version|Operating system 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) | +|experimental|Additional experimental data sent by the agents.|object| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.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) | +|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) | +|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.total|Total memory.|long| ![](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.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.size|The total virtual memory the process has.|long| ![](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.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) | +|processor.name|Processor name.|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) | +|timestamp.us|Timestamp of the event in microseconds since Unix epoch.|long| ![](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) | +|service.name|Immutable name 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) | +|service.environment|Service environment.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.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.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.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.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) | +|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.ephemeral_id|The Ephemeral ID identifies a running process.|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) | +|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) | +|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.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.ip|IP of the host that records the event.|ip| ![](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) | +|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) | +|observer.listening|Address the server is listening on.|keyword| ![](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.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.type|The type will be set to `apm-server`.|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.id|Identifier 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) | +|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) | +|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) | +|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) | +|user_agent.original|Unparsed version 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.version|Version of the user agent.|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.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.name|Operating system name, without the version.|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.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.version|Operating system 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) | +|experimental|Additional experimental data sent by the agents.|object| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.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) | +|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.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.cpu.ns|Amount of CPU time profiled, in nanoseconds.|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.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.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.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.function|Function name for the top stack frame.|keyword| ![](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.line|Source code line number for the top stack frame.|long| ![](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.function|Function name for a stack frame.|keyword| ![](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.line|Source code line number for a stack frame.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.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 + +Lorem ipsum descriptium + +**Exported Fields** + +| Field | Description | Type | ECS | +|---|---|---|:---:| +|processor.name|Processor name.|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) | +|timestamp.us|Timestamp of the event in microseconds since Unix epoch.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|url.scheme|The protocol of the request, e.g. "https:".|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.domain|The hostname of the request, e.g. "example.com".|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.path|The path of the request, e.g. "/search".|keyword| ![](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.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) | +|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) | +|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.headers|The canonical headers of the monitored HTTP request.|object| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|http.request.referrer|Referrer for this HTTP request.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.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.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) | +|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) | +|service.name|Immutable name 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) | +|service.environment|Service environment.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.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.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.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.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) | +|transaction.id|The transaction ID.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.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.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.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.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.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.breakdown.count||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) | +|parent.id|The ID of the parent event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.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.ephemeral_id|The Ephemeral ID identifies a running process.|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) | +|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) | +|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.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.ip|IP of the host that records the event.|ip| ![](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) | +|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) | +|observer.listening|Address the server is listening on.|keyword| ![](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.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.type|The type will be set to `apm-server`.|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.id|Identifier 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) | +|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) | +|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) | +|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) | +|user_agent.original|Unparsed version 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.version|Version of the user agent.|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.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.name|Operating system name, without the version.|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.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.version|Operating system 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) | +|experimental|Additional experimental data sent by the agents.|object| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.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) | +|error.id|The ID of the error.|keyword| ![](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.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.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.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.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.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) | + + +### 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/cmd/gen-package/main.go b/apmpackage/cmd/gen-package/main.go index 247f2be6483..a49b9bdc031 100644 --- a/apmpackage/cmd/gen-package/main.go +++ b/apmpackage/cmd/gen-package/main.go @@ -19,6 +19,7 @@ package main import ( "flag" + "github.com/elastic/apm-server/apmpackage" ) @@ -27,5 +28,6 @@ var ecsDir string func main() { flag.StringVar(&ecsDir, "ecsDir", "../ecs", "Path to the Elastic Common Schema repository") flag.Parse() - apmpackage.GenerateFields(ecsDir) + inputFields := apmpackage.GenerateFields(ecsDir) + apmpackage.GenerateDocs(inputFields) } diff --git a/apmpackage/docs/README.template.md b/apmpackage/docs/README.template.md new file mode 100644 index 00000000000..c9d26d5a9f0 --- /dev/null +++ b/apmpackage/docs/README.template.md @@ -0,0 +1,70 @@ +# APM Integration + +Lorem ipsum descriptium + +## Compatibility + +Dragons + +## Configuration parameters + +Maybe RUM? + +## Traces + +Lorem ipsum descriptium + +**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}} + +### Example + +```json +{{.TransactionExample}} +``` + +```json +{{.SpanExample}} +``` + + +## Metrics + +Lorem ipsum descriptium + +**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 + +Lorem ipsum descriptium + +**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/apmpackage/gendocs.go b/apmpackage/gendocs.go new file mode 100644 index 00000000000..aadf21572ee --- /dev/null +++ b/apmpackage/gendocs.go @@ -0,0 +1,97 @@ +// 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 apmpackage + +import ( + "encoding/json" + "io/ioutil" + "os" + "path" + "strings" + "text/template" +) + +func GenerateDocs(inputFields map[string][]FieldDefinition) { + // TODO sort alphabetically + data := FlattenAPMFields{ + Traces: flatten("", inputFields["traces"]), + Metrics: flatten("", inputFields["metrics"]), + Logs: flatten("", inputFields["logs"]), + TransactionExample: loadExample("transactions.json"), + SpanExample: loadExample("spans.json"), + MetricsExample: loadExample("metricsets.json"), + ErrorExample: loadExample("errors.json"), + } + t := template.New("apmpackage/docs/README.template.md") + tmpl, err := t.Funcs(map[string]interface{}{ + "Trim": strings.TrimSpace, + }).ParseFiles("apmpackage/docs/README.template.md") + if err != nil { + panic(err) + } + file, err := os.OpenFile("apmpackage/apm/0.1.0/docs/README.md", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644) + if err != nil { + panic(err) + } + err = tmpl.ExecuteTemplate(file, "README.template.md", data) + if err != nil { + panic(err) + } +} + +type FlattenAPMFields struct { + Traces []FieldDefinition + Metrics []FieldDefinition + Logs []FieldDefinition + TransactionExample string + SpanExample string + MetricsExample string + ErrorExample string +} + +func flatten(name string, fs []FieldDefinition) []FieldDefinition { + var ret []FieldDefinition + 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/genfields.go b/apmpackage/genfields.go index 12dd4a26974..befec183521 100644 --- a/apmpackage/genfields.go +++ b/apmpackage/genfields.go @@ -1,35 +1,51 @@ +// 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 apmpackage import ( - "gopkg.in/yaml.v2" "io/ioutil" "path/filepath" + + "gopkg.in/yaml.v2" ) -func GenerateFields(ecsDir string) { +func GenerateFields(ecsDir string) map[string][]FieldDefinition { // TODO remove all field files before generate them // TODO get this from GH directly ecsFlatFields := loadECSFields(ecsDir) - inputFieldsFiles := map[string][]string{ - "logs": {"model/error/_meta/fields.yml"}, - "metrics": {"model/metricset/_meta/fields.yml", "model/profile/_meta/fields.yml"}, - "traces": {"_meta/fields.common.yml", "model/transaction/_meta/fields.yml", "model/span/_meta/fields.yml"}, + inputFieldsFiles := map[string][]FieldDefinition{ + "logs": concatFields("model/error/_meta/fields.yml"), + "metrics": concatFields("model/metricset/_meta/fields.yml", "model/profile/_meta/fields.yml"), + "traces": concatFields("model/transaction/_meta/fields.yml", "model/span/_meta/fields.yml"), } - for streamType, fieldsFiles := range inputFieldsFiles { + for streamType, inputFields := range inputFieldsFiles { var ecsFields []FieldDefinition var nonECSFields []FieldDefinition - for _, fieldsFile := range fieldsFiles { - for _, fields := range populateECSInfo(ecsFlatFields, concatFields(fieldsFile)) { - 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) - } + 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) } } // TODO handle version better @@ -51,6 +67,7 @@ func GenerateFields(ecsDir string) { writeOutFields("fields.yml", nonECSFields) } } + return inputFieldsFiles } func populateECSInfo(ecsFlatFields map[string]interface{}, fields []FieldDefinition) []FieldDefinition { @@ -111,11 +128,13 @@ func loadECSFields(ecsDir string) map[string]interface{} { return ret } -func concatFields(fileName string) []FieldDefinition { - fs := loadFieldsFile(fileName) +func concatFields(fileNames ...string) []FieldDefinition { var ret []FieldDefinition - for _, key := range fs { - ret = append(ret, key.Fields...) + for _, fname := range fileNames { + fs := loadFieldsFile(fname) + for _, key := range fs { + ret = append(ret, key.Fields...) + } } return ret } diff --git a/apmpackage/model.go b/apmpackage/model.go index 275a20311cd..2fe640fb20b 100644 --- a/apmpackage/model.go +++ b/apmpackage/model.go @@ -75,3 +75,9 @@ func copyFieldRoot(f FieldDefinition) FieldDefinition { HasNonECS: f.HasNonECS, } } + +type APMFields struct { + Traces []FieldDefinition + Logs []FieldDefinition + Metrics []FieldDefinition +} diff --git a/docs/fields.asciidoc b/docs/fields.asciidoc index 18927bd3349..7dfd68c506e 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 @@ -14458,16 +14441,6 @@ type: keyword Kubernetes node name -type: keyword - --- - -*`kubernetes.node.hostname`*:: -+ --- -Kubernetes hostname as reported by the node’s kernel - - type: keyword -- diff --git a/include/fields.go b/include/fields.go index e5b178fc68e..7d98e410e78 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 "eJzs/XtTHDmWMIz/359CPzbih5ktkipuxrzvRDw00N3E2pgxeHqnxxugylRVaciUsiUluPqJ/e5v6BxJqbwAhU3Zbg+zz+OmqjKlo6Ojc9O5/Af59eDd6cnpz/8/ciSJkIawjBtiZlyTCc8ZybhiqcnnA8INuaWaTJlgihqWkfGcmBkjx4fnpFTyXyw1gx/+g4ypZhmRAr6/YUpzKcgo2U2GyQ//Qc5yRjUjN1xzQ2bGlHp/Y2PKzawaJ6ksNlhOteHpBks1MZLoajpl2pB0RsWUwVd22AlneaaTH35YJ9dsvk9Yqn8gxHCTs337wA+EZEynipeGSwFfkZ/cO8S9vf8DIetE0ILtk9X/Y3jBtKFFufoDIYTk7Ibl+ySVisFnxX6vuGLZPjGqwq/MvGT7JKMGPzbmWz2ihm3YMcntjAlAE7thwhCp+JQLi77kB3iPkAuLa67hoSy8xz4aRVOL5omSRT3CwE7MU5rnc6JYqZhmwnAxhYnciPV0vRumZaVSFuY/mUQv4G9kRjUR0kObk4CeAZLGDc0rBkAHYEpZVrmdxg3rJptwpQ283wJLsZTxmxqqkpcs56KG653DOe4XmUhFaJ7jCDrBfWIfaVHaTV/dHI5214c765tbF8O9/eHO/tZ2srez9dtqtM05HbNc924w7qYcWyqGL/DPS/z+ms1vpcp6Nvqw0kYW9oENxElJudJhDYdUkDEjlT0SRhKaZaRghhIuJlIV1A5iv3drIuczWeUZHMNUCkO5IIJpu3UIDpCv/d9BnuMeaEIVI9pIiyiqPaQBgGOPoKtMptdMXREqMnJ1vaevHDo6mPy/K7Qsc54CdCv7ZGUi5fqYqpUBWWHixn5TKplVKfz+vzGCC6Y1nbJ7MGzYR9ODxp+kIrmcOkQAPbix3O47dOBP9kn384DI0vCC/xHoztLJDWe39kxwQSg8bb9gKmDFTqeNqlJTWbzlcqrJLTczWRlCRU32DRgGRJoZU459kBS3NpUipYaJiPKNtEAUhJJZVVCxrhjN6DhnRFdFQdWcyOjExcewqHLDyzysXRP2kWt75GdsXk9YjLlgGeHCSCJFeLq9kb+wPJfkV6nyLNoiQ6f3nYCY0vlUSMUu6VjesH0yGm5ud3fuNdfGrse9pwOpGzoljKYzv8omjf0zJiGkq82V/4lJiU6ZQEpxbP0gfDFVsir3yWYPHV3MGL4ZdskdI8dcKaFju8nIBifm1p4ey0CNFXATtxVUzC3OqT2FeW7P3YBkzOAfUhE51kzd2O1BcpWWzGbS7pRUxNBrpknBqK4UK+wDbtjwWPt0asJFmlcZIz8yavkArFWTgs4JzbUkqhL2bTev0glINFho8he3VDeknlkmOWY1PwbKtvBTnmtPe4gkVQlhz4lEBFnYovUpN+TtjKmYe89oWTJLgXaxcFLDUoGzWwQIR40TKY2Qxu65X+w+OcHpUqsJyAkuGs6tPYiDGr7EkgJxmsiYUZNE5/fg7A3oJE5yNhfkdpyW5YZdCk9ZQmraiLlvJplHHbBdUDQInyC1cE2sfCVmpmQ1nZHfK1bZ8fVcG1ZokvNrRv6LTq7pgLxjGUf6KJVMmdZcTP2muMd1lc4sl34tp9pQPSO4DnIO6HYow4MIRI4oDOpKfTrGFc+zxPMpN0v7RPed6TtPdfskHX80TGRWPNupGiibuH3HPfK07BQZZNdWoxFuACPDKaRi3jMenDSKCEf9IwxpT0Cp5A3P2MAqJLpkKZ/wlODboPhwHdQzh8GI0xTMKJ5a2gm66Euri5IXtMh2t9cGJOdj+Bm//ucu3dxie5O9ydZwsjMcjsZ0a3ubbbOd7Wwve5WO9zbT8Wj4Mg0g2vUYsjncHK4PN9eHO2Rza3803B8NyX8Oh8MheX9x+D8BwxNa5eYScLRPJjTXrLGtrJyxgimaX/KsuanMbccTbKyfg/DMcr4JZwq5AtfufLzgExAsIH30WnuLudVQVAFan1fMaaqkthuhDVWWTY4rQ66QQnh2BcfMHrDuDu3RbYvoSQMR7eU/DU2/F/x3q7Y+ft1BjbKcB/kVvHcL+tqYEeBOvIcA3fKyxvLsv8tYoNNGgW3GjL6zg5pQfAqlHGoWU37DQB2lwr2GT7ufZywvJ1VueaPlAG6FYWBzK8lPjk8TLrShInXqaUvMaDsxyBpLJE5LIrWWxEqqgDOEsbkmgrEM7crbGU9n3akCw05lYSezZlO07pOJ5R9eoMBSUdL4r+TEMEFyNjGEFaWZd7dyImVjF+1GLWMXL+blPdvnhZidgND8ls410cb+G3BrVXw986SJ2+qsLHzXKmlJjRoRRHHAav0skribaMzqR0Az4ZPGxtc71iaAxuYXNJ1ZU6+L4ngcj2fHuJeA6r87kdBEdgum3WSYDNdVuhlrp7qhmlZGClnISpNzkPQPqKkHgtD6FVQOyIuD8zU8mE7pdIClUggGjoATYZgSzJAzJY1MpZf7L07O1oiSFUjDUrEJ/8g0qUTGUE5b6atkbgez3E0qUkjFiGDmVqprIkumqJHK6rHedmczmk/sC5RYNSZnhGYFF1wbezJvvM5sx8pkgQo2NcS5I3ARRSHFgKQ5oyqf1xIQbJcArcx5Ogd7YcZAZbALTBbWg0RVjIOeep+ozGVQxhpb4UQCjkNonssUdGYHUWebnBoZvg4E73bRDfTi4Px0jVQweD6vJY5GmyigHs/ESWPdEemNdka7rxoLlmpKBf8D2GPSFSOfoyaA9XkZYzlidd5sJ11LnoDqrAodazTkPnWntQdvozXBfB08/CylpcHXrw+jM5jmvGUiHtbf3GMjHrg37WHz9Ei1I0BuuD0LSPp+m9wRdLqvBw5tP8WmVGVgE1iVXwo9iJ5He2DM0YvKpaA5meTyliiWWnO54ZG4ODxzo6JkqsHswGa/sI9HkMEB1EwES9A+c/6PU1LS9JqZF3otgVnQiVE6FtKZCr2FVrVrTOpNWAW6NtMWDmdkeSwZRYWmAExCzmXBgtlTaTQfDVMFWfEuUKlWaoeJYhPPrRwoorVAjUfP/ezMe9zZMQvmLZj3EQLcsbRgianf5nqKGH50VDgi8hNY6VXpyiLEjVrb1VxY8P5VCdwAMLPRcPYO6p7BavwKaTpDWsUK92sdTrT3DAZ/Io634ecJHmA4PKiq0SwjmhVUGJ4C72cfjdPq2EfU1weoRHmOoINuZyS54Xa5/A9W+0zsQpkCC05zU1G3HScTMpeVCnNMaJ574vMSwXLTqVTzgX3UKyXa8DwnTOhKOQ3UuZ2t4pIxbSx5WJRahE14ngeGRstSyVJxalg+f4S9TLNMMa2XZVMBtaNzxNGWm9DpP4HNFGM+rWSl8zlSM7wTGOatRYuWBQN3O8m5BnfkydnAmscoZ6Ui1AqWj0RLSycJIf+oMRv0wVo7wnOg6K2HydP9VeK+uEKUNbVMQbiJlMisQpcwisarhJdXFpSrBMG6GpCMlUxkTs1HHV2KGgjw1Lgdq7Wo5N9OgFOdPMvw2JM1N0w/oNpHe49+n+ZrDUB+tD+g0y5cnLkz6UgCWWd3q/a2G4AhYS/B6HA8HMdPGnNOmUxSbuaXS3IQHFqdvXd33lgbgTlXYgMcKQwXTJhlwXQaOSvCZB34TqUyM3JQMMVT2gNkJYyaX3ItL1OZLQV1OAU5OX9L7BQdCA8P7gRrWbvpQOrd0EMqaNbFFLDHh43pKZOXpeRBNjXvfKSYclNlKK9zauBDB4LV/0tWcrhBXH+5leyOtve2hgOyklOzsk+2d5Kd4c6r0R7539UOkE/LE1s+QM3UupfH0U+o8Xv0DIjzgaAWJidkqqiocqq4mceCdU5SK+BB7YwE6KGXm8HDhBTOFWpUKbMSwynfk1xK5QTPADwqM16rtrWEQvByUs7mmts//MVV6o+1jkA4lSa6nYdrOY5+hwIE5JRJv9quH2YstZFiPUs7e6PYlEuxzJP2Dma476Ct/+3wLriWdNQcTL0n7W8VG7Mmonj5AAzhgcYsJ2dBR/MMEWXFi5Ozm22rb52c3eyuNWVGQdMlLPjNwWE/LM3JBTVJe7G9Z7V/wasX1mZE0+fkzE7kDAEMIjo9uAhWNXnBkmniXEQ0j61/giak9x417ivCAYgMSWupgk9RTEkuaUbGNKcihfM44YrdWjsGDHclK3tMW2qrXXQplXmc1uo1F20U71dlY2zY8f8s+ECD9RFKXGPVZ/j2J6lsm004OnuyiCZ5936cuT24i/gty9GGKZZd9imLTyezrMUy49MZ0yaa1OMI5x7AQsqSZR5kXY29jhn2/6f64gZlTzScMzAnUkHIT+KeS1JZrBCuyUr8RftGCYOf3E1RxgxTBUjYUrGUa2tCgXuEolEL1+YQ9FWNc54SXU0m/GMYEZ55MTOm3N/YwEfwCWs6rSXkQs0trRqJ/oCP3Eo0lJrjOdG8KPM5MfS63lc0gnOqDVxXYOQT2ttCGgK23C3Lc1j9xeuj+qp+JZVJdb3SFZERNhpUYWR5CRTwBYiCTSb2DN8wO6vTVdw2vmAXr4/WBnhLcy3krfDerwZYxOF+4N2MgKOS1pTvxgPR16Wf9rxh2OiK0KIICOjPTThANHfRTL0Ti1EPfN+gm0ozlSyXZGJTCz3SUqGf106Ol08FA/+HnNzFNaggr48OziB0BVd8FIaKaWW1uzpWUJ4vaXFWrycwgddbki4AkyrPe1TEP6XHxS54VRO7JJgOLAd6Q3lOx3lXSz3Ix0wZcsyFNsyRWAM34ED9agQIsy+fAnGRSwuu6QaY+FgpXJ+/AwdX40aZU2O1kB5CRTiXaAfHO4GTdYGYUT1bmhmOmAK+Y+fBKDGlmFV/O9Fm1DEoQaiQYh6H+6IiF5HKe81clMoVrIJn6KmGD3Z1VyEcLZVigntF88acVGRWJNU3NMRHcfcR1VKCle6IVUKU9WzW0xm+X42jnc+swo3eEogF5aK76IilUWBpXVQombddyk9GuAdKUQjgBoKEmbyrCHIcmqHdLYBX/7lyzcdU0EuIplgZkBXFrNXCxfTSDogh0PfgrL77lhUCHq6+/Rd333xjBgzBMxZuSGAoAte5E0VDVHy9DLzCwqgqbztBbBW5M753Qt7UcZdcxwFgVJDjw00M/7LHbMJMOmMa3GLR6IQb7UKqayDtEW1mAjRCurkOgUVNENy4qhIuVluxQpoQhkRkZTTPWDRTGzKEiRIXTOwX5ElH1K86l14zaQEHrQeCqGk3ubdv7bBc16A6hD3mkjMFh/PyxNvqRY0gnAuixeOrH56FDADHuuYk45MJU7F3AhyXHOLercC3DGfdMEGFIUzccCVF0Qx7q2nr4NfzMDnPBv5aCeifvH33MznJMEYfwhyqNhftauK7u7svX77c29t79epVLzqX6Y3uItSzP5pzqu/BZcBhwNHn4RJVyA42M67LnM5jhSq2gTFbbz1jN/fzrQirqKHynJv55R/1DfGTM+poHmLnsfjBa2ngFMCAatbU4dWVXmdUm/VRy7Pr4hqXd8hOfDzryZGXJgCrZ21tQPn6aHNre2f35d6rIR2nGZsM+yFeIh0HmOPI4y7UkcsavuwG0D4ZRG88d41iae9Fo9lMCpbxqunMcXmtX4SlurliZtV3aBtH9Cy8MyAHf1ixXX/TkwwxX3eTLHpa/fq/DA/0GMBrlkXXjpyrufp+dlXMyePXf8OzhQJUPvvu26MAJkz8quM0T3qrB4TahQ7INC0HAUNSkYxPuaG5TBkVXU35VjeWhZdlS1qUuyv7RHYbK7kyY5eaTwW1CmlD25UZI+eNX+5Wey9mTLN2PmDD2gP9ccwFVXOYlIRJ9eKhyJg08oAJNpYyZ1T0oe1H/AkMYVqCCs4x/trBYtHnov26loVRFXvAdqhB1YaaamnBcAdZxl2oaxfLQOlMWf6WWksfQenJT6nQjHdZgVOrDKdqXho5VbSc8ZQwpaTCtN3OqDc051l8Uy8VMarSxs9HXjN6w0glomhOPIb+1foVfz7r8cOwt1ZFE+mMpdd9yWfH7969fXf5/vTi3fvzi+Ojy3dv314svEcVJqAv6UL7HIdvCOxA+oHf1eFBPFVSy4khh1KVspGe8+BSAI1sEQl6z/FYPTdSMbT64q3s2R6Szpq3Xn+3e0ohArh+/a73IOcQ86x9yOMA7EHLx8KQaOC5+Egp8nkz5XY8J0bKXLvcRvBSQrYcS6/R4kM67JDM4w4yEOtn4rWf76CHFkRKkwPdMGV1k4zQqTVtI2/QjNU8VJimzdF73GgD+Q+cpUUQUwsOYPKOjIPMiL+8Jz8gPNiMAXfR2Z3yDVFCuUtOdUAGKJAI3P2au9CXk3iQqBZIJKtmLC8jpyi4DzAQIAytnWNCzK1kNTxoPYtIrGX6LevF86yp/POCTpdqjMRKFUwWQgsRIEtomLQrRR9ohk6XBFlNWQ4uOm3dUkUVSu6fPqpUck+tkraZBrO6sh+NeZe4HfWi6+ipoIcizS5LEcXRSUEFnSLz57omhI4ShRVSIj4SpSLEnOSo9fU9vCR69P6UFWS40dMQjoiRNRvNQiE9Y0ZZKg/lpyD7cfkp32ICRSP/Y6EsiiBlXHGhJ8qiCMNCNsVzFsVzFsW/dxZFfDB9XJ6rJNbery+VShGzwud8iud8iqcB6TmfYnGcPedTPOdT/InyKWIZ9k0kVUQALS2zgpd2tnjpD6QTsEYeQan4DTWMHL35ba0vkwCOAhgX31QyBUTvRx4Xt1Lww9S4MZKM54CJIwZl4p5+hctIj3iELvblciTupOWvnSiRddTE52yJ52yJ52yJ52yJ52yJ52yJ52yJ52yJ52yJ52yJ52yJ7zVbIstRjvr7u9ev4eP9deQXiRmDiJmcjxVVnGmSzQUt0Gb0CJU086X6XVVwcCq5n99QMXf1N+Oq4q4YniQrekYh07sxz4qr6B5CwcFV5aMBx1Vo3wIhKszgeNA8hea5R/pE5rm85WK676H5CznCBaznXFy7+ebkxVWS5fnVmivp6e1hKcivXGTyVtfvnyO4bzG26MVVomXfe+8F/7gOymln7R1YGmDMcz7uG7Cg6dvzxS8zm4GFyZ8ocq8F+XMg37cfyNfesu8nrq+1sucwv2WF+bUQ/Rz1dweerGqcFNnOkhjim6MdnOJR8OgZHS0JoPNfDkafBtHmzu7yYNrc2f00qHacs3opUO2MNh8H1ZI4dMOsd8pNW2zWRYILWmrv4Y95OvTmk4JkXF93j801U4LlW5uJ13wXSXWhZln2609VniPEdpLO2lvAH+5/cIrlB6ymv7X54ZMWxBKq0hk3LA1ZIksIbzx7T+JpiKFqykxwZdhld5b4cXf7EauwIoqK+ZIWcBIqiOE0HTIb+KSkjEBHrKLkOVuHWOMnVSdKlkSALXu1rVCFT1jsGY3jOR5enB3+sreXxdOv7qbZ2OKRK9tNtpJXu8NhMnq5Pdp5xBJ5US7TDXaAzq8Q211KZVwO+dkxnjRyIIiDgqyvQ1kDeIxEcBH7S9rszDjhYspUqbhwmWDctXcjdGKg0DpizAXn+vxyq5lhpfZaI1JU6GAtaTKzOpBM00opq2JiTCc2VXHNxqAbh1E0WFsAPeb9NbUpJfBhWvdOvb29TSZcMTYHRrExzuV0w8wUo2bdmpyWN21sDkfbG8PRhlE0veZiul7Q/JYqto7IWbcTcjFNZqbIu9JkmO7uDbfSbfZqc3Nk/8hSuvNqd4vSbGs3yyaPIBDfsewSDsNSM5LdSfgcbnZ+dnByepEc//fxI5boGhsue11ums9Z30pg1x8+Hhx7bw78/Tb4ZVAEr9yPgOBoE42+OEen5/DxHkfbT42geDvh0ek5+b1icACtPUaFvmVRS1X7u6tL4uwyxuEshl4IddMaP9aclIpLcKlNGXaNc8O6QV9cZUJDPvo+PH+15pobzv0k8ehwi+R7KaD7u24z6UbEaUOMv8bLT6pjF5yDAa3HW6ZYvXeoPnCN43ShxFev1h4Twt9Y8cLJJS0WLAgFp65bMaLSvYF3uzSdubmIdr1JFDOVEtEthO9E7Op6RtovI3Aldc3mDi919LzfAMSzZr4pbiM5YDwnx4fndXOrd9hoBccCXgwcNHZoFfVy8Ec/uSC39q3jw3M3fDse0O6lpbGodSH2FoNfmgke9jlPy+TAkIILXlTFwH0ZxvWLKiptGu1Lr+wsVxY4KG/TWQbX9YXmwBoOYUhqR0tBcHLje2hTTUqpNR/jJWEGfUOs/kdrt59zgPssgH5AqSYp9p1rZJW0yC5Jc7q0/BEsIUAxrC5siM/0yZBioE+kCwbD9jsdjnhy2gt6VJtoKYEpAG3EAjHUqNWm2x0ORrEwkI9qxVdLJjLtL0yxM5zlSh4l8YB+7R0xPxom/v/1YmHZNSCiy2hLcVHxgBbopMRmNLrZ3o86x56ckMPTgzfH9kCMmUWWfT+/sdpXxJxWVzW5whvOmsWYKJtICt8eUSrFdCktioOXOhoEzmVCTgKvEtL48Jj2mL6z9BU0UfKpK1dWvDDoCt/ZFqvg3RU95bfGmEUCRe4KMbzw13EQ/XkD7n7LumHBgIHeXfAOVJrOYs7OJsCYGmlPXKdUZSxLyG9MSV/SogAH5MxdCCIPrRE4rrGGU/SkmfQT6hLLylzM6pIyn8hjgDab7i9GM6YuJ7lvzb0M08nfxG6SnBlr0Vg2iTMTmLlRcKXEjoN17ZF9cnAwIBeHA/LuaEDeHQzIwdGAHB4NyNHbDs26j+vk3VH9ZzOdY2lBJXaH7NIw6jaOCKAa7kAyr3yUSk4VLZAC0eNmIkK2j4Dyhblu0UCQRFryOj0OuYPuMaQ3R6NRY92y7Anzf/LFu2tVKfDuB/UozE53dyvXXEDoK6qpDc2VhIbyccwhdMI2Hnd1DzfM88BhUBMGzMCNdzzmnTj62/vjd/9o4Ciwxi+mMrhufE5coPXxoHbQ4ODLFIwgEVugxYIv+IZbVQeFFOvg0YC2uumMKpoaa2+8GLNc3pKtTciDtRCQ0ebu2iCifakbb9S8PNhB2DWR6ZSW9kxRzchoCCJkCnN8ODo6Wqv18B9pek10TvXM2XW/VxJyDMPIbqiEXNCxHpCUKsXplDnjQaOSmvMoG3bCWBaPkEpxw5QL6/9gBuSDwrc+CKA/5i7oHidkwz5/9TD259D1byl0PdBFwP8y6SFMAnZe7UNwK6y7/XaotMss3EAzsAtzw8vcJeYBMwwzDWrc6Gq8adc5ahDLoIH0GsLGrbk3YesxVgZII0ISoyjPoREwU1z2a7/9SH9OHEAW+Jw48LjEgZqAvoyV4Iyl+zWLg4ODpnrsLdbLz0kBPOg46vKcnJxZRY5Bfb6r2MFx1fI0+B+vvMPP0Q6fTHha5eBHqjQbkDFLaaWDE/qGKs7M3FtIMaUW1GhrGdqhHFgJOf5olG/PC/BFVT88oGbGFDgFwAEaIeeq1lnpNYPBvVMLWyBl7KN9u7BUEg+NegG+BL8zqjkEXYYR60a4qK5YDXciuxWEg4nTdqA0vxu1NxjU4S9hDfi5+tN/T99CdFsDuiWejdX4cARfvg9CygYO0VYxBfprSi/oN1yX0IruAiA4a8pvmIZOw9EtQqP1MDyWKhYH/2VCh1EmCFv7OmBRKGoAvG/fef4bQLTml8LXvimZcut/IUv0weZzO4SWMggWZ7Lh6VhLyIHIoDJ5KkVtvTqsNs/+3XcS3qtvjTnHEzq8NLh/Q8XLtHHbc3z40G3PG2boeuyy9hXTnE968WKbvdfoUXiOYr9XXLEMig8+QczO8eF5uFMHORbwaxejiZEJuWKpTtxDV5ic48GomSBoRsB6Km2wZihcYOedVt+E/DpjAvcMNjBVUkcKGxcZT5km6+vOVequMSxAFp8659OZyfvKr0ergfejcPGcwY26YVPl7q9p9i8Lqs8yTmesoC38k0Ygfw/pjJJhMowpRynZKM53HL5YOCifiuhOzsUQA/nOwbkR8Pgem88XqD/gc+4yqCwZFFnKGRb7t2j2jADyZ1JqpdAtSp/gzMC950azfFJb21Tg6I+4kVtSwQdAJnp+WpcKCOC9jrglpeP4cKgeCJy36QEwosSZnsV6j1VjYG1oen1ptYvvIYPxAsOJ02sCKwo3QIBRS6xlDjeF7GNIMgD1p7ci65fRfcOGD2I7BeOxwfUWBy+wjykr69oBEff4F72hSU7FNDmt8vxMwjXFsX88Ziuhm75nK+GL+9mKO9J99T4hqvmjuSMDIpfegsHSoIqnDfYQuNCBfZRAGRpXxA45RltMe+EMrT8LZmZ4dAO7qo2H1zIwK5AlXKR55ZqYwG0ONeEODYwvMa3HCDXV7UT1Itx4fijqc5Ys4UHeFbZPwb4sNNRvc752tHFCoQo3pr8YB3MwLsUwwCp8fpC6ISkZM3NrNX/qW1xSp+Kom3D/jJNxwQ2HyHK7VbnUdm0HficeRrdVvaQfEm7URYU1sXJSMKorxQpsgQOZAX2YjR6DaHZDr1mg4RjNMXnUOC5YISE+hWk7jB8uqzENc2dQncSfTlaAg79SLCHnDPf8CrPorOy7wmVz4+qwA5/wsRiQIRqu+MMRjkMVHKR2Xm2s6d6Q64u1olmgKNYnmw84erAZ/KVEs0ymc3yEsk8YMxjHS4joLXICFXqBBGqtdEaFx2tKDZtKMAX8+GFzLcO4AoSs0yy7GpArd27W4dww+GrCc7aOmn92hXdK/malISBA5Y+iWVyoYw4U1tfAptJMrZdUa4vMdQxKaqoZDvTlbAdmecFBmpCJtYysenmIc/pahhjmhUY3KK7U4I7U/jGwX5yTy22NHcgDT2acKarSWRws396bWiPE7V4Z8ykZV1BBZ8XCF43ImW462iIlPTdMOW7XmmLf7ewVmTthETR3bKzlHF/usTAm5AZxM3d3aqhsc408K5/HTbncjHZTrny8KHetgGhcvUxXYw9Wm+rD+N6yc/OCW43muby1EFpzM21ulJM7bkmRd44aq0fA1gQTJMJk11qszMxqf1F5vLvV3qfzLpw4lTONrj9DLB0sCio/gMkNaZ8R5qIitD6Wq9IsCI2M6UYrJqdzalKJqCLtgCg2pSrL490H7g9PE6vHVPYPqYhdHph2YGKhoJE3TIGUgVBmrzJ5ZY/HW8J8yCbqOeTkqLsN27vbe03kIwd6gBdktX+iiV93GnCQTi82tgHy8dYaroG3glSccBVljSlGgbdZ6pzCnkhlP4NjpeQly6FFzx00nXGrQ6SuHNb/gTK/hhYlsg1q4q9M3PDcxJ7zIM0ZOiCtvufLa4UwnbZIORGksCJZc1OhfTxwsYjmVpIwrTtoY9ZjhSPr9x/TOMqlEZGe0jyFrDlXWyuHcBtUjGIHlItccIGYSOI1k4jVFtgWeBWQjnsS0tIzwo3jEi1ICim4kXXgXz3E6ipYyn7H7EffcstIcs1YSaoSbxbgpfhwNbFqLW2EtIlHK1rxxKU0H8Q7W1/7RpUm4tTBzeFod324s765dTHc2x/u7G9tJ3s7L39rhidm1FDNHqqJ9vn1W3CaVsSaaGAEb1vgghxTAqz6IaMmVtaEkMqLG6zYR9OGnMnldOBMwlxO1wbx5EGKGOl0nHldYjo6r6ksoiqZ2OuxBhs2HdIhCuDZUHBASBOcXTC81Xsac4OpF6LnCplVeU36WJEHKxKg1kNJJrH3o+gM0yNsSprOWBLhImxvpRapz9pT8671JhdlZS79j4IK6SLkvP1XmfgBqt/wPOe9z+CdG9DIqJdwjtzUDbcagdvBMG2TkpBPIdbtmcfPzJpNirl7SVPfAzYCHvt4kWc0MLvIvClg95R3agUxsUgw110ipQa1I03aggTpzQpO/71XqwLgVtbANaIcg7nYaj6xxOykX6iekRclUzNaanv4tLHfRIlFa3AfSG+dJDPSbgDFq6rIHVRIoY2yyweXAfhirebYJvq67V/fXwc/Hh59MUffyZFdTehscHdNlz26PdkZDrMmZGLKupUDFtdJLoJMALoIXJUqxW98ZCaDGsGK5i7Q1EjV0TBAt/BFVUAZuKoFTqyLt+jSqwv5PCR6JY5T1pI417IzekObiicoGBUmTs7H9B4rr6OGGSQoUETT214b+EQ4o9KeLjT6rRmmdVVYjUFIYtcG1s4gaApO9vrbqpmSQuZy2qhsY0WNvPaRAlzvN3BF/t/24upv/HZfLSSzd5LRcPTbwiUArnmbGX1jdq6P6/okQxedO3jJaAda96O0fZOQt+LVhvhn02mX4bkuBuVAJzz040V3c8bVkg93pLXfpNeCdnHD3mpBfodq+7TiekZozpTxigychYZ3rBWKgEKrOVpLR8U1kpm8dfq4RRVA0MgViwQcmVGR5RBvOGNzuD27taayMNExVcyuGZyV9ZeoZgBClMzrVXMDo8BJh95NEJSljSWG2xmDJLUQ6Y79tOHuz8BN4bTKqQoh+LXpqKxy1aPy5O1qXg2dammKLM4SJZ9ANDSspa0puotyZz6AgYK8qioxc9eRVcpKCIPCodGiyKspaAJdT0p9U0/hJAivPaM+fACqIMjftYE/NzjyVSskrWEK1lcR4Aa0z9+lZzaw7nn/MvD+zjJ19tEE54ElZ2G4CqfvvSP/e7SGO4xoq7HD/RBD7S6T6WXUajTj2momGThGsbgfmLOQT8yymuit9u9CeiA62CjObrwtfXWJe9PD6s9ZSUavyHBvf3N3fzRET/fh8U/7w///f4w2t/+fc5ZWdgH4iWBGM3RyYgq/GyXu0dHQ/VFrgZYX6ArO6aSyclkbWZYs8y/gf7VK/zoaJvb/RiTT5q+bySjZTDZ1af462tzaDKr/HddosjLWVvqm5Y21qD5V3Lj1XfmQvYwJiNmOmRkKkcjvSj3i4XqnNiMpz60iE3wsJVM+IjuIFOi/gD4czG9mWa9WcyqNy2pAjc/n+0LuvbsdiHz/WcNriQwEc8FastCyb1+sKGL4tThrIWYA7dPRiYdiktdukmiBEegHVjqIAL/XTSkG0IFcKGXlTTjyIqwNP7uENBTZYdA6ihe1NLdGMP/rSoB1Im2oxxQMchSxdvRIROoQl4W8Wt5AVZp4gxfa1ps4+MRtbBzY9VOlgJ5qtAiXXOuYPXjTIHnXKrxay9Rd+uE+3KGFmAbDq2vq2MFrFExaN7eWMvysZhZ74/etknHV6LpMxTxoMWCXcsgv9ICRTDJktQW9rndHM6F7pItDa4PFLLkB9ep5iGLrO2foV4ZThRLbB9yez7VzRnXd0K/lNHK7Fqg/NWRtHTrnbTUvZnpavBAtJ+aWKnZfopY7LKABnM91YRW2mTFltgauZThZuhq77mRu4HbxyTDiCyw3NKjr2ay7Ja57sbR+UFlrSkzX7qq+1NhGxaheWtWX1XcwOrmdzePgNH/Z32VSXQ9sz1WpHc01IVSGp6CdOtZqMeoIPNzBNm5Tw7i/QuiUO0P49lWTp7ghA/9wdzTuFcTbVU/zHlysq7pnFx+u3lvlr8ktG9tj9NGHuIsWPNGQ9vRmTHAndhSDaPFaqw+yoQVeYKONfUYgkSivxrlMr1lGNDfsqodoLiAiHzgSFaQSzOdgNvXfBw1gqPUa+fKWQGxuAvL+3WuSc3HtY/3vLxfq6bJNdX4UrE8LAQc8jQMY3GmNRiAHkfk4CIpPo7xEZDHvg61khbViKGELKeBqD8RuuB7E/o2dnfGVdlznwyjbAhtzbvzHcAiOt4W3iOvrSx3piXdpjpNc0t6gt3dcXxMYAYwlxaXiGHLfZoba8SuiZV6B9yfKyXuvmbtKgqXBZY67+EJ9wJ7e5A7YL4VUxQJEduciVk/BMcX/YBkM+8CCBhgRo1MK96FhEUNLN6PhsMeZV1DuqgS7GudzWcG+N69XnFRAbgJJwjoCSDdv0+wQt845p5mlJ1EvA7HmInVBU8Kqxi2HubZ8ZbEj+rieR+duYN9/8w6xDqGErUchXhnh99dQcBGjO5fiA7gTpNfNygbsI00NkSpzkRPB8RLdjsd34+FYB+dtuBbpYOuGRW3inqRtEebVYqhXmKB5fhpC877by19DBYNgMIQR40oHUQINPuUvWXywAY3i9z130om7catKL7yjYKCwExA65mblzoRPpdBcm1j3dpQZ+91AHbDaVm+5EafnhfWMmUUz1Fy7yuU00fB74n9PUpmxq8QzX/91LWJj13YdvY2lgNwUHWWlcUWKXM233aqP5snR+Vri8xsbbwQV3JE14UYTeSvCjJiaYWV8nXMRxk1liSFYdy83itkJC+5KkZdNmjZ0oZZn91+a4Y3cg9dmLggtvjiLKAIv0OogjTtuzuw5/aNuRbyEtKD7DdXGkuyBqBmH3eGwIPRruVBYB3NTH8kVo5nXy5yw9oRe335EYhIPoCcOrPx3y3XDqk9TVmKefZjUJ7xB9Qxqj78UYP6dHLnJV44rJUu2cVBow1RGi5UoB5+Ox4rdoJ3rHz+/WFlDs5P88st+UdTMhNPcP7U+3NkfDlfWWmy0G/P9jXmqzIyrTwwAhFi5phOqFde2oqvxOkYCroCkHyBJYVRdJDtIrcx3oguRPJGnDwgTdr91FC7o+GoGt+0ycn7hoiAZtlR2S0HpdI4dn2foGufd4a9daiCf8y3NS9ZWVSq1rBZUq23zQcDYUNzQa2TSdTCu7BG+YdrwqV9d08uzgGUhsGKnGxpzerhYz1hpZp3RUSS5G7Da4YOXuyLOvnDZiwKMT1LmNGV32id32CX1kf8s+6SY91goMMXGzubLUcay8fpkZzxc394c7a3vvZwM17dpur33cki39ibsfuvF08OEuysml2Hxk/98T4LFAdZ+bkXjQzmZzu0kJDpoMrZ6UTNU0SUM2F8hctOHyNux3cL9/v8ExbFdeTqndkVeQzjgcN/gd8jnIPjPVGQbUtWLJY2Yq4GrjxJc1OM5Tnnib13Im/rO658/nbz5H1+uU9fZBlbI8pTptQRfdsknzuHXisgHTwnkvrMMsdlajz+OUUyC82o+KmofIwE/QzFZfU1djIILWcixxr8futeJ77299VZqDB6EerXghUKHc0/wETVG8XHVaX+/hNJZiPcwXyz+w5fYiwfZ8w1Vc0sboXMZ+YUpDJKE2jzs44xWGjzlUFFBTpxsaXJryxWCN8hnc7jjCZXHb9gArg0gsz0b1L3irIyCXivxhR37yNLKsAGZ8SxjYgDBuPivFPl84DjkgNwqbnq81Kv/XPHPrgzICj79YCum5+Y7z813zHPzHfLcfOe5+c732XynN7HkcboD6EEwDiiDULN8QXUB4jmR2BrvN5WFNAqefCrtplYInM5FMb4L8vD69R38LdRVhmHcBqLmUJXgx7kq7FRXzuTj9qwwTa5gFdG1lUs1wSwirPsevHr20YG1NNMwnLcmPdxx9fgWvhpZp08t4rDhvguD0K2LYXNX6xSd0SaIXtlZFpShWW4oAxHMmVwC64pL/8ZZ2JniN1EgDpRddW6HyBXQWeHGTBZsg+Ye82GldrhLHOZzF9tL3EcKVFEsD3vPapuOCWDMiuXshkae5ro7ZG8sZ5S8U5ZMWTsXBUDDfQfiMw8XAnER3UW5EqBmiR1XgGWFSTp7WTq/kgdnurS6t2eKF1YQYOvkkyPy4ueTo7V7j9LqaDgcNQ98bR8uG8J234qefrXtA/BF27t9pR5uX7FR21fsxlZngiwvNfjEjl37iL2iitxNhL+9K6l9VjZ3drf2tpqnpeAFu1xiLZU3J2+OMYrfSxefewzQglHYbAiniDaKUQhxGs9N5EqoNBQAiboGcSpoItV0A++8If14o2AZp+vgCY7/Tj7OTJH/8+Tg9KBm8ZMJTznN0W/8PwMnMnz9vQTrV/VkMlr9owS9f+zqW4YxMbk2ZB5ES/d5nosy/mJ5lPTGElKMdi6ITK3aHqiL9hayWR3ubg9bJPSZGmmPQho0SQqB7GA6NI/ZEgtWn7Z7FKIwDwWovKSss03Q7HFKVgdl3pfdFqTyViwtKBLdx3aCVfCgKEg6fVg+PW0Hxa9WaAq6NUKjxsg+GbQ2EvYWi9V2lN+GfZpFSuXjlN+Nu/b+ubHjc2PHu1f73NjxubHjc2PH58aOz40dn6CxYxSxxv94ZLxqj2/XDmKPNZgm0Ql4G/uQUEmAemkusIdrsmI/9hR4H+1u7W03AEUxffmdKGMXqHSAOgYxQ/MCQlpawXnLs0Fh38AQe4FUmHEFgRgOkrUO9YWoiRBDtNRmT1ZBB3/Xe/B3qTrkPSo/++K85QxD/X4Rl9jHneGrhOZwOg2/Qea2rGvf1y4OwF1UkmheF1nw4vzgdC1BOwsM7xBm0He1Siszw1B66M0U3f3Alo4r48KN6gJZrTL5R6fnJF4xIS8gn53nWUpVptfQb8sKyvP6vS5i/5KwnGrD0ySVC98pAe651hVTCcK5TNHike8CsIABvzg8BbqxQMDteYTCgNzOal1lSPCxkV/4dEYOtK4UFSkj51DFlBwefBoSKmGWdtdRIwBmIS8O17DuXXt9788/BfioAATLlrmRR/FEbh+PPmUfD//6/nxA3v7V7+eJSAfk7fu/ttpFDcjh6V/v2fNwdD5r73OZ0ryTB/Hkm++n8fzm9VpHfbLkYTnF3zm7/ZSVSDWlwgWqLnk18VSavHj7GYf5RKSfu1iaX1aCL0uF7FszzYmd0S79/Sesva8v2iPXDxWEL6W6BPV1eYmJQXRCxWLIIsP5guC8GJBzUF3OOiR9SHM+kUpw+qglCmkuwYxcYE13eXAvOhWl462BSh2gVYNRKjTPoIcbhKF0tmtzuDlcH75cH+2S4db+aGd/69V/Dof7w+GjV4VtXJe5LEw2WWBJo1frwz1Y0mh/e7i/ufMJS8ImVZfXbH5J86ml9dkiuYufQocHfvzggvAp61gfATtqXbPuYXt3/ji5EC0qrdTNMiv6w/i4IF9sO8/tA6n7qV4WCQjGSIEg/KBvnceNv+PpIEFwbcqdzdGnYoJ9LKWoc94+xVY9dkOEDcwYOLFb2xeCLBdY1e7OztZLj/V2OZlPWOVnWuOQAGptcWcRRbunS5qijc5NV43fHLpywovCrJniNL/EJNMlEagrQohT1fmsuqqptV/aQaWAkCaZzqNSXpO4XCbscTmjLmF00OxujS5BH4gvwaTKoXOOyOrwljB03VW1g92dnZ9+/PHV4cuj4x9/Gr7aG746Gm0eHh48jiuE0MGlc7qTZnuXRkByiF+MuMGvrK4bi/fRtY8ERPQECt9wQX6W5DUVU3IIscok52NF1Rx7HXj/6JSbWTUG1+hU5lRMN6ZyY5zL8cZUjpLR9oZW6QYGO29YxMA/yVT+x+utrZfrr7d2tjr4x5CI9cfyYWesfx0LVQcT1YPRXpWeUcWyZJrLMc2DNifYwlccrUV+DQv0Mw1QD/y3YIF2YvedqweLX91hgp5f/LVWUQfk9V/PqSA/WeOS61RGJurAmikJGKRPu+/fjPXZWPknLeVrm593HdTGFn72yr4BW7O10Met5Xu2G90t7nLVor/XV8V2UqendKhu637IQ2Qow8Pm8j5/dh/vSfv8mcm4WV9KlZpjyVBMYqJ1oBeEFltYozYoIXeimdsLSveUyfBKnB0V+htj4WcscMHSGSiIdfUyC9nJmdf2pHL3xWpdV2WZ85ALsVAPP27my8onOvSMsHuDKYVRjDaLjGGuNBNLy286beQ1ucm6DWWlMjNygG20WgCCVL/kWvb0vX0alDnF4eT8bX+728ODXpCWtYMOnN5NPKSCtrIZPFU/AMqUyctSxlEqMUOTYsoN9G8TGcmpgQ/dG5n/S1ZyKVb2yfrLrWR3tL23NRyQlZyalX2yvZPsDHdejfbI/zZvw5aoM62+t0fQp4i3wnhoQM3A57dgUQU5IVNFRZVTFacqmhmbW5bDkNlEd82HceuD6JKdK1eYGSrrYF8XMsmlVM6kHASrsFuNDsHLSTmbayzACdrcANgDCpJmJlBUIRG8DFxYu1QWwP0i9ta98R5LbaRYz9LGvig2tQJliSfrHcxw38Fa/9thH0xLOloOnt6T9beKjVn6Q19eg5df4Yu7JdjFjLlkhagxZE/5InhG18narWSYuIzR4h2OG33+n/yoNVrThAwnExYM1cAK5oqIxaVaG7UVBXl9dHBmJegBVnyts6UQ/rhfy12NKJ7aD9TTdRYXheXvXX77RsjK/1L8LcY5AJT80NOYxNHnL/7zA41LZ9hjBMizpsi6xhj8HnwwoY8lV+0wNKjPE/wwyrsY7PvM9xp6c7QzgISVNaDzUjHHrRNykGUejEkocYGhdG6I8RxqUauUah9E3AQOmTH1viFXPR9qAmpWUkWNVJ7jUt2opvNCC3qN5VIGBOsezujW5c5oc+0RqtyXTi368llFXyeh6EvmEoXzJHWjE/Av/vO9dWqgKEy7To0rHA0hd5XBpg3aUBEVyzs+PId3k7/4Q3Bnse1uXReYFMr3upuy2O6JqvhKhQbNQ61nYa0uNqgZkT+jKrulig3IDVemojkpaDrjAuJ8ZHqNV4yGcgEKkD2K/1WNmRIMKpvIjD2qB+ydMfpPIv/ftqo3N+brBubv7V7ubn8tCYuyUE6ivfOk5sXsXTK2TqRF3TON1Vc7yOqqvkv6hhGlIqfM/Hjy9rwhl2Gm11xUH3vGroGOZgojgtz3xcl78nPfnl68PX8bMPOAU2TKZPINGdIAzrduTCOQ35xBHYP1jRjVFqRv3rC2QD4b19+mcW335ls0sCO4vqaR3dS6lgTJ6i9u7FgiNfqS1t3TQ0XcW1+a+cpDdgWGjT2/iplKCe2tQpDHTh16wGB9mvU4axX1gLhOzIEOePSNmmh+S+eaVPDKAEpDusrSwelQMCq4mEKhc9fll4kbriQkdsc9PULHAYzrURjp4tpLXY0ZNcCIrtpYKB/AQnig2RYT1le2Q8ODzUXTJSD3F7eZd826LBo9vZc+4RbEBdkDZUZUGVHje8E/+sLxjlFCC6vfK5pDMncYM9LlwDygyHLdtUod/VJpphJX9d0a1SRjKc+gkZNVR4GUauYu7fOtzZc6mdCC58u6/n17TnB88sJf0iiWQZnejI05FQMyUYyNdTYgt6gOdxNP8MkO3FX+hCVsv1oiUMfcwV1vZmWH7FBMYLxD5aWpxfcb+S96w9rYinrXLGGX22vA2QLYYG4reusK93cg3062k+H6aLS5DjY5T9vQP60C9a3tdVwxwaHsrs397zZmvLfzS+2sn8+dZ6v3ST0g1bgSprrvDFN1yztneLnJ1R3gF6XH0TAZbSejBrRLK7Pumrm2xIq14A9zWWXBGPd+grqZltNqMOULGvZemc2kYBmviitomnBTtLqmNTwBwSc0AM9w7ZrwydLxFXyth4QR+/SRVpXxcsEyKHcFtJ5jU/RakwtFpNHN3ty2rc2d5vRWPn6tCxfIX1zmfQusDvLzlrQ4a1o2EwCTLgBWDD9xxN1X4892wasa1DIvhieE3lCe03FPUZCDfMyUIcdcaMNazA1wg7dB3++NX7TIb/ryL4LzS98DtoBYZrENhyngO3ADB20WFIZeNXj5BGwKZFCCUCHFvOB/RAYIojB8fB8abV3BKnh2ZSkFP3jrG+2fVIoJ7lW7wLXIXL/hMKwv/dVDVEsxzbuk5HYLpuwC8XTW5FfjaOczqXzJCSgVXnv+60U3il+N2+3H4Tkl86Xlxoc6/ECQMJP3VkIBtGazsxbAq/9cueZjKuglzQouVgZkRbFSKqv2XdoBH6xgH3xcxjQiSX65uDiDz3ffLP7k7+dDcKN9KfRegjbe6KaqVO7bzGiGPeZMREt2O1TuV+raUy4eU+JfGMtsnsTlAR/ZgS5+tUlGcX2PFpgEZm3vy97ey7tBdJXsvgON4cJ5cXDj78XILyzPJbmVKs/6MbOEfbuQWHT8nt17YYEF7jxj1JoZXdtttL3Vv5kFMzO5LMG/2kApThXJpDPFJfTJOz48J6NkNxm64pl5Lm+tzTeteAaFGW5p6L6S7dcDrMDe1Z2fSFFp6IUf9X00MsS2YL+e3yum5tZkXGn4deWkBgNde2F2uPkoFXONglhKK8cUQk9O3yS8UTAT1uvr6ftOlyCsCwot2w2DNrcJIW8bA/my4QUVWaN5KhcA5GYyTIadC5Kfjy8G5Oztuf33vf1Hnl/07jn0oVVLC25/54avuyPFZNAhTZ80Ns7ltNEfqQW7LqXQ7IszSJx2UQ4ZA/n9ssj7cHI3j/S4+dJM0kH7aVzSAY39KnquFz+/M2wTp66rR+8t4/awGSWzXNcbwHWXL3MErrW6NrRhakJdHpBTvk4aX94fyhsGiMN5fYq3YqlUGeFiqpjGMEmGfzbnJQ1jBSqVoR6Jty1U+PaZqt2qlChZQQ3UXNKMjGlu2b5aC6MGVxv7GIo6h7FmVGS5lVY09CpLpRCBtZ+411FCuDGp7zAYhqlRgMD5sTQTWirXYLmkgtgVrWFp/xiOxOGnBxU9AW+LK6Y053RZZkMgEZwFr5bqHaudAoOesAG/e7Vw9M13XUofOEQtKjnUsRgQWRn3hyJZ8QfYUinYuB4MQYs+Z7J78X4j5AtEUdf4OjlqI6tB3jW2zk/fnHXOCSEnRz3cb+G6HUv0wJzEe8HupohuNWozewD+OpFnGvOp1+7jPdGnR53A0NDq1rfuKlg6o4LrgkT9vKAsqYU+SpFj9tc6GNUyunq3HgxI7UznxvW8Ejv9+CaJYf7I+m46DbFrcpgIe0j7MeE+Om6u/JerxkL8W3VR+J5u3K0VCmlgESyLx/9L6LQ5rgxR1F1d+I6cfwFfFRfuTsOqwIi+R4S8Qs3Kp6082aqi2a7NbREL9Qwb3UgLBqHCrevhcDDvK969UNHu+ojHDbdvqRarqwZaCWKoMg3wDUgmsQu3o757W5pu3FC1kcvpxqQSUOJUJ/5ALcA54rK9T3oHFwwou6oQIee3od2D1uGm2dMIMeXMTO0Q5IZSoE1XVskMrclNq4IOSGPhuiZNJatbscMgeJ0H5yNqfw67ggdobt+uL/t85/OyMvGpCmfacp/QmR3aO6Di0OoLvxYt+xy6DuNOIuu5uqVKXA3IFVPK/ofDP7XuQPOefunQmLC5rfZEqyXs60UzVtFN5CQ6tMrCbhWoa9WtFStgNvHBikdJc6p9hA0X3HDvKwgzgI7g29OStNJGFv0hG1JNfflMLPycjKU02ihaJj/6vxrIQqcBlCZPcr5Q23YrwGsEdzBkR/HFdeJCqs6j70NQHNlB+Aku3vkvYhdD68i0Vru9eedSlhkh2yaDp1pd+L5uAGcaHbQsWwxphb4hYMzcMXYL7mhSg+/Vk/W/YscFthBEUs8ZC6ST/Ive0F6kVyJdYpmMDsrddK6T3kxmHSw/QDvcl7xoLoQuRR54VtDw0lnYCqYhoBIus3wwqo/ki58I24j19oguc24wx8iQqmw0aS+pMnGg8wlGEyroAIPawJUb1t8hIPLiuEPssg4FqDIYsdlKncXADWI6bSzDL3bQWVDiAh3DmFAln+ZWJ5hjR3rsSZM6A4pixQWMS2EilaCtSEUEuwWeY5XzQt6wJslD/8yqbIN8Z/t87CuXsY8sg13JZHrpQmitiMq4puOcZURLi/mUgsgcM3DkxiGXYx9/Ba5gx7wVM4qzUHHi6hLZRM+JO2clGb0iw739zd390RAD2yFg5c2c1CpOp0RcSKUDubvAacTu53edOSe+Q7PKWDkZ+F6kQalDdaDgJmZyN5y6YRJyljOqGdGMkXc/HWqys725bbdwa7S7nfTAn0xoynNu5skyfF2r0QpdxTbiJ+zoa+3QjbC+gzSVCjVnGa3K0o5d1iCuD1f7PqjwYpSMmbllTJBhGNK+u7nVJYrNrXtxtESZF2HKqp7rY2pNvIWR1VoHEPPLvrWUiku1WPGox211a5v9PF2C/sQtZvWQXJM98pcaOf8ZtN+kyXNCAUL7vkK+Hvq3Q6yFY8WOegKhwMyjV6OeLgdbO31oDQA8/hg9eGKC1r/wiWnYgk5RgsKS0IIkYhix+VNnqrcnrjkNYKntTT05Ol8bxJaONVU6wLuTOZUW8c7Q9z9eJfeCbg0nEBvecLLAasNFaiL7zBpQVgrIEi2ZvIY7lSU6k1rGUi8onS3v5Qlhw5etB39tYggTNnMTFiICcKDfQQGRofwVNz+Cotvt3tm9wQ2KLvrYmXgaffVAeQjv4G/mtONNQ1FUwqlh6FKSN9D316qMtE6gJ6iM4ThxTrpu+OncE5+UAe9H9wExbliqtUx5/aLVXW/q4OGFLhZqy31Zx+UALZgpv2EC65bFszrfTqmkkanMnfvAG/1qzI2iikeEg804rRTGi20x1agbF9DTh6kbnjI9AEWU5lrCZHM0AOqH9fW8jNw8PP19YCUXG0t5PSDm1upyygFzG/fXtBaH5qZy2nndBfqGiSwU9iDYZwVgqYuuWSmUhSJrWHwt2MwbGdOGnJxh4xU9gCsmPSDRmLdcsVClLpKpnxF+ARVjMZs9rcK1TRhb4wUaWTnx1zqWOR0fnvd0GqK8aJBWzxVzx6p8zPXyKt4v470y9hpjSuGOjKU9NxBpa7elyWevEMF4530FSsSVRba1l7kU4XvFyLWQt2JArvxhdT+hqsLrndBV0SORdvcaCHAcxMwvl3YXFTWG845+AdnLfnHk5Awvax01UU1uWZ47JhfW449fnQ7c5H9RLW9ipMzX6VRIbazkM1RkVAGN+e67YdhJ3uxv3t/ILSpUbAkk59OZ2QjIW+fZuhUyPUrf/uztf+rT7V/+883PO2/+sbE3O1H/ffZ7uv3b3/4Y/rWxFYE0luDlWDnyg3vp79m1UXQy4WnyQbzzZZ1ZRmqrev+DIB8Ccj6QvxAuxrIS2QdByF+IrEz0ibv+Z/jJUlD9qRJAuB/EB/HrjIl4zIKWpT2zIBi0v3WwwssZM4UU3EgFLS/wcn3QdwcRjxk4FxS90AQKAtjF33B2myAMd0zsUSMVKZniBTNMISANoBeDqQakAYH9L6g8brJ45DBpstL1jAG2G3QzkeqWqoxll5+T3Vs3jMKroshRGv3k/GSlkh+7AT2jV5vJKBklTc8vp4Iut0bqycHpATnz3OEULbcXD3bJ9vxkHYHrfoH9stdqJfPc8RGQV7krOevf0o7/0JxPheNgoPGcMvNTLm+Bw2n4y8UQh3FzOfWXDD5esG9N3YYETUSLxbop3+1VcjppAiPF9840yxzLzbANpuWkXv7c5FS4h2Pvni8BgR5JGBIag//99cEpktjv61ys/45fGIrX1VwTV/8sIQe5VQiiRAUEyN9xEjtxwtEVCH+721CAPoKqdbFsxUetrlhANBOZu4W3vBC3Lbhs94abyeh3wkRKS13lTqmySmIr9KZl4fzG2PWA/MoV0zOqrpO1gPKHokLsAhK3uiWdGUB6NzakESfUOd8Lh31EK1iikfvWWWy4mLuiQO5cziNjdZadTIS2x3hOJGSySgU05pRbXZdg8ceuvZyfIXT6Vz7hDbBLml4z8wgdt0+fdYN8kkbr3u3RaetferRa/2Nt/jj9tl+v3WwGPHqmvARVavX1S88oa5UUOQ/7mIDCOCA5MOx/0dQaaiG2JhiQ355hFBJiQpiwh3oZKDx3Z9VvdqQjoFEMWZbUF5G0S/wvnCc+hsTrsjWGczq3sr/KygExaTkgvLzZXedpUQ4IM2my9u1h3qQtxC8p99xFl749PyFvZMZy1FFv4xxxT9avLRYTi7ttxGDkhCg1Swek5AUg9NtDpwW6gc8/sxz9HiRouMN3o8DTzgn6Nv7uvqKeUchqu7InOHdp7nnJILQOxmo6Hd9hxsDhVbcFMyw1Az8+hvNgbOSDI643FXlnRVo5VzCjeKqbDQ9CPYYQJ+RreeKgkEIE2bpuqRBmEoogQLbttFL1vkuiKrE4AoiWE2OnS3z9qHZtUe+U1wNyy8Zg5nGmB9auVxVU0wipSBulgvXCuL7OkdeHa9v4B3+CrYLsho1BimaES+xcarAAOkNbrB6cvXGoCW23LmL6jNzWFPOi7vBaO7nhQ8b5hFARGocB1nGdOtCF9pGySBu6Vv7vwTeswo2KwTCKpwl54wJLfq9YhQOT44vXUJoWWtbp4OEqlUyZ1pGLIgwTiigrBnccUQ9Gjw/tssAe4WpncWbApxmR/kwnLvViJtFoq7MMwLkdhdKjwW7RAHUYAtu33A83/g8pmkntRhKMzeOTuc/x8J4sQs4xY4KqouE7quWJ8263DbhW7oS//cAUCmuZ35FC4QK4DJtKxf9gAZJF2TwuIAkoSZ5TKR5tnnVw+N3nVnRW/OdMtugs6M+ssMVL+JPrbZ1FWSa8LAeIY8PA5+Uk3CoEj9w9qyNGhgMV82BIO6nvmKhiECLnhIUf2XUaOHEXFwNy7C4tajF09Oa3Afnl3YC8ZlP7hLUj2xg9w66uOMzizfmeS2Y/l8x+PEi9G/pcMvu5ZPZzyezvr2R2u2J2U6jXFy5PaLj5/PnlW25+pj+v6eZGe7bdyOekwXeQ+N0bb90l/9mtN7+iP7P51ljDd2O/+VV9QQOOi1QWcUjFpxlwdWEAiqM2jbfEs6uO8QZGWxj1AePt6M1vC6Py0yKs6giqutxQvyBfTiuFNweHdwPQmH+ZqvhhnRzdRULYrDqIEx4Eb7yLTo7Ds8ObjWDsGcvLSZXHJa5rcTepY3rCtUO4CqCY1MjyuqIQZlrGzdGbEQ5CxvnekKDIWMYyp+VjxiXClbOJIawozbwnRPQSwunOf25sxHOzBvfDt1bA/7lZw3OzhudmDU8M/Oc0ayiVzKr0CasndrJr3Qx3SK4WiHpzOGzAp5niNF9uCLS33d1kzjJvqhZLa2oxc10p2vXuwAVPDSUQ+wDq4ETJohn9plx/rKgRcQitrkeal0wnfVVpfPC7uqrVvSsv3aFETabhPyX8ByQt/CHznEEhG/Qf2L/q8IKelL6G9VzXVYzyqZ4SqX+HgRcjuPN5QYVpeaR6z+/TtGz1mxIxxLpOR60rwbs+zqf9/QMZj/E4PqaDCcXTGRIUBHM0Cs6HNMRUFiUVXmuyaiA4TRvE2MpJjFMgdSgsaVVJSA6lSlExhcicCc8Ncy5dqOntlUSo9QDBuwIe9IpmAKNez2NKkX2FRgtNdZcszTT4eqI+pi2vrtWSr0G2QUydg5h6gHQvILzS04+vENBPprIlARcvs/mntAqeTYIWju42Cf7E9sD3wiGe2Bj4E1sC37wZEKe5+FJcjnufRV/dy7RrmX83zwYZrw3Nsb4UxtH6WT18J6ausAXno90WB4fyrw3CbRYSWMQ4NP8jHhVqBIShHSA4pgtprcfCNioqXG0/ooDznb3+n2zH3Z48us3/uOJ5drlcalw9cMmNvbtmTz1AUW/TxGU2OrIIfCZQRfgmqqQbMjxTWRTckPNfDjAUQWA8OYOEZz9ET/7+ZHvyku29yrLd0Xj4am9vPNpkbDgcjl/tvdrd3dt9+XI0TLMfHmB5If9/xtJrXS2LNx264TvI8isEvfOGqVBMrpvkujfe2nyV0Vd7r7bY1vbw1av0ZbZHs510/Cp9td20taPJl7Sio2YICWRDN7lAgPxtyUQom6PkVNECjOCcimll126kIykNV7EbiuWcjnO2wSYTnvI6eJzUoftN+wDRealT2bbtn/DyMIOtEVMyk7fxgqGsXNhRF0lXaabWIW5lQKa5HNO8gxf8um8hbBF7J6Omv/eEZXyQz9sLXxNzOU+Z0Eu76niNw7vK1Zja3cacP+zN3muEEh36eDmcQmCSGzE22ZQsyPnZ0X8TP91rrg2We6mZkdSaj3NWJ8TrMvsIyfBuSL2x1uUzByVNZywMvJkMl6jp9YqIaIqacmRTsVpeke4zamZR4Ry/b7xDUHHB60qrDSD9jUOW51RtTOXGKBltJq/aLWqgQla6LBT+IgsLMvoswmTk/bvX4brLazDQsoLrWiXhdSXRu4sEhqoo0vIyS0yLyhur2Cyw6kcVEPQU0+jq0pUjm5tbD3X5fcL6a84h2tUF4LrShSd5fTMmMSwEPy/ZwJe3NzPafKSggtZFnonLPvY5XftElcWAZOX1dEDGit0OiLBfTFkxIKKCr/9FVffMq7JYdBuXq4n5DW3OEreU2Uxexcp/U+8/Jr9A355P0fx/ReOInEllLOmT448srfDPF2fHa6Hc6jelVh+evW9MQwxVU2aCUw/qR3fU7N3thbXEhlN1KeFJ0NIMp2m4vbHvgG/pRqiBp3jOoKVA1wCHAmtyYsihVKVUzczPB5a5fO0xLDXrqpGPXOkZjcO1H1iZHXvJ5lNYWss+euSydpOt5NXucJiMXm6PdhZdHy/KZXbbrSuYgRFTQKEyLEF2duyqux8IDwVZX4cuJPAYieAi9hcXEeLzjydcTJkqFReGjLmgijNsAULoxDAFPa0sutAWDd3aU5mx9bhHBnHFObzZqrFot0zTSimrnaMSivn+6QxuNKDImVE0mL0APdb+erAi2u3tbTLhirE5NuEb53K6YWaKUbOuGHY42NgcjrY3hqMNo2h6zcV0vaC51TvWETnrdkIupsnMFHlXIA3T3b3hVrrNXm1ujuwfWUp3Xu1uUZpt7WbZZFHq8JXOL+EYLDvQ0iLyczjY+dnByelFcvzfx4uub7k34GFRfdfgj1zcSuDPHz4eHHtpC3+3L1tW7l99tPbUh3N7BSD66v6LxoU8f36K/mtCe5zDVWHdgdslaTcbzUH9Uz8c4dlGRIpRq51QhR9ulK789CV04p4YJog2dK59uzmcinCjWT4hVITdtasqObIZ+yDa3b4sHVxPILh1Sshi+sx0WfHtq6E9tEcSVVMoCKIHdtHQ6RnxaBdEx1rmlWG+mVLNCmeMsKC4RazsDbZYxXtcxEyppNWaII+AQzf8aM86PMl9XEdjb8zFhg7sfZ2s5+HPSgcFfZ2Mhon9v9FuB5GXkDP2OIuo5WpgYmqCbPLEYseGm+t5fzeFWgr5cElfjMWVPbQosJ/GVXrNDKGC5nPNNZGCzORtGLKw+lrYJHJrDebADaDzNVXxGSJvQIyEF1zP26jXBHf+JtQgdKVLnnJZ6brTdkdOPEKPzdil5lNBwfHMPnL9YGmssZQ5o6IP9z/iT3H7Fj6Bjo1uhricXRvoVaMq9kC78jshx+afSzuFDznCU6YMemx9H9KeAN6ItnwzulTNSyOnipYznmJ3KF0f53jUG5rzLM69gyZ1lTZ+PquV3DBSibrEh2t54V+tX/HZpvX4YdhbqkklwAvOenqYHb979/bd5fvTi3fvzy+Ojy7fvX178albVkHm1bIy1s5x+IZwhutnqEStntROaq0MkLyQ6/aes7R6bqRi2tXzqje6Z/Os+srjWOy/2x1H3aF+/a73PMuxegpUarHKMRVZs0uba9+PbhpIImtUkxnPocSwxvB04Ewsn+NtCjrYkEo7BPVZpx4o+zPR3M+zIDqKTzk2R464F17NWM1uSrnQpiFiwV6ZE9e+umkxdM8mbezFAwfvsXgqCiqyywWbpH2dAISeJpAObmzLBqQE8tI1yHIysx1f4rWeMFfcSrLWepCoaZ7X0rbd4K8jhj9dL2roQ2QdinSrlt6zSKkJCNZbYi3yuwPf2lo+at/NHElkKijeXC/TOp8JowLhug+LGOo4XLUWZBNyCzktjYr9cNMAmeUeEIywgcPz/v3J0cCaRYUU3rohP78/OdKDWD7SqM56YY+fXWo+DyXPsVR1KDIFt87dVR9KoY2qUoOdqtFoyOduuBhzkKRjSVgKUirLBFO40yy44dNYyJ6dHBHFKs0apd3rWuy+itsEuv/g8qCPhbUhB4RaUaXbMZXEpwdb7Eltephtuplu7+xkryavXm293Fn4Trw+Q98sL1k8mOmgZSPFtN6wke45zy3scPMJ7e27Qb52IFRRmrZLXRIBS/kza4hEBdV6q6dG3bvGVt12Qi1El9eT+fOOXVCwVHPsRLD/Ay7ccys6cl3/FyAiexSTIttZEiN7c7SDU3Qn1TM6WtKs578cjO6ZdnNnd3kTb+7s3jP1zmhzeVPvjDZ7pv5Ooh1XvUDBONWGhgBdm0nqInYwhMVZGIpoXvC87x6xzTFKquyxffYbfabfaBFPcI3qZ8/Sl/QsOcT/eR1M/Qt49jN9+36mO3bu+3E39S/w2eu0LK9TP76fnU8PoevZB/Vd+KDcfj67op5dUV/dFeVp8dv3SC3H6fQYFD27pRbH1hf1Tj0SrC/nv3o8YF/Qw/V44L6gD2xx4L5pL9kXcoQtjq2SJd9BuHi9mH+TwPF6wd9vCHm9xu89mLxe6XNY+XNY+SJ08t0HmIeV/juGmnfxMF3IK/CoJMaT2ph164Uo7OhOi+mGGTVmdnxrvD5WJSvb0N/XDnaB9MsQz94tF7O5vflY4DrQPUWCqB3aY26VlP2gjh4JKphjC8B6Z8L6jGG1jnhbnfOte5uzORztrg931je3LoZ7+8Od/a3tZG9n67fH+imBl2aLVeh+FJYvYGBycvQUZOCgXCIrdeD2VmfC2dcXrhvugebmz+KhCcYOwNzyXVhahO8H6L5D6yeUSaY6UCtmHh9SgSVqxoxkfAL55mY/DBkVYyaUjJW81VCp0gAL5sYB4f1E0HmSThkBFUOYHFpii8hRv+h+VKWF/HF03rR7WSpF1uS7oR9nVXbrEm1tPlbLvJXKajCX2EZbqie0lZZJP5ZMHOgkgN4OFWijZ2MmC7ZBc56yhbH0fRjE/z6W8HdtAv8b2L7PRi95NnrvJ5Dv3tr9tzdzv0X7NgD35a3XMPXXtk1DFaVvyPIMGuVXtCtbMHwLVmMA6Zu2CT8hTPzPZzB6/Hw9c9BD8Ocx9hYnjCewBOu6eFOujcOKK+bxLv7u7moeP2E1Dqy+Acqgr+TlB/Al16XQi9fugkpfUE9uWerwW6dMYdU6cqu4MczVChlTzXa3CROpzKAMcticn6QKC1TdBdbVgM+Z+bvVQY8/QijeOzb9W8XU3H03aIafQj0QXSKNyzqSDDoDY3TZVV5e2u+ukhB/LX0zu3FlvN5SjzlmxqveN0zRMc+5mQMsdWxMHalpT/67458vfzw5PXj3D1w5y7wa3VFqf/vbj9XB4fDg73/78eLg4OAAPuP//rqosgNbjNLnoUj9T+t6hgGqWJnUbi/Uu4b5XF+TelvPAiKoJpZHQlpL35uwL26PPAEkQBYaOqiGId3zgUhgSvLCIvn8twEg+/i/zw5Ojy7Pf1tDeoijlgIM3NSWlxTMV+bGKdnvFRMptpZzEwIB29HfvH99cQJzwdh+uDwn4xrKG6qg8i3JIecEhxUVtP+GtdYUbcc8+vXtuyMk6OOfL/9mPzVAj6gvIq6QAJCxlBc0J4q53Ak0CF+wZEquVkYrVz0xVqv/XDnc/6AM/aBYdmlM+WHMxYdiTssyYR/Zyv8s7JwEgltSM55zQ0VGVdbcbxSojov4iGndXiGSxKKrmPGbZSzgYDxW7AZ7s4BV5F1wdr6OGPnlv16/WRTgazZfAry/8Bu2jkWUbly4o5zYkboy7/ztTxe/Hrw7/lBbbJ6Fn158OETd5e/o8/lwUliF5iceKlBaAsW2ofrDLRcWUEt3C5t0nVK5T7J8iCC3Y8cB4narBnY4OKHAu/s27sNnIyQc8x7EfDhi42paV0l9uKRpBOdToug0su1hDi/ju31IF4K4VpaAqzV1pfqrewufhWQ9zYwV4QWjwoAHjaZWQFPDSMlvJAZeK1mJjFBScpbapXj4oAqq+wCx/PCAxk6tdTqXc9JpqyRDIoyYkzKn9klsnnR8eO5CaMlFDIIbGt1f0D0MeUExwOZLtXSSE0gygClQV3CykatIqantS1w8F+TKYTG5Cis5sAwyVcyEgHmLobiDq/f/ee8j1PieSW0GoUnXwEff1xRhXLTwgKQ5Z8IMiH8U+qdjA93E9zPLLnmZkJMJdqAqS+byKE7OPN82soael1cDLECHlYKFQxpgjLq+qSdnxCh+w2mezwdESFJQUM3ieuHcwGQUvJzjeZ26GU21P3q1mQyTzWS0c/WIsnFL9Ckf5DnKCKpnTCMZSGERojxhOc0K81c8+UOj1pqLVBrNS8gurfHnRg2F/rggmpvKeYaxRvhcVqvKkoKuFIOkitrecoARmk+l4mZWWHp6gblfTLGJhDcsQVmWCUIvALC2cGwH5B0sEb92fDuTrv3m9qsoCaMf8cftLrzR8ygyGPnpb0enekAyWVCOPbnsGZPqWpu6TZeGNvTQ976u7v3ohs29OOlv2mxX7fj2yVnv4preBb207o6eviGfCTfhLmgeFhuV2wwvM/znewSGfcbXuwzdkaMcPnD0uKwZTOYR87p5Y2iQSKfWDrIAuAxGn1ZEaM6UiShLSKy4DQurDSRf4dxOEaU4udHwOsar+2gZRYA7Ytv3rNYDlRVcwzWb1YuVzEP7JD3wj1rAgNhPjs43Ts7O6x9CH+kBuWVjP2SJKZ7YvDA8UKncJbfpAWEiA6uaZMywFNOehVXbraTSjLw4Pnq35toihdQqZtLH1OmszKzdnPLpGr5Dd4q4WSAcz1KzKpNiHhq+IBBwcuEvyzAlSRWjJuqYE/bKU1agDGDWDfruVFQ4N1Stv64X8HC1MGwyv6y7+IO6iz3SAGp9bihcosvTc70pUfB4JASsWOFTk4fP9+tFBjkwhhWltZpOItXrNaPXC5ulS7+2vwDTu3NjDxvvNtzjoX+RP+YyvSaK/V4xbUDFK6txzlNydHqOWXq/XFycnZMNcvH6HJJHZSpzvbCsWFaq5wGu8eQIGRXXPoPxlpuZq+ILLXyQdyKjjJTJ2vHiGWQv4TyKYEbDhcMdl9srJ7aP8jva5tzNGwJqMG/O2jI0Y/e0LnGNbXxDmwWWv9TbJNa4+4V1gg/PZ8Evdi5evz38r8uj0/NLewguL16fL7q2ZXeiWX3X6D5jpLWi7q/5Ee912N1eeRB+tWi0w1sVHaWq84xif+bVVU0ymVZ17nRzNrCz7MlcXa3pSUhTU9HAWgVpdGlFSc7FNawHgzl8uz+4h0IUjL2xUYs51xQG1J2ui9FHgzCR3PJrXrKMU2jUZD9tfNL2Wl2LLSuM4bRFuZqZASllztP5AHUT1AnwhttLXWs/wcl+lPTHpNuC1W3NY8+a83penjmWf/kT6lmL4qmqvhHeDw4ZqUJsRMARiARdywS0hiJhwJleSBw0GWZXLIyGQ/z/i+JuucFwF1FD3Q2i2A3XbdVhzOyqgXbA3eHqSXWXljywphBdARiOjaTz+pt7zKQD95zdZN/Knmp3RQMeKPubIDSYD6kUwm3PJKjqaPQQxaZUgT9VMzBQ9CB6Hvd/zPHGFfnpJJe3cNGmstpm+kkqcnF45kYdIL0FMBG2lPGbOi6HC244zcn5P06h4xQzL/Sa+9ENagesYcHbGqTFoHS1Z3IMMp938PFDzQU8XiD8jrrBwbXoLCFCU1NhDQjXRtMwVZCVMN6K5R8g1aJhPRSiBbhOgL7cz85OdMyb+c6qtbBwI7petdSVpdCtKeJ1OB/IeWMCtKBhFW7EqFINmKH/qgQSBdxYobvQvd03WI1aIU1nyAmwYLuNGOPYNqoPcfgNv4TmpRj6vWiWEc0KKgxP8f7oI8hYKgj7iAGQgwZT59g/f1Ll9rEbbpfL/2D1lbJdKFPQcqN2pnmHpwpzTKzp7McUyEK9IEGPp7ur1IbnOWHof8MqNth401rVkfcVEDbhUatJWpZKlopTw/L5Y8xrdAcvS3ECqkfR5zYm+J9hDYHBFGM+rWSl8zlSM7wTuDxctOqQwZ5zDb2MT84GhHqHG/iIK8E/Ei0tnSSE/KPGLM1v6Vyjx70psumth8nT/VXivrhClDV1NGG1qPpuOat8JSzwZSe8vLKgXCUI1tWAZKxk4LYn0ukMRIrIlWjFaSvGh+pEVFZJWGBf7grzcYV5cBxCc+ikXLdRoZWRQhay0r53P+C9/joA6NuH40AvDs5P1zqlcCBEmaaz2teEqMQYUdYjoXdGu6/aa44dMd92yYXFA4veRmvqD7j7Wcppzsjr14cNfPTE6ywSIxq/1qzCCJE5UL4FuvRE/N6RBLLo7lbtNbtYI2E/ANknXfsjNDh+0y09ZTJJuZkvqxDgITfz/t15I4VRrNXoF8CRwnDBxNKKE542ihK6yTrwnUplZuQAYkxoD5CVMGp+ybXsKSv0NKjDKcjJ+VvIQfj/2Hv35TZypF/w/3kKhDrOypqlSqRuvpzonZAluVvRvn2WPD3nm5mQwCqQRKsIlAsoyeqNjdjX2NfbJzmBxKVQN94kWrIHio4Ok6wCMhOJRALI/GWDwuOjTrLWNZqGpNYBPcYMJ01J2ULzc8gZE34Jm/O2ft9yNqaySPR6nWIJH5qhyP832kg523iFtp/vRYeD/Rd7/R7aSLHceIX2D6KD/sHLwQv0/2w2iFzjIc7mZ0Hybbse1w44savD30NYHzloL4yP0DjHrEhx7sOPygm5QzGgrym3swKGZtZNWT00orn2qGLC9NUCJBGkXAdQDUleAldZ17ZcoTR5Kcomd4Kqf+iDxR6K7bT2w9Pec6nkpB7UHjg4rGrhm8ICOSbccts83RhyITnbTuLG2ORkTDlb50z7BD3Mmmjb/3XcRdeappqhqXWm/VdBhqQqqPpFZoOG9kvMMm7BlX7Wa8Wzs483+8rfOvt4c7hVXTOmOF4Dw++OjttpqcOqy+get7abF2rvaHZTkF7ie/9DrJT2/dGF21QbqDVq3K1yInKU5fQGS4JO3v33lufIVicAbNFSjhM0xClmMUxB79aP5yjnhZqZNU9V8ZnxhdI4lkqX8AUASXNPVwR6W7qEq9aoEk3kao5ZLa+nMQz3zCkyYu9ScR2cSXKSXLa5hA9YhRwCJ8cTIqTXqZWR7rsHjGQZSRzJxdB6km7I35QpGT0v6BiaM9vIEc/RxojzyDwXxXy6gahAG/4XdQBvfTlqQqkSomEVAWSNxFSojZIpmwlb15Rem6QlffEnitGIfnUtwjPPJlJmr3Z29CP6CbVB2orQhQ5mklzv+r/SqTtlHt4hQadZeockvi7HVW91UywkkrccpXhIUqF31YxLCFLRMKKK+4u3J8LFKW/EPCquN5oLoSeNilZInl2CBnwDpSCjEQH4aNWr8UjMMD4jF29Ptnr6quOa8Vtmz7gqZCEj+549RgQZZbjUfC+cJ2rqT71f16yX/KNEBAr0fSsOKE2XzpQjsZj2wPcVvSkEyaP1qoy/oSpzfFxIknc3g/ioy2pght6eHH1Uy8GR5vjENeXrymaTOzLFNF0Tc8p7R9CB9U6acV3RqEjTB850frRzFcXwpkCKJegO9gczLszTIcklOqVMSGJUrCIbOCZ9NAXUN2Vr10DN5NpuCbuxwM1NoLkohAPFHRuh1qKoms417nb9kdCdNYlYJ3yEkRTYHQirldwru+2HFOjYZ22gGMKMs7sp/dOLOtMidB8/6zoidISugAsot52bD4q7K1clPOZspMeqHsbAoABOeQ+DLD5Fm1LNzWR/GFUyowVdNol4uO3to1m084lyuJmB4035mLIm055Jw2DSmqLIebq2RE9XoQoUEnqyB0KQiW/obb+V3/znxjUdYoYvcTKlbKOHNnKidi2UjS9Vg3PTz/y7bQu/5F1u269ml8u3bzeuSqX/mw73hA1ZGcGVYIkNhbdYoJinKYkBbcB8Wymq7wrqjyhL9KRyUzzlY2HmtkPqt31DvpGOFljiJo9kEzIlOU7XWOzh1PbRmJhUOPKf0RHkVuqyUVuNWkcJTBPYeOtLV2ELEuQE0BuErvZwZRoEE5ZwIpTf2XQlX+D90UG/P6oIYy02qaXWhYvgYEzHOGiKdShWqU1UAPxJToVnuPlIZxExnhBz4FlhubxjdBAEoDDggCekWUTKJSM3ClX4xJiU5ym+JgJRiTIuBB1qHAKnn+WWQumpUsgpkTmNtc5C5mxNa6u5OGrCqF0UjYsU50Cva5JMqbSFWeoxcO+5NBffVCcNMWLqpBFSviD0vKyQAZHtvCL2MuLUu2LXsevaFcESXan3zLqolkn4qKQPjiJuKauT7D0nB2Q4In1MDuP9l893kyF5OeoPnu/jweHe8+Hwxe7+89FhRR/XdPpa8SitsunIBM86gbRqgYas5UUo5mBmJth3yLgy+oLTlN/q4U+okDkdFn7su2nDJDHkBaR12AIjOq2n6uPo0xcbLyIkhsxrONYrZwhz1wQe+Wf62xgL4OBU7U5pbFKdKrPIujsAcGWcHn2eVgjpLteRt7l/TbAUbY3oLbJZlqBKS+bgIdyjaiCvSsdMp+eN1MQAcfs1bloOVHw+ts10qyoRT8har4CsNmGnEtBlzc54miBvubZFTpVUC/ZlaxWt269+g2nqhcT60CmQLw1hCDqfrOcNgmXdmcXyBmdoK/O4Rs1y4iizuYO2tcV0qWaSPRKaGlUjQD2rx9yLj6wqqtHBSJGgurc5eJWZzIlgm5ulfwkAbuY+OCaZ1My53jTFIGLrRhoiTcaVDzVX+rEcZjRl44KKiRu1clLClFbrBSqyylJv1jkuFKnI3y4YAA0jF0aEPZ53JqFsvmaFqlpTGhirPVtoW1sFJ2PD1BQzHVQnSIubYPvb7pu/QdVCCy9X90HvonUCuG6/xmt1H7MmMAVweW3M9tLrBLxYAyjUm/kWf7biJ7gV2nPMLSdeJ6d2gM5GuhGeuzZwTmrU1Wdoh+m9tZ7TVcWqXs2xupXhaI0IfpgR+XsVEtMOiAsrrOwtmqNS2mDJUcr5tdqCYZNLSKQuuVjbW3gonM66N6WxF+1G+/4+C6IPK9us8psZuyz91PxYVBveqCunwU3YTtUlrLbkBZ3OCTf17wpNzOmTDIo04Z0hKDIERYagyCcSFKnnpIUOKw3JI0ZGapJCZGSIjHwYkkJk5OIyC5GRITLye4qM1GvF04iMBFrWHBlpGJ4TEYhTE0ZXTkXuggVbowK9DDskcww7KDZ+8lGSneKI7imPJxglubin9g1DJVt0/tFDJX3/MYRKhlDJECoZQiVDqGQIlQyhkiFUMoRKhlDJECr5o4ZK6vpr8Ky5wrsov+m+wtswpUjUZEuxEHR0Z2OvMIA4A9QpjmOu0X0AQ0z3hST+yhmf3v3LUPgv5+Qoht+dXXw6RUcXF//H8W9Q4GuU4ykB2Oh/sUr8JICc8BwEWKGkbNjQATtC7JBuae4wVfWW9+zkvIfe//Lm9x6gj27ZsAyMYj6dKltrSI7KpuH2GxiKJI4ljaO/AkUOZdzHjVV7LuPdOoQwM8C6jbJdTdG/Nug0w7H818ZWVOmKxBOYz9FffTE0OoUrs7LRa8pgNwfOKo4ngNDlIDrhaFDq22TdTw8GLI75NEup0GFTY45TTV3Z7r82PIhXpowfH9nrY0W6Lsa2yJ2qG+VvsEwZPXRdlqUVi1zXSrTQpvo82upVxZPXgw6/u0Fx8Z4wF500I/TGdWXaopUzc2S3La4gHgSTAagZGzuAXETUHkdXTpGIsrHaxitjoc9ViMy5yPTmIfWIxeOxZs9iItWMiT/jqhtQrddrc3I2lGJTfcygpVnRSSu8/2Ug3wtBEG7Yh385Rv9lWulVtozoGfkaOdRBLCWOr6MplTkB1EH9iti5OOr39/s7aGujLh79S5tg1uhVbVT01UbnLCokXyYNe3p/ITVlpI1Vm4zWjb0JOuQ6AfjpJyQpv/mm1BZtpSpXtwJ8k3npTNt9p6ZtaDlx2rfEzsVg/+XLFtWD7zsk9INs0DcqEdlLj4g/DL52r2tETq1LcOJcAj/7pjlMj2QjFhakL8Cmlj+UIFe1FfV2fOfewApaz95g6i5TYBADyrgPg1nxwUc8LoQ9jSgxey1AJqJSkHQEXhKFglwA4pneIXzDKdQr2E5IJicO0LR0oTQJX6OD/kvTakxyqV0nXUB4iRKHMc0ma6tcca6LwVGWgFtn0Gl1l1q5kiJ3X5uAX0+kDZP29vzy9Pjk19PLT+dHl7+fXfx6eXR6fjnYfXF5/Pr48vzXo92Dw9nbO49zDQ7iyW5NUvh4+m7bljIUErNkG6eckcqocQjld5UBDG1wfu+0H7YmOoZzWmgc1G3yNU4LQW/AAl41WbqMJ5iyKyQoi80xvF/pCunLC51x5iA2UyqaO+t3Z2dRtHDhlS5K1n1m4Mva67wRi1+RfrnZmEDsZ/dYrDQGZXi1HQUszaVMNVVtRHMhK2ph824mLnytpQJGZWS2VxuoCRaTaJocrGl8jisGqizTX0JWvzs5QAmFjRsfoZPTT24Yq/HkkP63wMx5o3M4BBWSsNhccZnCRWVp/p63c3U3ZeWg6OPKsiBnkWUkh5wXkFd9ivTfPD88fv5m9/jg4PWbk+cnL05fvH7xZv/1m9dv+scvT49XGRMxwYNHG5TzX48G3/2ovDzde7l38nJvsPfixYsXJ7svXuweHh7vnrwcHOwO9k8GJ4Pj49PXu0crjk654jzK+OweHLaPkJOhl8Fw/xEqW9Uj9TDz5vDF8zeHh4dH/YP90zeD50f9F6e7b3YHh7unR6/3j18f9092Dw9OByfPXzw/eH36fP/1m73j54Pd46OXuydHbxYu5WF4pEIUa3N5TsqMMFvDlI+QKIZ/kNhd+GsK7Cfw5FrXIwPF3RilugCP3/9s0oHQJ84lOj7qoQ+ffz5joxwLmRcxHH1eEDztoZPjn90138nxzza2YnHx/YH31rWKm3sqSGMuUwF0vybHVbnUE36r40EzkitVUyp2fv52p3SzEZpglogJvm5e0yb75GA4eJEcDg8O4ueD3ee7L17u7e4O4peHQ7y7v6w2MS4v8UgupFBJObhVpcGS7FzQKfFdZaj7bNDfKz6BQIxDmBUxUzVRE9mfmTRpXozs9ncH233130W//wr+i/r9/n8vXLjY43cIaabfkGHjGS3M7ODl8/5DMKuh8h44nqFW3E9wFOM0VcaSofP3Z8amSpKmleICOtnHFmJUW9BmHRUjPSoQ1hXBzBWT2VMhySP0uxKzZ7bVw5VKN7Ui2mOiJJ9Rk5PkRwuarKSG/G9vbyOTIBjFfFmZa1v5mPa5YZFLS+zEMtciT+9spdcPn38+qRQgeiBLLIpMX6dc6i312m9kTTftvkNlL6+/mZA05Z37lo7d/O7B4eUvx+/Ubn7vxX7L06fHJws8vxlF0bLT/etB/2WEUwjzlfSGwMRfl1TfUu2zWd3z+tUJBujZ+dH7rUjf0Eko3H+D8zsl9TZnQVdYpFLX3faVF65JhoU0l7Y6RBvCM6p1jU/enyOfY6Tr1N7SNIlxnogtXay4EgJGmtdmm3/1Jv9KQ6D9o0iTu07ra8fA3GaDOXh2/B7q3SgioGC+J0kn4wbT1v9SLjn6lY4n6EiIIsdqw2/w+Y+X3WJUZQEJSGuXg05zena8BQkhos7m54WLj7XwkPi2d53D2mLkn52sMqrHP38+76EPzrs+YzGYc1jgytDbnu+Bt2iAm08PoQmQmFSmRq1LFWw31ha93aoL551SFmVF/k7J7T0Y8hN118yU35VAzz7cY6KfsfiBeMbpZcHouhyeNtZxilSPSgKfVxBBTfvvIQYA97jk+SXEd6zvosuttRpMJEe2P7fSXvTQOUSLfGzo+TFO6YjnjOJVOH2I/SHslLD0APUW2BB27I12+7v97f7z7cEh6u+9Ghy82nv5f8IGaVXm7r0ZnMtdfffXydng5Xb/BXA2eLXff7V7sDpnOrXh8prcXbrK/WvbApr22ypgujyMa9KciJ/OV1pIPN7iIr9Z16S70Jd6N6Ra9DpN1QOx+ankDjk5N++93E8OmKUhC0aFzA52Fy5c2SEQ8jXjrMzuWwUr49Q04YYzITm9aQymu1BagLnDg4O951b4LCFf60ERqzEr6J+LDH4Xo4AJSv904VjeWIoMx3B9NaQtgXW7/f0Xq5AuSE5xerkwmsk9osJ1VxanBJarcr/bukrWj87LWwybZl6et6TZBLMCEBZ6VQSY8uj8lsoJh01bqpwVtfNy5+iu6XiCcxxD2mhdyAcHb16/fnn8/OT09Zv+yxf9lyeD3ePjo5UshqtIvXZjeFZN7PBFXZbF9izF71DBlE+nRMlH+Gllemkf8QJiLNAvHL3FbIyO87tMcpTSYY7zuwidE+KCSMZUToqhcmp2xjzFbLwz5jvDlA93xnwQDfZ3RB7vxNDAjhIM/C8a85/e7u093367d7DXrE4MdzTbK5pqczjwOFth4fbClow6c2KCc5JE45QPcep8wrKKzIq8PsZW92F2upaHp7DVrZsqe9CkoSw69rrnFz+X/m4Pvf35HDP0Ru1iqYi5txfuqR1QBDvftWjBk9nmVgRwH44ee5/bNYkrA/pQDD6BTW2N35VY+g/YoJr4gPV6VR5yo+rUuDkNVdxbmIE17ls6ohbLnYzLOAVwXH0p0tPXlzgDAL+29GBB4mz34DBfeIdChMTDFAz7ApwOOU8JZm0MvdY/oVGKK2zRkY1ORYyMuaT6duoWQ3Z9TIQYFalyPJ1LBZXZqXrKBMEyRBj4Q+pzwRhJF55ujHyVlzYe9psOpQvCHRL4CugmSYQ+Ej2wOrgFeVgLAD949P7IoHkov8H6jLe3txHFDEPQMRbKS50SJsWOTMU2cKI0X/Gwrdvt/CH6OpHT9CecZmzb0rhNE7FVC4jSeCrepiHlt5CcJZpap6jcGUQLK11ORDFdq8JRUYucBoUz/UJGouMWCsxrB6eupQurmanA9yTDfA1ty4b5Nll6rDDfLkrWJOJ1hvn6Y7HSGDzpMF9D7g8T5mtH63sO8/XH5McI833MUXnoMN/a6PwgYb4LjlDZ6ncY5mt4XGuY7/lSAb2NQN5yqfDqA3/zgF7T+R94b22RY+0RvbrjB4vo3Xu5v78/wMPDg+cH+2R3t/98OCCD4f7B8+He4f4gWVIeD3VjKySeZo0AVxPN+RQiej1+H+QSdxmGv3lEr2F2vdGl5wvHkdYMcosBaMQYrc0AhLDHxwt79IfgPz3ssVUW31nYYwsPT+Eu6DsLe2yR4pO5D1op7LGFoce+Dlp72OMcnp/ADdE3CXtsEcMPeqvkc/rDhT3Wmftxwh59zn60sMcO3v5zwx47BPJjhj12MPs9hD36pIewx28Y9lgRfAh7/HZhjxXB/+Bhj+28fl9hj208PIWt7vcT9tgmwSezzV0p7LGNo8fe5z5o2OM8Bp/ApnbZsMc2lv4DNqjfZdhja23th4MC165ZpTaRvVbOcC5sLXH1Pc/pmCrl08FoLRc20e7Ch+B2LNYcDfheST+lf5JER8zBVbULBoRFxGdzHosWRLSTQYc2muPYemgWcdT7qht1VK1yOR0WEF2p34DgJqGc54wLQYcp0XGYOL37k9jrU6zjj3JejJUvbajEaErjnNuq6TiPJ1SS2LiWqXIWOSPohpJbb5fmsO7NRsAjHHmlA1BOvhRESIG2SyWhjELhj1sytL/bWKdRzpncVt5rtc79tmLnS0FySgSa4sTxoVGGs5SgIY6v/TeXQDsVGWbrg4fe7Kwoovq1tRPgc8w1crky3EqkfmX/I/14TsxlIcRW8IzkJjzXlmCAYFwMIZQ9VykCO0FL7lrETId2GIH1dHnzBEs8VFNAifuupaj9aPQSv3j5YjB8HsfJwcJWVvPzCFJuChK+0TohSgUy9Th0pbNSiCZ6cEjUxh9JPiZKaLDBdU2WFZJMeRIj7AlmSapniOsGikJumzhX4qlrQ9L7w9HL3dHewfPnw739BB/ivZi83H2Z9Emf7D/fO6yL11L8SEK23S+h0f5bpgyeLbfoyv5CGYgpwaLIzTkAqLlTWqXipUpXVd08R/KmcPv9Uf/wOcb9IX7Z3x0+9wxzkae+Uf786e0cg/z501sL8GwqUiADwqS37cpUEuPJ4Bxs3+dPb4W+QDZP2kVDyWCYEyiFhxJ+y5TCcCTiCZmSnqs5mWE5Me9zZOOeF7F1660zdqKrgNniQXlamqCNKvyXX4/wjCHBpwRC1dUAKnlO8Z3GIDcJBWcfFbc7SoRKrrqIWXrXcydDuF4IkUHhxDODaqba1pUTvRq/t3DQNOa25umVgS7TkmsqTQuCmUvLsJH76xLtxcSgiNt4BWHChpXpsp23eGJmNjixFHlaKQXZaIIKBGERgkhE1cw1EeI9NYqMS2Uo8zuAhZ/AfKu+X2s8JRgqGmUkpzxB00JIaGSoLGGcFglJWqpb6sNBeHhI0EbGxhvlCaJ6fSNS3zVHKDNOiFcnZzxd7AR7pVH5yHNpXHmj8Qjut7Q6/XTl6b/k2UZNOFc/XekLq2rlT0t0rebZqEgf0Ad+tPIMZyNdO1GZQKjGRKdqSpuKTHe8ABD4csLeeQfCQnI/KowydKX0WbV3BblW4NDAhNdzhQo4EWU6OookejcJDpT1OWHdd0369YZb6glULcCr/f29HUGUz/y3Lz+b7/XnnyTPKqNnJ+QPMIKbn9mUJ2r9T0o7A6ovkCCEVSTrJOq6ec+lyYOgDDEi9QrPGZVc7ai0BeBDWLkTtxgMiTI1RnFgrHOCha8KGJLTUMrHpqy/ehVKJEjC0B8FFHEuQ+3Adql1tF4Z12mOKxPmXnPNYths3WLhCO1V1nnGZdM4raREqrWOnyv6lWEhPK158Dwm03xtYxfVaJDrKlz5EctJrW/PthoBbdTIWUONeL82eYOO/f3mlcf+/l6FKNhWrdNJgA6MEutfh0T7CvoXkyfYxoPvR2/UlK2xdv0N1i7If0r8MyC/l0hZe+3QOa+FcfUuzNC8tD06bsOjHV6FZ3R1WtXfsJDuqZ7XmWZWuymuRV2+miEyzWRJD5Cun7wyb5ticu6CmkJyBJMUS4KGRN4SUk35lLdc+6q1Bfqx69IrExyK0j+povR637YuPTiH1rvNIiw4G7WlV4cqXL1qdT01vR1LV/XAIZTbR6Hc/mrl9td4BfzZNN/ip/gUVA547OfuEx7QQjjaM+c8dmGtVq8e8kK6ssnGxYXyYOQGuz2GOWswlYrNl6aSmNKPCb4hcORO4Eqe594RJZM5JcKsqraGN5pyqJuL9Uk9TexW2R5GYYYw5EgbpxtWbOEd00/NwD3+AVJ3oXpdiHyNdeohk2ONWllNFYkaW/sHDox4tN2h4nVT6K2a6q6H6KisJdDwj4+gmDg6pUxIYhTL0qkL5D+WxkHva1U5zd/ajuubp/UOowZYM3UIdb3knSzFUpf0b5K4RoPty193Vunfyzte122GtaMTXRMj17UUK5Z9BFdj2gQxhBlnd1P6p3cSpQXnPn4WZFSkSvGvoDI+Ta6UaugPirErl3UWczbSI4TT6mrCErUeMF7OS7NLqWlRXX/iMgL9IXXHHnEKm5joIHsayrEqBY9ms84naluv/YYcpXzsXWKIlkRMDEaruvnj6dqyIx3Cib5dVD0hrD0NScvpY1yKGq2b/9y4pkPM8CVOppRt9NCGLrhO2fhSNbjx7zkhGb7jdInH9rjUc59Q+e0CTpRuw7pSDOIvIA9zSvQxAkbDnN96N6lual1MyJ050BMTfouUgWYQSWADGFI+Fqop5QC7MwkTwFE4Uu15wBJ+D1HNfytLaHqrjyX9OOGMzJl9ayGoFF0zqBePcE4rRD35w+6arfP047KiH3Ve3/E/aZrinYOoj57p0fif6PjjZzMy6MM5GuxeDvQG7h2O1Rf/2EJHWZaS38nwNyp3DvsH0SAaHDjynv3268W7tz39zi8kvuZbNkRsZ7Ab9dE7PqQp2RkcnA72Xxhx7xz29w1+lxO6iEZ4StN1nS5+OEe6ffTM7vtykkyw7KGEDClmPTTKCRmKpIduKUv4rdhq1lmDJxt0/xhXWx90OA4bG5/K+r+w47K4LQ6SJYdQa+0XNvRMq847/ge+IXVpXZOckXVtVRo86N4c2TrEAt92zZD9aD/qbw8Gu9uQuEXjOvU/yDanY6xtOII30l2D+4+6ZKwH/q1G1vZn5nNMmOSih4phwWQxaw7j/JY25vB6o1AbxC+qj4N+NKhbyvWS6oX3zlk5lXX3/Kub1FhG41n9/e3R+0V8KvWc9aZwXt5kGOf9Dr3o70aDL0ji8TMB0eAYZTi+JtKeFGGhj/iwQJSNITYGwC30P6F9LASPqQmiV00we/UJeyLYNCmuXYAhdhl8pjNt8coy7ua59/oGOFLct3GRk5jniWqOsnFquJV4DPGKcFVcQMAFgErawZvoAAJF6Jdtyra/IMJinIlCUyl6ZkvXRhmq3OrKu4zGyj81TZtDNQjqw+76WhAmeI6ekWgcof8m5LqHfqc5EROcX2/B3Sy9Iekdcp43bL5zPIIEx5okKGMk7xxV3QTSDxnmygEW6Jk9LjStmt+q/G91MDmbPc2faXdZLmewV6ktCcFH9j5O7baThBrNsvRUdEUpugYXIlYcEo/HYAtMkx+GFv3LU26rvZGv5QbjtUX/7OOmSafb/pYdkI3crDABpXajn1AR5wQOFuozzLQJFHjtdY3LiObkFqep6KEclF/09LYVJ2iIU8xikosltjZrO4AChs5OtKeoi1LatFEn/aa9nr0Z/SY7nw+ZSaIBDuBcYBkeeCEFTeYkJDurX6SM5HhIXYKXNf+NH7rXAbUMVBpa4KICt3SNGrcWFtC5PFtYRKXUbBzz9QY6AJITH1mHQNlzP3kBGJENuWC4wXIZwnCkIIgNMbIu0bab389G/jnvCWxfVF/nn89Pt9Q/ND5BCg+6RssXbDg9z9EbM2+3KheMJWb0lwKnd2Jc4DyJ9L8h+fbLLRlOSJrtjPglRMqlO9eM36YkGRPV9E6FwUsjekpENJHTf/4XNOQIqwqjfPbfW61RUDYE014hNW/4Nv+5Yfmae5DkQ82rxQJyMdfniAHmQqUjl79UkYKIeV56lpXBKTfpfvAWYHAAsnd8I8ROMwft7+cLJ8x6FD/ZXVFDqt4X7SKFyWfWLOGWcJzCauj31vZ2x/SIb0g0pTInGlNd2bCdEf4Cap7+FN+QS7gxvfSIE5dxTrAkyT+PIZPbdevbVkr0Wnz6NeNCWY7jv5/6HP67Mb5nDE1x/OEcabgXtBsNdqPDnh+uVBWHCYj89PF4CXRmAqAI654g1op6J/1eOQMqZgxNc3K0DVHL7DhdVARr80wU55ZjYxqenZ1s2egQg3SRldHd7Ysl0pf0ETrz79VRUb08MR2YRu0dXFOu9dVjUdW/nWB5ScWlmgI02TK6Xtdx13pD189O/t0yRtsaQqjf7y9RJgAi59aWGHyEcqLDibsNTMV/NtZGZ8pMqaRjvf1xsrCD4bQ/qY1LXTDtIxKP6faQMvUtHOfFY/o39Y+fnRwPB4MlxKgU73Ktym92kTxHIsasXVVbQaUG/cGLaBmlUO0zkkc3hCV8XSnViiU/7Ke+wAMJSJPQYOuCMDxMF8cPinlOomGJPDOLmVHKsWx1Yc9VMzrkJ8dsbK6++lFfedyDftTXh4nwT1uTZELQlAuJBLkhuR9T/1q5mMK0yNXuU3lsQhAhpnDXBlY7SzmVVihTInMaC/QMS4nja3QD4Qplmo0OZ/9K5V0PZTm9oSkZE5O0Zm7CJcl19t5WD9FphmNZturfa6s2XLvqtXEOzaqmTGQI0GQwVSFrsMMJaHG/rKsOqrud8LhQLG81PNWD6GC5ISbshuYc6rYsdJX1jcb61Cdr3qBjdodcsgZoiRmhHlplhOBCluYEatk8gSGSZJrx/CmNzoWhaN7AwN3PFMtCC1qJNDGlloCLXmW9tmMVP9y8WFDC6z0rh438ewtZUjnxKLfOz97//WSrXOzV1phKwIZ2MoJhAP3E7JqyMRxRb7zltxs9tPGOJLSYbmht3viVjicbMARqm4ZudtWgOvPpWgRNEPUDSA3O7fqS0FXZ1l7UN+HHd3CGmJARZdWENdVC+XBljDwtgieoQPyWkUR7L5jhsT57enP26fwi+pCPNUoNegZfKOOJPp9va/h8xqFa1Ih6Wy0PH6aHbidcGQMqbNKn5GhC0gzsPpyoCxKDcirPFuyE8r4yzrzLMknwVCAc51xox/mW52nSoaLsJokYFTIa8xs4s9g2pgjUtWkM9OXIYqpqhmSN3oUb9VYPAwJ3lfTAUNhFEAPYGiCZp05mWU55TqUZCJSTMc7hctgzAatJsOHEq25i1/Wcc8ivB/2X/vEjQNMc17DVZ51AUqGcgFSvDfoKRm9E1Lyy55Fqrnyt4d+LCsalf1BJNR5DeodSPh6b/H8o+qVsqb7ISeiYwkJoEfFKmDsnEBIXUrl4aEgZzqlyY8533p29O632xkyM7pAn8Aysnzi9E5BFCInOlkoOB/rXEfodzvxZelfeUNUQWw3pEDioz1GrMIemRUaEJAkqWEJydKX6ujKtT7CYEGEVzy/EUwFfzEkZZttzp7kEXan3rwDYA5K6y3TajGdFik0yJFwA6gss6N0vcnO15W9QzcUGbMFcGGOlcFU1cnLI5QQJsN0Wic1dtvmEgl5wjcsWWxorYtER/cpoQoytarPZZIseGbZkKiIP7elqa/ED7VAI4VEKIfynFz/4XgsehCIH5m/VEX8yiI8rFTb4Tylm8B9cwODHLlrwwxUq+LGKE/xoBQlCEYKqEH7MwgPfX7GBUGDgmxUYCEUFvmFRgR+9kMD3WjwgFAy4x2g/mS3jakUCfsjCAD9IMYAfuwDAdwP6v616foWGBC6yMYsnPNcft2Mb32hub17rZyok/F/Q9rEFYjNrknrd5ZnY+wO4rUhTA+EIx8yK1NaTcUhtmnAhPUOt5YRT6iAaMywn9mHvwRYC1d8JyXISw9XENsCBli/CrQx8otUsJ8xsmlWFPsVfJOmU/GlTp7vJ01HutYendKyjMF8hmRek2rqWSKVZ7teS1h8u2/Smg3U3PhBkAxf/4yKHQdGdtfG3gOjVCPnPzWQLGl11TGe2rIQrAMg/okxI77B0rozg+EG/i+y7iCZ2WsQpL5JyBhyrjzZqIEdTInGCJW6fFO/Mrzr0I668CuGF5X4EJ8klPHBpm1RPxkQIHVrmz5EK5/BSRKd47OHgl5ASU7qNh3Ey2N1rtR+lgpypFtDZiQte1ORaiRj1+AkdqZGCh3ia+IpqCVL0R5oqy+ucoW59eOZwe31YAsvAxtndOIbc80v3tID21vpaVI293qY4nlBGYI4v1Jl5IfJeWLQvPxbrcgGDNvutRXvNcg5WbMGBM48vP245GZde3+w+Ko+2tm/NQsLja9BVYxdO7OeW6aV/A79DrY9pqms0gFHQv6kZLiY8l5faMpf+hF2OdX/bziZ0LJuOLNRyA119pWJE9OoAmELuxzZheQJrf6VVaB1dKYuzfG9g6bwJtWSvtTcX63T17gwMKPoJXXw4+fAK/cpvlXsxxZkysoL8rUFLZaFHsxd71G3PkbPpmoTIaq5af0u9/VV/amnkjI24r61mWVCvI2trPAVV37eqp1k3To/P/bxjajNtIxKL6G6aRuY5nTiHc32myjjbLt+sgXhxV4CgW9O7h6aCtGWbGHKeEswWFO+olAik55TD3uyXi2hY0LTZZXNE3eq9MXhxMui/3FiMnA/nCHrwY1TaCYl5QlrnwSxahMyJjCeLE2N70VB97M5p4HUxJDkjEkIBjB7+5n/X0m75u/O5qg5U2SjytXC2VS1fmmtZK0TP1rm6xDOetJudpSazJ4GM62Ol5uCqrooWG75qTx95gj6fnTQ7gi1zhuOHY6pssdkZTxom/56dWYycjs5qm5T7d2gbbMv4Vj3+///v/ycMKE6TJGPB/3rvtcL7+XKKs4yysXl2468LTmyPJ7O2TXHWJBkgBvUZ2JOj26OtnficZCmNsSDyYbWubLdD9xKSpfxuWtv53r/jst2OjuFMbFSkD86y13BH13Ncs1U7ds3O7bbdD71/v7pds+aZ5aVc8D66L1raNT+WS53bZ7ctTWXbaKl1iXxd1BM2PURlzPMMb9hwjLPpNslz7m2Sjj6+Q6fmq+q1uvqyREfQLPNcvTCbZ543D6lmnPV8tG8ZfLSOJv3iPUu06YNvVw6mJJ5mS49OIRqD413cI8ilK5h8hQaL6eiFpaQC7KkccVOqM+YsEUjAifhnRr8ikvF4UuPHlrFr46Sj86Oyhs3nPDVZT7b0HDjPmCWmZo5p6I7hKY2rgRB1j761GEL39O2WzMXEq8xar3oAId665MGrjRLeA/Ebkt/mVJLaFrClrNaqNKkmerb06p0+EN3GQpDpMDUljFqodXfiXvTdnGJAS7BVq1OwGmPOF2oXdrUGyMKkeXV5OibMHBVoq8EDFHkFeBahoyxXtLI2tpUl0sKp1iRaiCC/NtCqFM0s8qMpa1b2WZjCWj29VYhER64VE2oFxSowXCzbPBwMmL4ZHhNkqdb182ZT6g4cpOw240vZrGr648rzSMqsBP6sDIqrkAjZhVRUUZwXGJJ6gccWjttOWSoHsBOeVIaoy7GaOa4eq7rJZTmdwaw/tgQnJBct9Db2KgjpzP6kDvK5ECcxZpzRGKe2S8uPqVVHEvTrxcXHBkY1qiNi5CRfULqdV8nt0ulk55PptkRxaae0JLOW2LmoEvm7kkJceuE/Xis1Z2im5CGyERrTGdJG5IZ8TWVFZbo1pryiZRDf0ySseYY4k7bPXtDse0Wchor2AQgBAdBk+VpyUUpHBMV3cQo4WuBpQ90WHsdFnpNkSX5aJkCX/ner/7wxWFz57ZhUDLA+cPhLJ3X+MUGGczytuNUzzxhqP9fHsPaziHFKkks/+V/9qa8pG1+OcCx5rqYa/NVXCG+Wtc+9Tkd6lGKJzAGIRe7fNungZcUx5V5LXfTS8AHFI3UYrMairAm2Whd/wcWtg8pzA5nvH9l373Luv+c/m05NGq7vU1rgfjKlUmpshba1oXNedK7Uq5BYw+59KNo8JJH70WeHzGuw5eKAVc1wqy1vjPOMsZ5F7ByC1Z8J8p4SzCgbj4q0dfzhNLf27lzBppiNi7ZDoS5uW9boBrMrej9+uYQs5+McT6EKhaVR125po6CpuisTUVPgRehwTkDBJG2Z448sSkPWY0ivo2tvMzQltzy/fmoic4Q9htBaO3eHbDlmAvtp+kvuz+p83PcGDSAQS6LQ2UnU6EPAKcc9r6Avyk4MdALOCdo0bW/qgosGQxBCL/1YzPKWuKMdxqUlsyzdCJUERYaZMADnknyVTfa8MKQVhfibfhhCdu3JsMEP1rlInp3fFGXpznGENs2eZLOHNoc4vlaKwJI/+HCzh4iMt1Z1Q9oQUGts+zCkfmO1H2bw/YuucKEegcwZhxXpa5RlP+YaaNPBhNiFT8vhl9MLtKO8RLHziiabWy32JikqaKBopaUdjqJb+a5v07zw72nrC/Vuu7pGXWflLf03Jx9JR5cLrUszBupjCeQpqxNeqaMRq64pjxg3dQBRPKFpAkXe84IxWpHOjyTiYU7wdcJv5yvWDBEfK6ZtTpmLRXJNCxeW1FwC7inP+gKz7O5oXUsLrC1nJ57SxQRJ7mVP63udIVFsCCR5/ZoL5/XbrafCjCat9R6tLAW38uHrA+45fbdIH9dor6R84lE2liuSQrIJmZIcp5cP4fec2tbUwDoEXKino+2du02eR2Pjqn658bcR+7W3ZydIlMWYXbUOZWKmROKOqszON6mTWVY9gMc0wjAf1RwvCHc0XRqkPFsrFK7BAXjPtej6EKamIbuz+4n6ScuDT1az4fYCHOar2RLRc7PG8Lf66x1ktkUJ+tFWMEHEIvZhXbFtc+SFnu55S2v0XPWRuSxlvKmDC+xqvwFLLqRyQY58oqoBlw9Hkw2+XICkhWKilznFdbVqIECj/Sy3Mbx+pZT7LySVuivci7UunRzwoqGSEklQWRNv5sj5orq/J9AWz/CARD6sq7I4YQidSYAfteh9QjVTWQB1TGtUMp8jrI9gzYpYXmv51Y4XYptmDabpgjuGs481brE0TIpmOeOFiOGVQCy9IJWFA8+hvIv3RAXMdCH9+eAyI6y02z0NXqtWGN1rdajVhaw2tJLpgtAVW/1xBZWbY9vmhTkuY97OPAFnJFdCdzEEpO6omi08VFBWHoViwm1G5+yQcD721ac9/3uW3GedPxjycD4uNHR6dX16p6tPjWgqATZLcohzI7GE0nsU4D8rySJzRqIyGi3uZO0gYpZV0sA5TsLlHtCeXy26SajQ9DBENYjZFHZrugpVYDLuN9LnVaHoJhd2vmtFBu+7fU4BHKl6cLUCT0ca1NXJGSCaysZRa/LSEot2d1jLDKJ+rS3lRx/fGbDNFmIW38KvREvZd1nzt4uGyyn+g+cNSoZ3csHO3qn3XTCZiRUwQnD601TtxQ75V2LflZGCm4chAZRpydEVzqbbmqCrenCyuKeSt7pd7Vx1Un5hHB5fjUqw7qor1GE7WnbsSxLhwXHdjwQAYF6VilNAb16FgBLdgJbnfu0nBHMC6ltcyoZD2S1Gh1ntwJuAIH3j4hyZhk9p4f/KSqt8CIcmJusb26C5TYH+sf2G57dYNaT+ZesP/2P7E8Hp9tlHEyqlvh/hNBVoiONrqJ+JxvSGsBLMQ1po9JxMuSSW9AVFrQ+onpCoyxOzH03UCRGSMv/WzaIINH6o7SaqZU68xxuVWRMiMU2Ft33wevWrde/4x+0IUHIareqz0ELXDHbw/hQE8kfB9JWkDjzTg2YODDaX1BwjRkdKl7vcbodmxLnWSvPwqd2Q+EJxMPN+lRWEp0M6LnghUsD19Fcvs6dR65PgUwK5PuDBIMzQ2ccewvZWGjbHBaNfkeBK6BFC/4sXFjMSp7f4zt8mCMnNhiPHt25emDvfq8h8caWlWPH6LyBU1EejTApIOpR6A3AV0exKkXMVadKueighGWGJKayt75FKNA8QrES0HMz5y1ZWH8BKDZzZNmFTGwLPDnhDVGH1GDPFH2dgI2x9cnT28WZfMXj28ebQqxywMPWVPJJu+ivbCr2FemXCLtsZ++jll1RYmkmX79pc+pdgs47LPwuSV27MOqyudVV0w3ayM8VMCpUbpsQa0WHOb1WrNthbvXuH+EiS0v8VE36Likzp6S0Zup1cyscAC6YUDFozV32CmJJvunctu6jTYrQ7kR0OHM/pmPr1cZb0XD4zQ2AtvaKUVjluJUTCO/4nTVO8cxD10TP6ccIZ+Z/o+ONnpP+NPpyjwe7lAKrPoHc4Vl/8YwsdZVlKfifD36jcOewfRINocICe/fbrxbu3Pf3sLyS+5lv2um9nsBv10Ts+pCnZGRycDvZfoHM8wjndOezvR4ONeareFcjSEcSybADLOR/JWygcAwOLYzizomq2TnA60ouPkmQPkXFksnKsgu1o6IjpsDE/5s7cBbz2rp2IhzKp5DhfQfxj1VKJozpJ9S3iclR19v73plaiLq1UylInKyFeuHf74WEXTc5TqbTQ7dZ5B20xZzHJma10p4koKb7vfX33LtPJQs/DxbTYH2FLat3KiPuIsPMMeebW8v6HxTPCRlvPhLtPhBfOHKqfFX+oEVceGz8TRTxBMWGSix4qhgWTRQ/dUpbwW7FVPS92w5rg/Jaye8bBzmLGM/HGam/cg1kGoDgWGxzKvjXOd7oyiR+OhXf8D3xD7s+Hji61k9qtl6YWJSvz7Gts4SlN7x6UsYQMKWbLcHRuyDBqB5cTyQRL5ROrtnpolBMyFImvgi3MLBf3vBg3g340qCzmyw+QHQwM0Tf41vlYLSwY7JmH5GA/2o/624PB7vZYh7TehxdN3xyWSmSLjOS0UmK3JV2sLSGrQtRRWQDcb9EWvWPSoXeOveuX8uxKI4ciVEUPbd/ZLwynoBFIFw9vqQ4zjqtxj23rVuvWYsEgwOUvuGZmp1ZkoDk3HKBKYESXQnasA9+OylrH7XS6welA1FzXQYgh1a/ErHqtEu3mcyG2CRZysI3neDhOMapIvN+jslkWdgzi4RPXuga5S6mfeekhh6t2QfQIEqhR4LRZ7kZTqOC8sHgMAO13rM2GgyeuxJbKpXS3hh69Xovp4L/bDeU4nrcHLBESxr7buE6adVdzTHsn2VXvykB4oWXclhPlrMQ4k0VunBUDrK88mJwobwoAW0wxYwNjYA6OsAcQYI4Vl8KKWi4G2uBqdapp8566jBgB2SwVHhIXaZbTRTK4DV2dkWVv7E1MjNPUHOTf6sLxKMvpFOd3KCN5RmSOJTc3w2XmeYMyGFXKxpfX5G4B8maltJmWfiN3tetgjVsx4jnUY6DMddpCD/kak2yhVLVZ8YHtpyXmvDhV/nzOb1lzIGfGJdchSpYJpLuwaqN3zIJIDfjh1AlNcJYRRhIDWqT8/iEW/ltRO1lTIkQ1jx11neeidgVrpdZKyxBgeumigSdFei/h6BbKIHoXl1Iho6P72vo/r3M391sbm2CWVHN20Yy83UVFeqZxXniuxl1OTEVyLVuINcTFeCLhilFHIpqLQA1lkyPG22ZvypsBWkvME2/vWzlgtJjLav7aQ5/l5gqscvfRB0FuCBQfd0hQMc+TjvEHO5Nf3idxQPXZiObJy2IhjXT4tU9A7AYnvata0tlzEUBxLmcRtVLg75FumEgAVXc0oFNlrTaP4SaacWmr6SPJ0f8Qm/XgX4fEmJFc3tlWEBVISJqmcPVIc2UFMUu8C27ypcCpDd2tcNiDSvQQl5ClOCYTngLoUE7gY9Kk4IzBNEOCygLbbPhaq4oiV7VVTSgteoEkH8P0jXwIVC8xdRskFHsgsBtHH9/5uffonX5iox0WVj3tJ4Gb9rRAWn4oEVWNVCkRuqSlPe70XopyzmWzEIXxWgMGa3s48WNgsAYYrACDFWCwAgwW/AUYrACDFWCwAgxWgMEKMFgBBivAYDX+5AyMpgCDFWCwFoDB8p/POW+62cuVzSsxgcw5hc6k4Vz69ItI5/bEOszfQfHEOI2LVMcG+e8DEpba0VW3dBl+oMVwQUu+3IHAysb9FdpMhlHGhRznRHxJI6jQoAy9JNMsxZJEJFd2fjPG8YQYg99i90QxXAtnR2hU5HCYLYrhdkJvqO/HQGLnM7jNKHnooUoFia1vY6+UhjycoeqeVq1GqstEdRmodvM0wzjVp7ILNQp4agFPbbnxD3hq1WEOeGoBT+0eB3cBTy3gqXWMUAkeFPDUAp5awFMLeGoBT82ZxICnFvDUAp5awFMLeGoBTy3gqQU8tacK8hXw1AKeGvwFPLWApxbw1ObRH/DUAp6a/gt4agFPLeCpBTy1gKfm/xbw1DqZZQFPLeCpBTy1gKcW8NQCnlplcAKemv36iShbwFMLeGpe/EHAUwt4agFPrQl10Xay/5eaHvFCxtwf0baz1S4lmqVD3X7klb7aMD1fIUGnWXqHEsK4JKKKXnRTgXZT3qUoYgi24DnCfqsjTNMiJ95ZJslFRmIIp7E4GUyq1RSiz7KcJ0VMktbwMzcEprfyl8YQGJAWYQ8LLCaLPj2YA8ViHhISy0KUQCxwunj88TMgskzJlOd3qNBQNC6dtEzgchy3HS4sDMMi/NOOhd3eK/3alT32ECjlMU7t9sBw1BGi6lzyrJhtvrtU6SrOikbXSm5KoKJ5toJqyi+5xGnEeD6Nsrh5ttoBTGKvFTKSx1W0iDlxE+YFPAaFVHRC6rrIvD2LjSXS4C1wQ4+FbF6wmitWACBB1F4PAHCSaamMFlE9qfksQJ+oRDlmY1LN8gEl6iPJ0aDf/x+NMzWthCuOkn65MVBGsZcZq8YQ1cLI7NAM72SFv1kDo9o1tDQTr3Esi5Zul0FAgxbKWUwSGIVRTkgb1ln5TQlhQNoOyxp5ql28z9nSG/pUL5ZIynQjETqDRBmbK6l0CwsIEQUN+3AeoQ8MvaWs+KrUKuZMUCFFCTPg2qx1mqWFajaeGJ0cFqMRyQU09+H8H/pqE4w9hKz6xAFI1YQgyrC27Wbo1Ku/69OgnnkfIL1qPUtubVZkXlSNXzUUvhrWuqzGm7c9lbfz2p4Q9GBWVqC3DIM1m9k9I3yzuYJiLmo8Z+lmpwGdY0JnGdE5+vrwhvShTWnTmNbF1pgTCwzeO3inxGJTo0QhzVWJoy0ENsvJiH59hTb+CeL/98ZCQyron+s0NxA/CCb3hua+ZfTHbIIrjDi/XIio2d3D0/eJCMiQROdEonP6J4l05ssUzo74qI1kHsdFRnX4DcSWmGeefTp6t9XUgLg+1gtpgE5TV5qX0imVZcK+bq7nZ/XfQaSqPntUBhus9GKzusVkd2USz1RRTZVLry/prs6/WekQUzKN4J2Wge8c+lmD30qyJquUZpFDWLmhX6SVC9E6eeCYr4k8Sx/0Ya1RO3keWGSW8xGF4HazGVGa8NF9Wcc8HNGUsnE5bHCArWRx9PFdFEAbO0cygDYG0MYA2rgYiQG0cQ2J0gG0MYA2BtDGANoYgHgCEE8A4kEBiCcA8QQgngDEE4B4AhBPAOIJQDwBiCcA8QQgngDEE4B4AhBPAOIJQDweEQGIJwDxBCCepyrqAMQTgHgCEE/H4AQgngDEE4B4AhBPAOIJQDxLHYIHIJ4AxFNnaIkgmQDEE4B4AhDPQ3IQgHgCEM98bQpAPAGI58kqWwDiCUA8AYgnAPEEIJ6qrE2mJVr+prWuXgtFJS+XiWgClc9OXMKrobgWH3OUpkiABHRKHWUI20f1qf4E3+hjeAh/sz+dnSxTGP9eSZUn9q6pTMtRJPTqaZX35MwSXwNg4QiPxzkZQzC6eUT00F15czGiuZB68D1cgm4pLQLpMDOkeeEU5BY5z5E1CM6lwDvQBcNPAjJnmLWI3F2hapHfi8MlCvevyuR7F91hx8rqSnW+QAgcySlvy2HCacrjS72f+o44NgRr8uFSrMTPcIgaEqsdVSfT7bkBy7C8VDL9fTXZ4spYjnsO/6a3FPOUFYL8CCOOWWIxBtI7E5DSye8PNNgL8i35Argd7X7ubEE8ZJpEc42XPFPKG1/rREJ7Wx5zJslXkA2VAPWUkly0o12MTCjDEmSuNl5vbMwEBIl1cNBBI03Jklkwq9F4riM54BTXdrocqSll7WQ+mN77NKaw39XTvpPM5pKtfv3e1B0/gqIvrdF4Lbq8qtIuQM0y6noPvaxR4sHa6NipKc6qwDbn3teVft0PwKpAhOU0npBER2LZE+K/IHRNh5hhraW6k0udFOAdD7vOI5+MViBN73e0aqxgFzBJ+7tzRN6OR9LWKVpbLuHFpB2dBIA/nMjQkChtEkjydiVsu0m634wwdHSHkA8LlqSgESTDcrLAdnxGl2+V2+EDoTjOIamZql2nTrKBjYcJJ4L4EFmdDBlg8/jzQH9TnQIZZgHYqTqeAdgpADsFYKcA7ISeLpZAAHYKwE4B2CkAO8Esxkxgfzf6LS6U5uUdlkTBPUa9D31e3uyo7nrM7qjsRJRlDzZN25v6nkZH1xGE09QGaqSkBiHU2g7j0pKpW1JfwK2P8qyFDtCDE4Mmewumdc7CvtEPKw1w3nlOUnKDlZNoTizK7GqTJfOMjCO0afO1emhziONrpQgs+YMPN3uIyHhrVTekPeQddYe9oxVC33/RgW7qETr2c618jbLsxzwz6W2CsnFaLnxaDr+cXqAd5SWKnVc02dxa5tJxTafxTv+LdtiIJn5ye9eoa7vS0n9z8pF0dLnQujQLO4Hn/jbVGx6ljvbWVQM/MI4SmpNYonhC00SDWGiIiB9UxMOc4OuE385XrBkiPlZMm0MvD7fbNl3eNjaXgHvKs7o/yvADrSwLmsXldtcrW8pXaDMZRhkXcpwT8SWNvhQkv1NWU5JplmJJIpIro7kJdSiM9Ww7Ai+Ga+HsCI2KHCodiWK4ndAb6jsFkNr/jETjCJU89BBJMWD+E5zHk61vM/mVhjzcrO/W0dYZ3zXfu2Z7+1yfMdO75oXM8bKnButyucDnKlFXgDIkuclFLY+c/MPTCi8aneVJMmOAY9qO+AKm6QIHLgHTNGCaBkzTgGm6lnPIgGkaME07Rsgt0gHTNGCaBkzTgGkaME1LkxgwTQOmacA0DZimAdM0YJoGTNOAafpUgTYDpmnANIW/gGkaME0Dpuk8+gOmacA01X8B0zRgmgZM04BpGjBN/d8CpmknsyxgmgZM04BpGjBNA6ZpwDStDE7ANLVfPxFlC5imAdPUiz8ImKYB0zRgmjaRO9pO9v9S0yNeyJj7I9p2ttqlRLN0qNuPvNJXG6bnKyToNEvvUEIYlwTCeiDlpgxPykmWE+XYKe9SFDEEW/AcYb/VEaZpkRPvLJPkIiMxhNNY2A8m1WoK0WdZzpMiJklr+JkbAtNb+cvMIbih5FYnp1qpmxPoIrcOL8BkXNr8pldo4+/qnXP1zkbNUZ3QNOl2Q791QvHZyTOxVV64QkIRiO2Z233dP19tTZT7aVL6FieBSEnyFRGmNsRJcw+25DHXcollnUm2QGEzu9bLL2zD9KwnHj4MkRd+GsU1ZZDhZy/XAJEXqCyG2xAQ4mZpGWEK3OgMOUjt66GYM0Zi2ZYWJ3HePN5eJnSykTnWkZ+6KlTfh9FIENlAgaom3jrQI5tkc2fPYIBBXxNnQSCvnB79KJKpYzwvyp24Y3GDs6UQCM5YAreo1WUD9O4WC0S+krgAiNw7Fk9yzuDCGNaOyjdtkh/OlflcTMXWwUgpu24djpWie0+wxEMsAKTvOmrvMee34hKPRn5kbLXr5fEBS3Ra1TqyrduZn1iyhMSSdED6NAMuHlrWTWS+7h5m9tKQiB+OYa9UDRpF7bVWAlH3bqxKZbtSNMhpDpD6u7jLSMvltofSoEzzZgI51pW85c2tCJ3rYIUyhGfo4a1jAbMsUlRG3by1JO88EG9eLJ3Nwp/B4kTK7NXOjuExinmT4x7azPFwSOX0y+ZWN0c5qYRkPQ5Xlgg0JBAgAseyELvfyfCrF/2ZPO98KUhBLhWTmy3L85QIsQgm1WrzFPpeeJbOnVHr0zr/+tGIRBMPUWs8o7GXlmAfoAJlxTClYqKGKEc5iQm9qYEYVZKq7ysKN2ozk+mX5v9obPxRx5la4tOUuiXeg7+sYmJ4KJgXlR8qnXo/tWNiBkjMzjF8DEjMcl+78EXJEYq52ltLgj7nac/EJ8YTMiU9nZeEWYIyLCfRMjtGt+JDS3NPLrolc6ER5iSPuQuSNuFVPQS2dUPZVvFqI5pzKtB5W7wSTaqJHsq4EHSYmkulbSwEmQ5TkqDPn962UYs0rTs75kQjivn01f7+3o5eAP725efKgvCT5NkSbOlYxXsyVs/TrAnbI3wZiVfiBVsnzBwV8OICqxTt7+8tQ0cFj3g1bcRy0iEcM4zLCAY24vekCNowRyYdlNUUa6nJkuNxFVV0aSLRkWvFHGHANhyj1II7Qz2hWzJEmVrHLNWSZ3MpdUlPUnab8aVsViNOYbV5JGVWD4w0g4JSghOXSdmC9jpvSEw7dQprHsmMEKYpkRNe9bm6vbGZfohjVTe5LKez0QPc2ELGgWihtxKqoP8Iw8oEt20a53ISY8aZ2l7ZLp1zyRnVB5W/Xlx8dAG+bcTmZETynOQLSnfmxc8S0WOfTLdmo0JFB6XexinjTDTW5rlK5J0QykJcxlUAjg6Hdh68kW5MR0MZkRvyNZUVlenWGGezKAP3vklY8zhrJm2fRXmI8l4Rp6N1JUfUHHWpDYY7I7bkopSOCIrv4pQgzBDJc56jCRaIx1AvJ1mSn5YJ0KX/3eo/bwwWV347JhUDHPDYAx57wGMv738DHnvAYw947CuJMuCxLy2ygMce8NgDHnvAY29j+3sDCw947AGPPeCxBzz2GrkBjz3gsT9BZgIee8BjD3jsAY894LE/wXPIgMce8Ng7Rsgt0gGPPeCxBzz2gMce8NhLkxjw2AMee8BjD3jsAY894LEHPPaAx/5UQcIDHnvAY4e/gMce8NgDHvs8+gMee8Bj138Bjz3gsQc89oDHHvDY/d8CHnsnsyzgsQc89oDHHvDYAx57wGOvDE7AY7dfPxFlC3jsAY/diz8IeOwBjz3gsQc89kfHY3/wTOAHyY5cHI15XiQZBze7Ar5Mhc/1IiDMORFFek/IiAsNRVOksiX9MdIoLj7izojn8OW2juFP/MfbaJzi/LoJgNjAopmJ6dK+k5nD2FEVVMUDW4ERh9sXIK4JhdnORPTX6K9LMrISvEyT3wY9erNGWEsE/1LJvmm7PneQvRjpjWFRGnZcTAuDvf4W3/FCovMJHUm1y8tp3B51PuqIOn946t7QXEh0xrJCohOS4ruZdMlhe7bpw9OlrcTrlMfXSnUv6JTMpEzZIYlFO0Z5K2i23+Nb87YzSzt6h6d7rGvKvDTjtqxcNMtitkpAggTKaC0+ckyKbhDhZro0WmSU0MIj1UqrKKY+fU6MMwid4q+PQOgUf21S2ZJdm2F2WR/G5Y1MkvMsWxG8vlQBPAVd5CPbnkGucAh2s+tsPBgGdhuHq0Fg14dpRgYQmhO23pDb94WA3SWJFgjsZexHuxDmA2H/7wAAAP//IddrBA==" + return "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" } diff --git a/model/error/_meta/fields.yml b/model/error/_meta/fields.yml index 8975da87a7d..330ba9a1f8b 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 dc8396d5667..0ab675b0840 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 fc3fc7adaba..1dddaac9561 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 be958fe1fe7..57479563852 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 32d4181fe34..28941558bee 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 From 1f57ac1e1399e48689168ff9718518996ff44069 Mon Sep 17 00:00:00 2001 From: Juan Date: Fri, 20 Nov 2020 13:44:24 +0100 Subject: [PATCH 04/15] update go.mod --- go.mod | 3 ++- go.sum | 9 +++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 5768a9e6efc..97a796260a8 100644 --- a/go.mod +++ b/go.mod @@ -21,7 +21,8 @@ require ( 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/elastic/package-registry v0.13.0 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 diff --git a/go.sum b/go.sum index 9e7429c83ae..0c005b8ea4f 100644 --- a/go.sum +++ b/go.sum @@ -67,6 +67,8 @@ github.com/DataDog/zstd v1.4.1 h1:3oxKN3wbHibqx897utPC2LTQU4J+IHWWJO+glkAkpFM= github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/Masterminds/semver v1.4.2 h1:WBLTQ37jOCzSLtXNdoo8bNM8876KhNqOKvrlGITgsTc= github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/semver/v3 v3.1.0 h1:Y2lUDsFKVRSYGojLJ1yLxSXdMmMYTYls0rCvoqmMUQk= +github.com/Masterminds/semver/v3 v3.1.0/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5 h1:ygIc8M6trr62pF5DucadTWGdEB4mEyvzi0e2nbcmcyA= github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= @@ -122,6 +124,8 @@ github.com/aws/aws-sdk-go-v2 v0.9.0 h1:dWtJKGRFv3UZkMBQaIzMsF0/y4ge3iQPWTzeC4r/v github.com/aws/aws-sdk-go-v2 v0.9.0/go.mod h1:sa1GePZ/LfBGI4dSq30f6uR4Tthll8axxtEPvlpXZ8U= github.com/awslabs/goformation/v3 v3.1.0/go.mod h1:hQ5RXo3GNm2laHWKizDzU5DsDy+yNcenSca2UxN0850= github.com/awslabs/goformation/v4 v4.1.0/go.mod h1:MBDN7u1lMNDoehbFuO4uPvgwPeolTMA2TzX1yO6KlxI= +github.com/aymerick/raymond v2.0.2+incompatible h1:VEp3GpgdAnv9B2GFyTvqgcKvY+mfKMjPOA3SbKLtnU0= +github.com/aymerick/raymond v2.0.2+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= @@ -279,11 +283,15 @@ 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= github.com/elastic/gosigar v0.12.0 h1:AsdhYCJlTudhfOYQyFNgx+fIVTfrDO0V1ST0vHgiapU= github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= +github.com/elastic/package-registry v0.13.0 h1:RdIzD111v1chu0L3MrbUGqgt6RZ9a9DVN3XMgjgOAu0= +github.com/elastic/package-registry v0.13.0/go.mod h1:oQx3Tg9ynuC6APd0o0OHud9kyPX6S6IzdJp/R4Hj1HY= github.com/elastic/sarama v0.0.0-20191122160421-355d120d0970 h1:rSo6gsz4zOanqtJ5fmZYQJvEJnA5YsVOB25casIwqUw= github.com/elastic/sarama v0.0.0-20191122160421-355d120d0970/go.mod h1:fGP8eQ6PugKEI0iUETYYtnP6d1pH/bdDMTel1X5ajsU= github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= @@ -539,6 +547,7 @@ 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/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= From eec4e1c6564651156c3e33b48c8ab9dbaea68c61 Mon Sep 17 00:00:00 2001 From: Juan Date: Fri, 20 Nov 2020 15:45:54 +0100 Subject: [PATCH 05/15] a few more bits --- .../0.1.0/data_stream/metrics/fields/ecs.yml | 486 ++++++++++++++++++ apmpackage/cmd/gen-package/main.go | 26 +- apmpackage/gendocs.go | 8 +- apmpackage/genfields.go | 8 +- 4 files changed, 517 insertions(+), 11 deletions(-) create mode 100644 apmpackage/apm/0.1.0/data_stream/metrics/fields/ecs.yml 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 00000000000..2a5d62025bd --- /dev/null +++ b/apmpackage/apm/0.1.0/data_stream/metrics/fields/ecs.yml @@ -0,0 +1,486 @@ +- name: labels + description: | + A flat mapping of user-defined labels with string, boolean or number values. +- name: service + description: | + Service fields. + fields: + - name: name + description: | + Immutable name of the service emitting this event. + - name: version + description: | + Version of the service emitting this event. + - name: node + fields: + - name: name + description: | + Unique meaningful name of the service node. +- name: transaction + fields: + - name: id + description: | + The transaction ID. +- name: agent + fields: + - name: name + description: | + Name of the agent used. + - name: version + description: | + Version of the agent used. + - name: ephemeral_id + description: | + The Ephemeral ID identifies a running process. +- name: container + title: Container + type: Container + 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 + description: | + Unique container id. +- name: host + description: | + Optional host fields. + fields: + - name: architecture + description: | + The architecture of the host the event was recorded on. + - name: hostname + description: | + The hostname of the host the event was recorded on. + - name: name + 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 + description: | + IP of the host that records the event. + - name: os + title: Operating System + group: 2 + type: Operating System + description: | + The OS fields contain information about the operating system. + fields: + - name: platform + description: | + The platform of the host the event was recorded on. +- name: process + description: | + Information pertaining to the running process where the data was collected + fields: + - name: args + level: extended + description: | + Process arguments. May be filtered to protect sensitive information. + - name: pid + description: | + Numeric process ID of the service process. + - name: ppid + description: | + Numeric ID of the service's parent process. + - name: title + description: | + Service process title. +- name: observer + fields: + - name: hostname + description: | + Hostname of the APM Server. + - name: version + description: | + APM Server version. + - name: type + description: | + The type will be set to `apm-server`. +- name: user + fields: + - name: name + description: | + The username of the logged in user. + - name: id + description: | + Identifier of the logged in user. + - name: email + description: | + Email of the logged in user. +- name: client + fields: + - name: 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 + fields: + - name: 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: Destination + 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 + 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 + description: IP addess of the destination. Can be one of multiple IPv4 or IPv6 addresses. + - name: port + level: core + format: string + description: Port of the destination. +- name: user_agent + title: User agent + type: User agent + 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 + description: | + Unparsed version of the user_agent. + multi_fields: + - type: text + - name: name + description: | + Name of the user agent. + - name: version + description: | + Version of the user agent. + - name: device + title: Device + type: Device + description: | + Information concerning the device. + fields: + - name: name + description: | + Name of the device. + - name: os + title: Operating System + type: Operating System + description: | + The OS fields contain information about the operating system. + fields: + - name: platform + description: | + Operating system platform (such centos, ubuntu, windows). + - name: name + description: | + Operating system name, without the version. + - name: full + description: | + Operating system name, including the version or code name. + - name: family + description: | + OS family (such as redhat, debian, freebsd, windows). + - name: version + description: | + Operating system version as a raw string. + - name: kernel + description: | + Operating system kernel version as a raw string. +- name: cloud + title: Cloud + group: 2 + type: Cloud + description: | + Cloud metadata reported by agents + fields: + - name: account + fields: + - name: id + level: extended + description: Cloud account ID + ignore_above: 1024 + - name: name + level: extended + description: Cloud account name + ignore_above: 1024 + - name: availability_zone + level: extended + description: Cloud availability zone name + ignore_above: 1024 + - name: instance + fields: + - name: id + level: extended + description: Cloud instance/machine ID + ignore_above: 1024 + - name: name + level: extended + description: Cloud instance/machine name + ignore_above: 1024 + - name: machine + fields: + - name: type + level: extended + description: Cloud instance/machine type + ignore_above: 1024 + - name: project + fields: + - name: id + level: extended + description: Cloud project ID + ignore_above: 1024 + - name: name + level: extended + description: Cloud project name + ignore_above: 1024 + - name: provider + level: extended + description: Cloud provider name + ignore_above: 1024 + - name: region + level: extended + description: Cloud region name + ignore_above: 1024 +- name: event + fields: + - name: outcome + level: core + 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 + description: | + A flat mapping of user-defined labels with string, boolean or number values. +- name: service + description: | + Service fields. + fields: + - name: name + description: | + Immutable name of the service emitting this event. + - name: version + description: | + Version of the service emitting this event. + - name: node + fields: + - name: name + description: | + Unique meaningful name of the service node. +- name: agent + fields: + - name: name + description: | + Name of the agent used. + - name: version + description: | + Version of the agent used. + - name: ephemeral_id + description: | + The Ephemeral ID identifies a running process. +- name: container + title: Container + type: Container + 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 + description: | + Unique container id. +- name: host + description: | + Optional host fields. + fields: + - name: architecture + description: | + The architecture of the host the event was recorded on. + - name: hostname + description: | + The hostname of the host the event was recorded on. + - name: name + 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 + description: | + IP of the host that records the event. + - name: os + title: Operating System + group: 2 + type: Operating System + description: | + The OS fields contain information about the operating system. + fields: + - name: platform + description: | + The platform of the host the event was recorded on. +- name: process + description: | + Information pertaining to the running process where the data was collected + fields: + - name: args + level: extended + description: | + Process arguments. May be filtered to protect sensitive information. + - name: pid + description: | + Numeric process ID of the service process. + - name: ppid + description: | + Numeric ID of the service's parent process. + - name: title + description: | + Service process title. +- name: observer + fields: + - name: hostname + description: | + Hostname of the APM Server. + - name: version + description: | + APM Server version. + - name: type + description: | + The type will be set to `apm-server`. +- name: user + fields: + - name: name + description: | + The username of the logged in user. + - name: id + description: | + Identifier of the logged in user. + - name: email + description: | + Email of the logged in user. +- name: client + fields: + - name: 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 + fields: + - name: 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: Destination + 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 + 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 + description: IP addess of the destination. Can be one of multiple IPv4 or IPv6 addresses. + - name: port + level: core + format: string + description: Port of the destination. +- name: user_agent + title: User agent + type: User agent + 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 + description: | + Unparsed version of the user_agent. + multi_fields: + - type: text + - name: name + description: | + Name of the user agent. + - name: version + description: | + Version of the user agent. + - name: device + title: Device + type: Device + description: | + Information concerning the device. + fields: + - name: name + description: | + Name of the device. + - name: os + title: Operating System + type: Operating System + description: | + The OS fields contain information about the operating system. + fields: + - name: platform + description: | + Operating system platform (such centos, ubuntu, windows). + - name: name + description: | + Operating system name, without the version. + - name: full + description: | + Operating system name, including the version or code name. + - name: family + description: | + OS family (such as redhat, debian, freebsd, windows). + - name: version + description: | + Operating system version as a raw string. + - name: kernel + description: | + Operating system kernel version as a raw string. +- name: cloud + title: Cloud + group: 2 + type: Cloud + description: | + Cloud metadata reported by agents + fields: + - name: account + fields: + - name: id + level: extended + description: Cloud account ID + ignore_above: 1024 + - name: name + level: extended + description: Cloud account name + ignore_above: 1024 + - name: availability_zone + level: extended + description: Cloud availability zone name + ignore_above: 1024 + - name: instance + fields: + - name: id + level: extended + description: Cloud instance/machine ID + ignore_above: 1024 + - name: name + level: extended + description: Cloud instance/machine name + ignore_above: 1024 + - name: machine + fields: + - name: type + level: extended + description: Cloud instance/machine type + ignore_above: 1024 + - name: project + fields: + - name: id + level: extended + description: Cloud project ID + ignore_above: 1024 + - name: name + level: extended + description: Cloud project name + ignore_above: 1024 + - name: provider + level: extended + description: Cloud provider name + ignore_above: 1024 + - name: region + level: extended + description: Cloud region name + ignore_above: 1024 diff --git a/apmpackage/cmd/gen-package/main.go b/apmpackage/cmd/gen-package/main.go index a49b9bdc031..d437260ee3a 100644 --- a/apmpackage/cmd/gen-package/main.go +++ b/apmpackage/cmd/gen-package/main.go @@ -19,15 +19,35 @@ package main import ( "flag" - "github.com/elastic/apm-server/apmpackage" + "io/ioutil" + "os" + "path/filepath" ) var ecsDir string +var packageVersion string func main() { flag.StringVar(&ecsDir, "ecsDir", "../ecs", "Path to the Elastic Common Schema repository") + flag.StringVar(&packageVersion, "packageVersion", "0.1.0", "Package version") flag.Parse() - inputFields := apmpackage.GenerateFields(ecsDir) - apmpackage.GenerateDocs(inputFields) + clear(packageVersion) + inputFields := apmpackage.GenerateFields(ecsDir, packageVersion) + apmpackage.GenerateDocs(inputFields, packageVersion) +} + +func clear(version string) { + dir := filepath.Join("apmpackage/apm/", version, "/data_stream") + fileInfo, err := ioutil.ReadDir(dir) + if err != nil { + panic(err) + } + for _, f := range fileInfo { + if f.IsDir() { + os.Remove(filepath.Join(dir, f.Name(), "fields/ecs.yml")) + os.Remove(filepath.Join(dir, f.Name(), "fields/fields.yml")) + } + } + ioutil.WriteFile("apmpackage/apm/0.1.0/docs/README.md", nil, 0644) } diff --git a/apmpackage/gendocs.go b/apmpackage/gendocs.go index aadf21572ee..29400ea63ba 100644 --- a/apmpackage/gendocs.go +++ b/apmpackage/gendocs.go @@ -22,12 +22,13 @@ import ( "io/ioutil" "os" "path" + "path/filepath" "strings" "text/template" ) -func GenerateDocs(inputFields map[string][]FieldDefinition) { - // TODO sort alphabetically +func GenerateDocs(inputFields map[string][]FieldDefinition, version string) { + // TODO sort alphabetically and add datasets (from base-fields) data := FlattenAPMFields{ Traces: flatten("", inputFields["traces"]), Metrics: flatten("", inputFields["metrics"]), @@ -44,7 +45,8 @@ func GenerateDocs(inputFields map[string][]FieldDefinition) { if err != nil { panic(err) } - file, err := os.OpenFile("apmpackage/apm/0.1.0/docs/README.md", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644) + path := filepath.Join("apmpackage/apm/", version, "/docs/README.md") + file, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644) if err != nil { panic(err) } diff --git a/apmpackage/genfields.go b/apmpackage/genfields.go index befec183521..d03e8c9d2d1 100644 --- a/apmpackage/genfields.go +++ b/apmpackage/genfields.go @@ -24,8 +24,7 @@ import ( "gopkg.in/yaml.v2" ) -func GenerateFields(ecsDir string) map[string][]FieldDefinition { - // TODO remove all field files before generate them +func GenerateFields(ecsDir, version string) map[string][]FieldDefinition { // TODO get this from GH directly ecsFlatFields := loadECSFields(ecsDir) @@ -48,8 +47,7 @@ func GenerateFields(ecsDir string) map[string][]FieldDefinition { nonECSFields = append(nonECSFields, nonECS) } } - // TODO handle version better - dataStreamFieldsPath := filepath.Join("apmpackage/apm/0.1.0/data_stream", streamType, "fields") + dataStreamFieldsPath := filepath.Join("apmpackage/apm/", version, "/data_stream", streamType, "/fields") var writeOutFields = func(fName string, data []FieldDefinition) { bytes, err := yaml.Marshal(&data) if err != nil { @@ -159,7 +157,7 @@ func overrideFieldValues(fs []FieldDefinition) []FieldDefinition { if f.Type == "" { f.Type = "keyword" } else if f.Type == "group" { - // f.Description = "" TODO beats does this after + // f.Description = "" beats does this after } f.Fields = overrideFieldValues(f.Fields) ret = append(ret, f) From edfdb7968dfda3e7d8833b688a91f5437d7b695b Mon Sep 17 00:00:00 2001 From: Juan Date: Mon, 23 Nov 2020 12:57:43 +0100 Subject: [PATCH 06/15] add base fields, sort fields, and unexpose types --- .../data_stream/logs/fields/base-fields.yml | 6 +- .../metrics/fields/base-fields.yml | 6 +- .../data_stream/traces/fields/base-fields.yml | 6 +- apmpackage/apm/0.1.0/docs/README.md | 806 +++++++++--------- apmpackage/apm/0.1.0/manifest.yml | 17 +- apmpackage/cmd/gen-package/main.go | 5 +- apmpackage/gendocs.go | 45 +- apmpackage/genfields.go | 38 +- apmpackage/model.go | 54 +- beater/config/config_test.go | 16 +- .../modeldecoder/generator/jsonschema_test.go | 3 +- tests/system/apmserver.py | 10 +- .../aggregation/txmetrics/aggregator_test.go | 4 +- 13 files changed, 523 insertions(+), 493 deletions(-) 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 index 7c798f4534c..bef973826be 100644 --- 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 @@ -1,3 +1,6 @@ +- name: '@timestamp' + type: date + description: Event timestamp. - name: data_stream.type type: constant_keyword description: Data stream type. @@ -7,6 +10,3 @@ - name: data_stream.namespace type: constant_keyword description: Data stream namespace. -- name: '@timestamp' - type: date - description: Event timestamp. 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 index 7c798f4534c..bef973826be 100644 --- 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 @@ -1,3 +1,6 @@ +- name: '@timestamp' + type: date + description: Event timestamp. - name: data_stream.type type: constant_keyword description: Data stream type. @@ -7,6 +10,3 @@ - name: data_stream.namespace type: constant_keyword description: Data stream namespace. -- name: '@timestamp' - type: date - description: Event timestamp. 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 index 7c798f4534c..bef973826be 100644 --- 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 @@ -1,3 +1,6 @@ +- name: '@timestamp' + type: date + description: Event timestamp. - name: data_stream.type type: constant_keyword description: Data stream type. @@ -7,6 +10,3 @@ - name: data_stream.namespace type: constant_keyword description: Data stream namespace. -- name: '@timestamp' - type: date - description: Event timestamp. diff --git a/apmpackage/apm/0.1.0/docs/README.md b/apmpackage/apm/0.1.0/docs/README.md index 91064346ce3..a8af882da86 100644 --- a/apmpackage/apm/0.1.0/docs/README.md +++ b/apmpackage/apm/0.1.0/docs/README.md @@ -18,210 +18,214 @@ Lorem ipsum descriptium | Field | Description | Type | ECS | |---|---|---|:---:| -|processor.name|Processor name.|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) | -|timestamp.us|Timestamp of the event in microseconds since Unix epoch.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | -|url.scheme|The protocol of the request, e.g. "https:".|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.domain|The hostname of the request, e.g. "example.com".|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.path|The path of the request, e.g. "/search".|keyword| ![](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.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) | -|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) | -|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.headers|The canonical headers of the monitored HTTP request.|object| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | -|http.request.referrer|Referrer for this HTTP request.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.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.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) | -|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) | -|service.name|Immutable name 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) | -|service.environment|Service environment.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.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.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.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.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) | -|transaction.id|The transaction ID.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.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.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.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.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.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.breakdown.count||long| ![](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.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.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) | -|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) | -|parent.id|The ID of the parent event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|@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.ephemeral_id|The Ephemeral ID identifies a running process.|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) | -|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) | -|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.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.ip|IP of the host that records the event.|ip| ![](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) | -|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) | -|observer.listening|Address the server is listening on.|keyword| ![](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.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.type|The type will be set to `apm-server`.|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.id|Identifier 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) | +|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) | -|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) | -|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) | -|user_agent.original|Unparsed version 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.version|Version of the user agent.|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.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.name|Operating system name, without the version.|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.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.version|Operating system 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) | -|experimental|Additional experimental data sent by the agents.|object| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.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) | -|transaction.duration.us|Total duration of this transaction, in microseconds.|long| ![](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.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.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.tbt|The Total Blocking Time 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.sum|The sum of longtask durations|scaled_float| ![](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.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.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.message.age.ms|Age of a message in milliseconds.|long| ![](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.event|Processor event.|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) | +|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) | -|service.name|Immutable name 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) | +|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.node.name|Unique meaningful name of the service node.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.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.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) | -|transaction.id|The transaction ID.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.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.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.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) | +|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.breakdown.count||long| ![](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.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.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) | -|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) | -|parent.id|The ID of the parent event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.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.ephemeral_id|The Ephemeral ID identifies a running process.|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) | -|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) | -|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.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.ip|IP of the host that records the event.|ip| ![](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) | -|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) | -|observer.listening|Address the server is listening on.|keyword| ![](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.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.type|The type will be set to `apm-server`.|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.id|Identifier of the logged in user.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.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) | -|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) | -|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) | -|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) | -|user_agent.original|Unparsed version 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.version|Version of the user agent.|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.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.name|Operating system name, without the version.|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.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.version|Operating system version as a raw string.|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) | -|experimental|Additional experimental data sent by the agents.|object| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.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) | -|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) | +|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) | -|child.id|The ID(s)s of the child event(s).|keyword| ![](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.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.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.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.duration.us|Duration of the span, in microseconds.|long| ![](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.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.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.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.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.message.age.ms|Age of a message in milliseconds.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | ### Example @@ -448,175 +452,179 @@ Lorem ipsum descriptium | Field | Description | Type | ECS | |---|---|---|:---:| -|processor.name|Processor name.|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) | -|timestamp.us|Timestamp of the event in microseconds since Unix epoch.|long| ![](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) | -|service.name|Immutable name 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) | -|service.environment|Service environment.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.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.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.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.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) | -|transaction.id|The transaction ID.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.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.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.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.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.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.breakdown.count||long| ![](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) | -|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.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.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) | +|@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.ephemeral_id|The Ephemeral ID identifies a running process.|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) | -|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) | -|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.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.ip|IP of the host that records the event.|ip| ![](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) | -|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) | -|observer.listening|Address the server is listening on.|keyword| ![](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.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.type|The type will be set to `apm-server`.|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.id|Identifier 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) | +|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) | -|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) | -|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) | -|user_agent.original|Unparsed version 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.version|Version of the user agent.|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.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.name|Operating system name, without the version.|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.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.version|Operating system 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) | -|experimental|Additional experimental data sent by the agents.|object| ![](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) | +|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) | -|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) | -|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.total|Total memory.|long| ![](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.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.size|The total virtual memory the process has.|long| ![](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.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) | -|processor.name|Processor name.|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) | -|timestamp.us|Timestamp of the event in microseconds since Unix epoch.|long| ![](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) | -|service.name|Immutable name 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) | -|service.environment|Service environment.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.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.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.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.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) | -|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.ephemeral_id|The Ephemeral ID identifies a running process.|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) | -|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) | +|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.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.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) | -|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) | -|observer.listening|Address the server is listening on.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.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) | +|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.type|The type will be set to `apm-server`.|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.id|Identifier 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) | -|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) | -|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) | -|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) | -|user_agent.original|Unparsed version 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.version|Version of the user agent.|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.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.name|Operating system name, without the version.|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.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.version|Operating system 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) | -|experimental|Additional experimental data sent by the agents.|object| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.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) | -|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.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.cpu.ns|Amount of CPU time profiled, in nanoseconds.|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) | +|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.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.function|Function name for the top stack frame.|keyword| ![](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.line|Source code line number for the top stack frame.|long| ![](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.function|Function name for a stack frame.|keyword| ![](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.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.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 @@ -690,86 +698,14 @@ Lorem ipsum descriptium | Field | Description | Type | ECS | |---|---|---|:---:| -|processor.name|Processor name.|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) | -|timestamp.us|Timestamp of the event in microseconds since Unix epoch.|long| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | -|url.scheme|The protocol of the request, e.g. "https:".|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.domain|The hostname of the request, e.g. "example.com".|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.path|The path of the request, e.g. "/search".|keyword| ![](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.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) | -|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) | -|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.headers|The canonical headers of the monitored HTTP request.|object| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | -|http.request.referrer|Referrer for this HTTP request.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.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.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) | -|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) | -|service.name|Immutable name 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) | -|service.environment|Service environment.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.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.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.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.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) | -|transaction.id|The transaction ID.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.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.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.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.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.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.breakdown.count||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) | -|parent.id|The ID of the parent event.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | +|@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) | -|agent.ephemeral_id|The Ephemeral ID identifies a running process.|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) | -|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) | -|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.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.ip|IP of the host that records the event.|ip| ![](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) | -|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) | -|observer.listening|Address the server is listening on.|keyword| ![](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.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.type|The type will be set to `apm-server`.|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.id|Identifier 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) | |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) | -|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) | -|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) | -|user_agent.original|Unparsed version 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.version|Version of the user agent.|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.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.name|Operating system name, without the version.|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.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.version|Operating system 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) | -|experimental|Additional experimental data sent by the agents.|object| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.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) | @@ -780,18 +716,94 @@ Lorem ipsum descriptium |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) | -|error.id|The ID of the error.|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.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.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.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.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 diff --git a/apmpackage/apm/0.1.0/manifest.yml b/apmpackage/apm/0.1.0/manifest.yml index be3d9c9d1a1..434d9a66927 100644 --- a/apmpackage/apm/0.1.0/manifest.yml +++ b/apmpackage/apm/0.1.0/manifest.yml @@ -3,7 +3,7 @@ name: apm title: Elastic APM version: 0.1.0 license: basic -description: Manage Elastic APM agents +description: Ingest APM data type: solution # integration / solution categories: - monitoring # TODO do we need a new category? @@ -13,18 +13,17 @@ conditions: policy_templates: - name: apmserver title: Elastic APM Integration - description: Elastic APM Integration # Not shown in UI ? + description: Elastic APM Integration inputs: - type: apm title: Collect application traces description: Collect application traces vars: - - name: enable_rum - type: bool - title: Enable RUM - # TODO would be nice a link to a description - required: true - show_user: true - default: false + - name: enable_rum + type: bool + title: Enable RUM + required: true + show_user: true + default: false owner: github: elastic/apm-server diff --git a/apmpackage/cmd/gen-package/main.go b/apmpackage/cmd/gen-package/main.go index d437260ee3a..eaef907bb9c 100644 --- a/apmpackage/cmd/gen-package/main.go +++ b/apmpackage/cmd/gen-package/main.go @@ -19,10 +19,11 @@ package main import ( "flag" - "github.com/elastic/apm-server/apmpackage" "io/ioutil" "os" "path/filepath" + + "github.com/elastic/apm-server/apmpackage" ) var ecsDir string @@ -49,5 +50,5 @@ func clear(version string) { os.Remove(filepath.Join(dir, f.Name(), "fields/fields.yml")) } } - ioutil.WriteFile("apmpackage/apm/0.1.0/docs/README.md", nil, 0644) + ioutil.WriteFile(filepath.Join("apmpackage/apm/", version, "/docs/README.md"), nil, 0644) } diff --git a/apmpackage/gendocs.go b/apmpackage/gendocs.go index 29400ea63ba..0d986a1c3f8 100644 --- a/apmpackage/gendocs.go +++ b/apmpackage/gendocs.go @@ -23,16 +23,16 @@ import ( "os" "path" "path/filepath" + "sort" "strings" "text/template" ) -func GenerateDocs(inputFields map[string][]FieldDefinition, version string) { - // TODO sort alphabetically and add datasets (from base-fields) - data := FlattenAPMFields{ - Traces: flatten("", inputFields["traces"]), - Metrics: flatten("", inputFields["metrics"]), - Logs: flatten("", inputFields["logs"]), +func GenerateDocs(inputFields map[string]fields, 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"), @@ -56,18 +56,39 @@ func GenerateDocs(inputFields map[string][]FieldDefinition, version string) { } } -type FlattenAPMFields struct { - Traces []FieldDefinition - Metrics []FieldDefinition - Logs []FieldDefinition +type docsData struct { + Traces []field + Metrics []field + Logs []field TransactionExample string SpanExample string MetricsExample string ErrorExample string } -func flatten(name string, fs []FieldDefinition) []FieldDefinition { - var ret []FieldDefinition +func prepareFields(inputFields map[string]fields, version, streamType string) fields { + baseFieldsPath := filepath.Join( + "apmpackage/apm/", version, "/data_stream/", streamType, "/fields/base-fields.yml") + extend := func(fs fields) fields { + //TODO mark aas ECS + var baseFields fields + for _, f := range loadFieldsFile(baseFieldsPath) { + f.IsECS = true + baseFields = append(baseFields, f) + } + fs = append(baseFields, fs...) + return fs + } + return extend(order(flatten("", inputFields[streamType]))) +} + +func order(fs fields) fields { + sort.Sort(fs) + return fs +} + +func flatten(name string, fs fields) fields { + var ret fields for _, f := range fs { if name != "" { f.Name = name + "." + f.Name diff --git a/apmpackage/genfields.go b/apmpackage/genfields.go index d03e8c9d2d1..2cf2db92de9 100644 --- a/apmpackage/genfields.go +++ b/apmpackage/genfields.go @@ -24,31 +24,31 @@ import ( "gopkg.in/yaml.v2" ) -func GenerateFields(ecsDir, version string) map[string][]FieldDefinition { +func GenerateFields(ecsDir, version string) map[string]fields { // TODO get this from GH directly ecsFlatFields := loadECSFields(ecsDir) - inputFieldsFiles := map[string][]FieldDefinition{ + inputFieldsFiles := map[string]fields{ "logs": concatFields("model/error/_meta/fields.yml"), "metrics": concatFields("model/metricset/_meta/fields.yml", "model/profile/_meta/fields.yml"), "traces": concatFields("model/transaction/_meta/fields.yml", "model/span/_meta/fields.yml"), } for streamType, inputFields := range inputFieldsFiles { - var ecsFields []FieldDefinition - var nonECSFields []FieldDefinition + var ecsFields fields + var nonECSFields fields 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() { + if len(nonECS.Fields) > 0 || ecs.isNonECSLeaf() { nonECSFields = append(nonECSFields, nonECS) } } dataStreamFieldsPath := filepath.Join("apmpackage/apm/", version, "/data_stream", streamType, "/fields") - var writeOutFields = func(fName string, data []FieldDefinition) { + var writeOutFields = func(fName string, data fields) { bytes, err := yaml.Marshal(&data) if err != nil { panic(err) @@ -68,9 +68,9 @@ func GenerateFields(ecsDir, version string) map[string][]FieldDefinition { return inputFieldsFiles } -func populateECSInfo(ecsFlatFields map[string]interface{}, fields []FieldDefinition) []FieldDefinition { - var traverse func(string, []FieldDefinition) ([]FieldDefinition, bool, bool) - traverse = func(fName string, fs []FieldDefinition) ([]FieldDefinition, bool, bool) { +func populateECSInfo(ecsFlatFields map[string]interface{}, inputFields fields) fields { + var traverse func(string, fields) (fields, bool, bool) + traverse = func(fName string, fs fields) (fields, bool, bool) { var ecsCount int for idx, field := range fs { fieldName := field.Name @@ -91,11 +91,11 @@ func populateECSInfo(ecsFlatFields map[string]interface{}, fields []FieldDefinit // 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("", fields) + ret, _, _ := traverse("", inputFields) return ret } -func splitECSFields(parent FieldDefinition) (FieldDefinition, FieldDefinition) { +func splitECSFields(parent field) (field, field) { ecsCopy := copyFieldRoot(parent) nonECSCopy := copyFieldRoot(parent) for _, field := range parent.Fields { @@ -103,7 +103,7 @@ func splitECSFields(parent FieldDefinition) (FieldDefinition, FieldDefinition) { if ecsChild.HasECS || ecsChild.IsECS { ecsCopy.Fields = append(ecsCopy.Fields, ecsChild) } - if nonECSChild.HasNonECS || nonECSChild.IsNonECSLeaf() { + if nonECSChild.HasNonECS || nonECSChild.isNonECSLeaf() { nonECSCopy.Fields = append(nonECSCopy.Fields, nonECSChild) } } @@ -126,8 +126,8 @@ func loadECSFields(ecsDir string) map[string]interface{} { return ret } -func concatFields(fileNames ...string) []FieldDefinition { - var ret []FieldDefinition +func concatFields(fileNames ...string) fields { + var ret fields for _, fname := range fileNames { fs := loadFieldsFile(fname) for _, key := range fs { @@ -137,13 +137,13 @@ func concatFields(fileNames ...string) []FieldDefinition { return ret } -func loadFieldsFile(path string) []FieldDefinition { +func loadFieldsFile(path string) fields { fields, err := ioutil.ReadFile(path) if err != nil { panic(err) } - var fs []FieldDefinition + var fs []field err = yaml.Unmarshal(fields, &fs) if err != nil { panic(err) @@ -151,13 +151,11 @@ func loadFieldsFile(path string) []FieldDefinition { return overrideFieldValues(fs) } -func overrideFieldValues(fs []FieldDefinition) []FieldDefinition { - var ret []FieldDefinition +func overrideFieldValues(fs fields) fields { + var ret []field for _, f := range fs { if f.Type == "" { f.Type = "keyword" - } else if f.Type == "group" { - // f.Description = "" beats does this after } f.Fields = overrideFieldValues(f.Fields) ret = append(ret, f) diff --git a/apmpackage/model.go b/apmpackage/model.go index 2fe640fb20b..918b99d04fe 100644 --- a/apmpackage/model.go +++ b/apmpackage/model.go @@ -17,43 +17,47 @@ package apmpackage -type FieldDefinition 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"` - // Example is not consistent in ECS schema (either single field or array) - //Example string `yaml:"example,omitempty"` +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 []FieldDefinition `yaml:"fields,omitempty"` + MultiFields []multiFieldDefinition `yaml:"multi_fields,omitempty"` + Fields []field `yaml:"fields,omitempty"` IsECS bool `yaml:"-"` HasECS bool `yaml:"-"` HasNonECS bool `yaml:"-"` } -func (f FieldDefinition) IsNonECSLeaf() bool { +func (f field) isNonECSLeaf() bool { return f.Type != "group" && !f.IsECS } -type MultiFieldDefinition struct { +type fields []field + +func (f fields) Len() int { return len(f) } +func (f fields) Less(i, j int) bool { return f[i].Name < f[j].Name } +func (f fields) Swap(i, j int) { f[i], f[j] = f[j], f[i] } + +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 FieldDefinition) FieldDefinition { - return FieldDefinition{ +func copyFieldRoot(f field) field { + return field{ Name: f.Name, Key: f.Key, Title: f.Title, @@ -75,9 +79,3 @@ func copyFieldRoot(f FieldDefinition) FieldDefinition { HasNonECS: f.HasNonECS, } } - -type APMFields struct { - Traces []FieldDefinition - Logs []FieldDefinition - Metrics []FieldDefinition -} diff --git a/beater/config/config_test.go b/beater/config/config_test.go index d8852b89371..a4bf7d7440e 100644 --- a/beater/config/config_test.go +++ b/beater/config/config_test.go @@ -448,24 +448,24 @@ func TestTLSSettings(t *testing.T) { "ConfiguredToRequired": { config: map[string]interface{}{"ssl": map[string]interface{}{ "client_authentication": "required", - "key": "../../testdata/tls/key.pem", - "certificate": "../../testdata/tls/certificate.pem", + "key": "../../testdata/tls/key.pem", + "certificate": "../../testdata/tls/certificate.pem", }}, tls: &tlscommon.ServerConfig{ClientAuth: 4, Certificate: testdataCertificateConfig}, }, "ConfiguredToOptional": { config: map[string]interface{}{"ssl": map[string]interface{}{ "client_authentication": "optional", - "key": "../../testdata/tls/key.pem", - "certificate": "../../testdata/tls/certificate.pem", + "key": "../../testdata/tls/key.pem", + "certificate": "../../testdata/tls/certificate.pem", }}, tls: &tlscommon.ServerConfig{ClientAuth: 3, Certificate: testdataCertificateConfig}, }, "DefaultRequiredByCA": { config: map[string]interface{}{"ssl": map[string]interface{}{ "certificate_authorities": []string{"../../testdata/tls/ca.crt.pem"}, - "key": "../../testdata/tls/key.pem", - "certificate": "../../testdata/tls/certificate.pem", + "key": "../../testdata/tls/key.pem", + "certificate": "../../testdata/tls/certificate.pem", }}, tls: &tlscommon.ServerConfig{ClientAuth: 4, Certificate: testdataCertificateConfig}, }, @@ -473,8 +473,8 @@ func TestTLSSettings(t *testing.T) { config: map[string]interface{}{"ssl": map[string]interface{}{ "client_authentication": "none", "certificate_authorities": []string{"../../testdata/tls/ca.crt.pem"}, - "key": "../../testdata/tls/key.pem", - "certificate": "../../testdata/tls/certificate.pem", + "key": "../../testdata/tls/key.pem", + "certificate": "../../testdata/tls/certificate.pem", }}, tls: &tlscommon.ServerConfig{ClientAuth: 0, Certificate: testdataCertificateConfig}, }, diff --git a/model/modeldecoder/generator/jsonschema_test.go b/model/modeldecoder/generator/jsonschema_test.go index 448c39dac0b..d35a1801c67 100644 --- a/model/modeldecoder/generator/jsonschema_test.go +++ b/model/modeldecoder/generator/jsonschema_test.go @@ -23,10 +23,11 @@ import ( "reflect" "testing" - "github.com/elastic/apm-server/model/modeldecoder/generator/generatortest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/xeipuuv/gojsonschema" + + "github.com/elastic/apm-server/model/modeldecoder/generator/generatortest" ) type testcase struct { diff --git a/tests/system/apmserver.py b/tests/system/apmserver.py index 9a02f511520..cdfa165af1e 100644 --- a/tests/system/apmserver.py +++ b/tests/system/apmserver.py @@ -1,3 +1,8 @@ +from kibana import Kibana +from es_helper import index_smap, index_span, index_error, apm_prefix +from es_helper import cleanup, default_pipelines +from helper import wait_until +from beat.beat import INTEGRATION_TESTS, TestCase, TimeoutError from datetime import datetime, timedelta import json import os @@ -19,11 +24,6 @@ beats_dir = beats_line.split(" ", 2)[1] sys.path.append(os.path.join(beats_dir, 'libbeat', 'tests', 'system')) -from beat.beat import INTEGRATION_TESTS, TestCase, TimeoutError -from helper import wait_until -from es_helper import cleanup, default_pipelines -from es_helper import index_smap, index_span, index_error, apm_prefix -from kibana import Kibana integration_test = unittest.skipUnless(INTEGRATION_TESTS, "integration test") diagnostic_interval = float(os.environ.get('DIAGNOSTIC_INTERVAL', 0)) diff --git a/x-pack/apm-server/aggregation/txmetrics/aggregator_test.go b/x-pack/apm-server/aggregation/txmetrics/aggregator_test.go index f1221a7615c..f8ad2610166 100644 --- a/x-pack/apm-server/aggregation/txmetrics/aggregator_test.go +++ b/x-pack/apm-server/aggregation/txmetrics/aggregator_test.go @@ -77,7 +77,7 @@ func TestProcessTransformablesOverflow(t *testing.T) { MaxTransactionGroups: 2, MetricsInterval: time.Microsecond, HDRHistogramSignificantFigures: 1, - Logger: logger, + Logger: logger, }) require.NoError(t, err) @@ -214,7 +214,7 @@ func TestAggregatorRunPublishErrors(t *testing.T) { MaxTransactionGroups: 2, MetricsInterval: 10 * time.Millisecond, HDRHistogramSignificantFigures: 1, - Logger: logger, + Logger: logger, }) require.NoError(t, err) From 2786040c9dcaf75deefa36c838d3abf7cac0a596 Mon Sep 17 00:00:00 2001 From: Juan Date: Mon, 23 Nov 2020 15:40:16 +0100 Subject: [PATCH 07/15] add Makefile target and update readme --- Makefile | 12 +++++++- README.md | 15 ++++++++++ apmpackage/cmd/gen-package/main.go | 17 ++++------- apmpackage/gendocs.go | 12 +++----- apmpackage/genfields.go | 18 ++++++------ apmpackage/paths.go | 46 ++++++++++++++++++++++++++++++ docs/fields.asciidoc | 10 +++++++ include/fields.go | 2 +- 8 files changed, 103 insertions(+), 29 deletions(-) create mode 100644 apmpackage/paths.go diff --git a/Makefile b/Makefile index fcffa1e4a31..b71faeccd58 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 gen-package go-generate add-headers copy-docs 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/README.md b/README.md index 7fe8d948011..d6203c63a3b 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/cmd/gen-package/main.go b/apmpackage/cmd/gen-package/main.go index eaef907bb9c..37948ca20cc 100644 --- a/apmpackage/cmd/gen-package/main.go +++ b/apmpackage/cmd/gen-package/main.go @@ -19,36 +19,31 @@ package main import ( "flag" + "github.com/elastic/apm-server/apmpackage" "io/ioutil" "os" - "path/filepath" - - "github.com/elastic/apm-server/apmpackage" ) -var ecsDir string var packageVersion string func main() { - flag.StringVar(&ecsDir, "ecsDir", "../ecs", "Path to the Elastic Common Schema repository") flag.StringVar(&packageVersion, "packageVersion", "0.1.0", "Package version") flag.Parse() clear(packageVersion) - inputFields := apmpackage.GenerateFields(ecsDir, packageVersion) + inputFields := apmpackage.GenerateFields(packageVersion) apmpackage.GenerateDocs(inputFields, packageVersion) } func clear(version string) { - dir := filepath.Join("apmpackage/apm/", version, "/data_stream") - fileInfo, err := ioutil.ReadDir(dir) + fileInfo, err := ioutil.ReadDir(apmpackage.DataStreamPath(version)) if err != nil { panic(err) } for _, f := range fileInfo { if f.IsDir() { - os.Remove(filepath.Join(dir, f.Name(), "fields/ecs.yml")) - os.Remove(filepath.Join(dir, f.Name(), "fields/fields.yml")) + os.Remove(apmpackage.ECSFilePath(version, f.Name())) + os.Remove(apmpackage.FieldsFilePath(version, f.Name())) } } - ioutil.WriteFile(filepath.Join("apmpackage/apm/", version, "/docs/README.md"), nil, 0644) + ioutil.WriteFile(apmpackage.DocsFilePath(version), nil, 0644) } diff --git a/apmpackage/gendocs.go b/apmpackage/gendocs.go index 0d986a1c3f8..9b8c9be1ba9 100644 --- a/apmpackage/gendocs.go +++ b/apmpackage/gendocs.go @@ -22,7 +22,6 @@ import ( "io/ioutil" "os" "path" - "path/filepath" "sort" "strings" "text/template" @@ -38,14 +37,14 @@ func GenerateDocs(inputFields map[string]fields, version string) { MetricsExample: loadExample("metricsets.json"), ErrorExample: loadExample("errors.json"), } - t := template.New("apmpackage/docs/README.template.md") + t := template.New(docsTemplateFilePath) tmpl, err := t.Funcs(map[string]interface{}{ "Trim": strings.TrimSpace, - }).ParseFiles("apmpackage/docs/README.template.md") + }).ParseFiles(docsTemplateFilePath) if err != nil { panic(err) } - path := filepath.Join("apmpackage/apm/", version, "/docs/README.md") + path := DocsFilePath(version) file, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644) if err != nil { panic(err) @@ -67,12 +66,9 @@ type docsData struct { } func prepareFields(inputFields map[string]fields, version, streamType string) fields { - baseFieldsPath := filepath.Join( - "apmpackage/apm/", version, "/data_stream/", streamType, "/fields/base-fields.yml") extend := func(fs fields) fields { - //TODO mark aas ECS var baseFields fields - for _, f := range loadFieldsFile(baseFieldsPath) { + for _, f := range loadFieldsFile(baseFieldsFilePath(version, streamType)) { f.IsECS = true baseFields = append(baseFields, f) } diff --git a/apmpackage/genfields.go b/apmpackage/genfields.go index 2cf2db92de9..0636c3aa8ee 100644 --- a/apmpackage/genfields.go +++ b/apmpackage/genfields.go @@ -19,15 +19,15 @@ package apmpackage import ( "io/ioutil" + "net/http" "path/filepath" "gopkg.in/yaml.v2" ) -func GenerateFields(ecsDir, version string) map[string]fields { +func GenerateFields(version string) map[string]fields { - // TODO get this from GH directly - ecsFlatFields := loadECSFields(ecsDir) + ecsFlatFields := loadECSFields() inputFieldsFiles := map[string]fields{ "logs": concatFields("model/error/_meta/fields.yml"), @@ -47,13 +47,12 @@ func GenerateFields(ecsDir, version string) map[string]fields { nonECSFields = append(nonECSFields, nonECS) } } - dataStreamFieldsPath := filepath.Join("apmpackage/apm/", version, "/data_stream", streamType, "/fields") var writeOutFields = func(fName string, data fields) { bytes, err := yaml.Marshal(&data) if err != nil { panic(err) } - err = ioutil.WriteFile(filepath.Join(dataStreamFieldsPath, fName), bytes, 0644) + err = ioutil.WriteFile(filepath.Join(fieldsPath(version, streamType), fName), bytes, 0644) if err != nil { panic(err) } @@ -112,9 +111,12 @@ func splitECSFields(parent field) (field, field) { // adapted from https://github.com/elastic/integrations/tree/master/dev/import-beats -func loadECSFields(ecsDir string) map[string]interface{} { - path := filepath.Join(ecsDir, "generated/ecs/ecs_flat.yml") - fields, err := ioutil.ReadFile(path) +func loadECSFields() map[string]interface{} { + resp, err := http.Get("https://raw.githubusercontent.com/elastic/ecs/master/generated/ecs/ecs_flat.yml") + if err != nil { + panic(err) + } + fields, err := ioutil.ReadAll(resp.Body) if err != nil { panic(err) } diff --git a/apmpackage/paths.go b/apmpackage/paths.go new file mode 100644 index 00000000000..25c2bf1dba2 --- /dev/null +++ b/apmpackage/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 apmpackage + +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/docs/fields.asciidoc b/docs/fields.asciidoc index 7dfd68c506e..5ba7b0da0cf 100644 --- a/docs/fields.asciidoc +++ b/docs/fields.asciidoc @@ -14441,6 +14441,16 @@ type: keyword Kubernetes node name +type: keyword + +-- + +*`kubernetes.node.hostname`*:: ++ +-- +Kubernetes hostname as reported by the node’s kernel + + type: keyword -- diff --git a/include/fields.go b/include/fields.go index 7d98e410e78..a3cc17ef5dc 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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" } From 6eb420e0ed1270b05a50cd887b8b13ab3454f069 Mon Sep 17 00:00:00 2001 From: Juan Date: Mon, 23 Nov 2020 15:40:45 +0100 Subject: [PATCH 08/15] make fmt --- apmpackage/cmd/gen-package/main.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apmpackage/cmd/gen-package/main.go b/apmpackage/cmd/gen-package/main.go index 37948ca20cc..7a8d4f9edb6 100644 --- a/apmpackage/cmd/gen-package/main.go +++ b/apmpackage/cmd/gen-package/main.go @@ -19,9 +19,10 @@ package main import ( "flag" - "github.com/elastic/apm-server/apmpackage" "io/ioutil" "os" + + "github.com/elastic/apm-server/apmpackage" ) var packageVersion string From 7fdb6355f3417f3588d1b2630b4f6db1ceb1a2ce Mon Sep 17 00:00:00 2001 From: Juan Date: Mon, 23 Nov 2020 19:49:25 +0100 Subject: [PATCH 09/15] fix lint --- apmpackage/gendocs.go | 14 +++++++------- apmpackage/genfields.go | 24 ++++++++++++------------ apmpackage/model.go | 10 +++++----- script/generate_notice.py | 13 +++++++------ tests/system/test_tls.py | 4 ++-- 5 files changed, 33 insertions(+), 32 deletions(-) diff --git a/apmpackage/gendocs.go b/apmpackage/gendocs.go index 9b8c9be1ba9..8d715792439 100644 --- a/apmpackage/gendocs.go +++ b/apmpackage/gendocs.go @@ -27,7 +27,7 @@ import ( "text/template" ) -func GenerateDocs(inputFields map[string]fields, version string) { +func GenerateDocs(inputFields map[string]Fields, version string) { data := docsData{ Traces: prepareFields(inputFields, version, "traces"), Metrics: prepareFields(inputFields, version, "metrics"), @@ -65,9 +65,9 @@ type docsData struct { ErrorExample string } -func prepareFields(inputFields map[string]fields, version, streamType string) fields { - extend := func(fs fields) fields { - var baseFields fields +func prepareFields(inputFields map[string]Fields, version, streamType string) Fields { + extend := func(fs Fields) Fields { + var baseFields Fields for _, f := range loadFieldsFile(baseFieldsFilePath(version, streamType)) { f.IsECS = true baseFields = append(baseFields, f) @@ -78,13 +78,13 @@ func prepareFields(inputFields map[string]fields, version, streamType string) fi return extend(order(flatten("", inputFields[streamType]))) } -func order(fs fields) fields { +func order(fs Fields) Fields { sort.Sort(fs) return fs } -func flatten(name string, fs fields) fields { - var ret fields +func flatten(name string, fs Fields) Fields { + var ret Fields for _, f := range fs { if name != "" { f.Name = name + "." + f.Name diff --git a/apmpackage/genfields.go b/apmpackage/genfields.go index 0636c3aa8ee..1546e8e4914 100644 --- a/apmpackage/genfields.go +++ b/apmpackage/genfields.go @@ -25,19 +25,19 @@ import ( "gopkg.in/yaml.v2" ) -func GenerateFields(version string) map[string]fields { +func GenerateFields(version string) map[string]Fields { ecsFlatFields := loadECSFields() - inputFieldsFiles := map[string]fields{ + inputFieldsFiles := map[string]Fields{ "logs": concatFields("model/error/_meta/fields.yml"), "metrics": concatFields("model/metricset/_meta/fields.yml", "model/profile/_meta/fields.yml"), "traces": concatFields("model/transaction/_meta/fields.yml", "model/span/_meta/fields.yml"), } for streamType, inputFields := range inputFieldsFiles { - var ecsFields fields - var nonECSFields fields + var ecsFields Fields + var nonECSFields Fields for _, fields := range populateECSInfo(ecsFlatFields, inputFields) { ecs, nonECS := splitECSFields(fields) if len(ecs.Fields) > 0 || ecs.IsECS { @@ -47,7 +47,7 @@ func GenerateFields(version string) map[string]fields { nonECSFields = append(nonECSFields, nonECS) } } - var writeOutFields = func(fName string, data fields) { + var writeOutFields = func(fName string, data Fields) { bytes, err := yaml.Marshal(&data) if err != nil { panic(err) @@ -67,9 +67,9 @@ func GenerateFields(version string) map[string]fields { return inputFieldsFiles } -func populateECSInfo(ecsFlatFields map[string]interface{}, inputFields fields) fields { - var traverse func(string, fields) (fields, bool, bool) - traverse = func(fName string, fs fields) (fields, bool, bool) { +func populateECSInfo(ecsFlatFields map[string]interface{}, inputFields Fields) Fields { + var traverse func(string, Fields) (Fields, bool, bool) + traverse = func(fName string, fs Fields) (Fields, bool, bool) { var ecsCount int for idx, field := range fs { fieldName := field.Name @@ -128,8 +128,8 @@ func loadECSFields() map[string]interface{} { return ret } -func concatFields(fileNames ...string) fields { - var ret fields +func concatFields(fileNames ...string) Fields { + var ret Fields for _, fname := range fileNames { fs := loadFieldsFile(fname) for _, key := range fs { @@ -139,7 +139,7 @@ func concatFields(fileNames ...string) fields { return ret } -func loadFieldsFile(path string) fields { +func loadFieldsFile(path string) Fields { fields, err := ioutil.ReadFile(path) if err != nil { panic(err) @@ -153,7 +153,7 @@ func loadFieldsFile(path string) fields { return overrideFieldValues(fs) } -func overrideFieldValues(fs fields) fields { +func overrideFieldValues(fs Fields) Fields { var ret []field for _, f := range fs { if f.Type == "" { diff --git a/apmpackage/model.go b/apmpackage/model.go index 918b99d04fe..97b438efa1c 100644 --- a/apmpackage/model.go +++ b/apmpackage/model.go @@ -33,7 +33,7 @@ type field struct { Footnote string `yaml:"footnote,omitempty"` IgnoreAbove *int `yaml:"ignore_above,omitempty"` MultiFields []multiFieldDefinition `yaml:"multi_fields,omitempty"` - Fields []field `yaml:"fields,omitempty"` + Fields []field `yaml:"Fields,omitempty"` IsECS bool `yaml:"-"` HasECS bool `yaml:"-"` HasNonECS bool `yaml:"-"` @@ -43,11 +43,11 @@ func (f field) isNonECSLeaf() bool { return f.Type != "group" && !f.IsECS } -type fields []field +type Fields []field -func (f fields) Len() int { return len(f) } -func (f fields) Less(i, j int) bool { return f[i].Name < f[j].Name } -func (f fields) Swap(i, j int) { f[i], f[j] = f[j], f[i] } +func (f Fields) Len() int { return len(f) } +func (f Fields) Less(i, j int) bool { return f[i].Name < f[j].Name } +func (f Fields) Swap(i, j int) { f[i], f[j] = f[j], f[i] } type multiFieldDefinition struct { Name string `yaml:"Name,omitempty"` diff --git a/script/generate_notice.py b/script/generate_notice.py index b5201f6de5e..c8248ef865d 100644 --- a/script/generate_notice.py +++ b/script/generate_notice.py @@ -19,13 +19,14 @@ # Additional third-party, non-source code dependencies, to add to the CSV output. additional_third_party_deps = [{ - "name": "Red Hat Universal Base Image minimal", - "version": "8", - "url": "https://catalog.redhat.com/software/containers/ubi8/ubi-minimal/5c359a62bed8bd75a2c3fba8", - "license": "Custom;https://www.redhat.com/licenses/EULA_Red_Hat_Universal_Base_Image_English_20190422.pdf", - "sourceURL": "https://oss-dependencies.elastic.co/redhat/ubi/ubi-minimal-8-source.tar.gz", + "name": "Red Hat Universal Base Image minimal", + "version": "8", + "url": "https://catalog.redhat.com/software/containers/ubi8/ubi-minimal/5c359a62bed8bd75a2c3fba8", + "license": "Custom;https://www.redhat.com/licenses/EULA_Red_Hat_Universal_Base_Image_English_20190422.pdf", + "sourceURL": "https://oss-dependencies.elastic.co/redhat/ubi/ubi-minimal-8-source.tar.gz", }] + def read_file(filename): if not os.path.isfile(filename): print("File not found {}".format(filename)) @@ -206,7 +207,7 @@ def get_url(modpath): module.get("Version", ""), module.get("Revision", ""), license["license_summary"], - "" # source URL + "" # source URL ]) for dep in additional_third_party_deps: diff --git a/tests/system/test_tls.py b/tests/system/test_tls.py index 5d303a8bb59..a354cdfc8ef 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 @@ -8,8 +10,6 @@ from requests.packages.urllib3.exceptions import SubjectAltNameWarning requests.packages.urllib3.disable_warnings(SubjectAltNameWarning) -from apmserver import ServerBaseTest -from apmserver import TimeoutError, integration_test INTEGRATION_TESTS = os.environ.get('INTEGRATION_TESTS', False) From 800b6f0b42a7f4105f0c0c8d521105ad3f85854c Mon Sep 17 00:00:00 2001 From: Juan Date: Tue, 24 Nov 2020 11:20:55 +0100 Subject: [PATCH 10/15] code review --- Makefile | 2 +- NOTICE.txt | 14 +- .../apm/0.1.0/data_stream/logs/fields/ecs.yml | 99 ++++++- .../0.1.0/data_stream/logs/fields/fields.yml | 127 ++++---- .../0.1.0/data_stream/metrics/fields/ecs.yml | 160 +++++++++- .../data_stream/metrics/fields/fields.yml | 236 +++++++-------- .../0.1.0/data_stream/traces/fields/ecs.yml | 185 +++++++++++- .../data_stream/traces/fields/fields.yml | 278 ++++++++++-------- .../{model.go => cmd/gen-package/field.go} | 35 +-- apmpackage/{ => cmd/gen-package}/gendocs.go | 23 +- apmpackage/{ => cmd/gen-package}/genfields.go | 34 ++- apmpackage/cmd/gen-package/main.go | 36 ++- apmpackage/{ => cmd/gen-package}/paths.go | 12 +- go.mod | 3 +- go.sum | 7 +- tests/system/apmserver.py | 10 +- 16 files changed, 820 insertions(+), 441 deletions(-) rename apmpackage/{model.go => cmd/gen-package/field.go} (72%) rename apmpackage/{ => cmd/gen-package}/gendocs.go (85%) rename apmpackage/{ => cmd/gen-package}/genfields.go (83%) rename apmpackage/{ => cmd/gen-package}/paths.go (82%) diff --git a/Makefile b/Makefile index b71faeccd58..723e950f89c 100644 --- a/Makefile +++ b/Makefile @@ -110,7 +110,7 @@ docker-compose.override.yml: # Rules for updating config files, fields.yml, etc. ############################################################################## -update: fields gen-package go-generate add-headers copy-docs notice $(MAGE) +update: fields go-generate add-headers copy-docs gen-package notice $(MAGE) @$(MAGE) update fields_sources=\ diff --git a/NOTICE.txt b/NOTICE.txt index c5d1a7ea587..cf40fb42552 100644 --- a/NOTICE.txt +++ b/NOTICE.txt @@ -639,7 +639,7 @@ Contents of "LICENSE": -------------------------------------------------------------------- Dependency: github.com/elastic/beats/v7 Version: v7.0.0 -Revision: 633285e75a03 +Revision: 0fda3061815d License type (autodetected): Apache-2.0 -------------------------------------------------------------------- @@ -994,8 +994,7 @@ Contents of "NOTICE.txt": -------------------------------------------------------------------- Dependency: github.com/elastic/gosigar -Version: v0.10.6 -Revision: f115143bb233 +Version: v0.12.0 License type (autodetected): Apache-2.0 Contents of "NOTICE": @@ -1011,7 +1010,7 @@ Contents of "NOTICE": -------------------------------------------------------------------- Dependency: github.com/fatih/color -Version: v1.9.0 +Version: v1.10.0 License type (autodetected): MIT Contents of "LICENSE.md": @@ -3573,8 +3572,7 @@ License type (autodetected): Apache-2.0 -------------------------------------------------------------------- Dependency: go.elastic.co/apm -Version: v1.8.1 -Revision: 2aef45b9cf4b +Version: v1.9.0 License type (autodetected): Apache-2.0 Contents of "NOTICE": @@ -3905,7 +3903,7 @@ Contents of "LICENSE": -------------------------------------------------------------------- Dependency: golang.org/x/net -Revision: 942e2f445f3c +Revision: 69a78807bb2b License type (autodetected): BSD-3-Clause Contents of "LICENSE": @@ -4007,7 +4005,7 @@ Contents of "LICENSE": -------------------------------------------------------------------- Dependency: golang.org/x/sys -Revision: 201ba4db2418 +Revision: 5cba982894dd License type (autodetected): BSD-3-Clause Contents of "LICENSE": 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 index dafd2ede07c..273f1c52715 100644 --- a/apmpackage/apm/0.1.0/data_stream/logs/fields/ecs.yml +++ b/apmpackage/apm/0.1.0/data_stream/logs/fields/ecs.yml @@ -1,297 +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: 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: Operating System + 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: Destination + 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: 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: - - type: text + - 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: Device + type: group description: | Information concerning the device. fields: - name: name + type: keyword description: | Name of the device. - name: os title: Operating System - type: 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: Cloud + 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 index d0aba4a4f17..46f7333d35e 100644 --- a/apmpackage/apm/0.1.0/data_stream/logs/fields/fields.yml +++ b/apmpackage/apm/0.1.0/data_stream/logs/fields/fields.yml @@ -1,220 +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: url - description: | - A complete Url, with scheme, host and path. - 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: node - 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: - - type: text + - 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 -- name: trace + type: long - name: parent + type: group fields: - name: id + type: keyword description: | The ID of the parent event. -- name: agent -- name: container - title: Container - type: Container - 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. - name: kubernetes title: Kubernetes - type: 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: host - description: | - Optional host fields. - fields: - - name: os - title: Operating System - group: 2 - type: Operating System - description: | - The OS fields contain information about the operating system. -- name: process - description: | - Information pertaining to the running process where the data was collected - 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: user -- name: client -- name: source -- name: destination - title: Destination - group: 2 - type: Destination - description: |- - Destination fields describe details about the destination of a packet/event. - Destination fields are usually populated in conjunction with source fields. -- name: user_agent - title: User agent - type: User agent - 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: device - title: Device - type: Device - description: | - Information concerning the device. - - name: os - title: Operating System - type: Operating System - description: | - The OS fields contain information about the operating system. - name: experimental + type: object description: Additional experimental data sent by the agents. -- name: cloud - title: Cloud - group: 2 - type: Cloud - description: | - Cloud metadata reported by agents - fields: - - name: account - - name: instance - - name: machine - - name: project - 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/metrics/fields/ecs.yml b/apmpackage/apm/0.1.0/data_stream/metrics/fields/ecs.yml index 2a5d62025bd..fcaf9a55b6a 100644 --- a/apmpackage/apm/0.1.0/data_stream/metrics/fields/ecs.yml +++ b/apmpackage/apm/0.1.0/data_stream/metrics/fields/ecs.yml @@ -1,486 +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: 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: Operating System + 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: Destination + 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: 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: - - type: text + - 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: Device + type: group description: | Information concerning the device. fields: - name: name + type: keyword description: | Name of the device. - name: os title: Operating System - type: 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: Cloud + 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: 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: Operating System + 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: Destination + 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: 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: - - type: text + - 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: Device + type: group description: | Information concerning the device. fields: - name: name + type: keyword description: | Name of the device. - name: os title: Operating System - type: 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: Cloud + 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 index d9c305b9f85..bf8d9176bdc 100644 --- a/apmpackage/apm/0.1.0/data_stream/metrics/fields/fields.yml +++ b/apmpackage/apm/0.1.0/data_stream/metrics/fields/fields.yml @@ -1,439 +1,439 @@ - 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: node - 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: - - type: text + - 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 -- name: agent -- name: container - title: Container - type: Container - 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. + type: long - name: kubernetes title: Kubernetes - type: 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: host - description: | - Optional host fields. - fields: - - name: os - title: Operating System - group: 2 - type: Operating System - description: | - The OS fields contain information about the operating system. -- name: process - description: | - Information pertaining to the running process where the data was collected - 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: user -- name: client -- name: source -- name: destination - title: Destination - group: 2 - type: Destination - description: |- - Destination fields describe details about the destination of a packet/event. - Destination fields are usually populated in conjunction with source fields. -- name: user_agent - title: User agent - type: User agent - 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: device - title: Device - type: Device - description: | - Information concerning the device. - - name: os - title: Operating System - type: Operating System - description: | - The OS fields contain information about the operating system. - name: experimental + type: object description: Additional experimental data sent by the agents. -- name: cloud - title: Cloud - group: 2 - type: Cloud - description: | - Cloud metadata reported by agents - fields: - - name: account - - name: instance - - name: machine - - name: project -- name: event - 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: node - 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: agent -- name: container - title: Container - type: Container - 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. - name: kubernetes title: Kubernetes - type: 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: host - description: | - Optional host fields. - fields: - - name: os - title: Operating System - group: 2 - type: Operating System - description: | - The OS fields contain information about the operating system. -- name: process - description: | - Information pertaining to the running process where the data was collected - 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: user -- name: client -- name: source -- name: destination - title: Destination - group: 2 - type: Destination - description: |- - Destination fields describe details about the destination of a packet/event. - Destination fields are usually populated in conjunction with source fields. -- name: user_agent - title: User agent - type: User agent - 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: device - title: Device - type: Device - description: | - Information concerning the device. - - name: os - title: Operating System - type: Operating System - description: | - The OS fields contain information about the operating system. - name: experimental + type: object description: Additional experimental data sent by the agents. -- name: cloud - title: Cloud - group: 2 - type: Cloud - description: | - Cloud metadata reported by agents - fields: - - name: account - - name: instance - - name: machine - - name: project - 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. 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 index 0d57b6586b0..0948ef2f3a3 100644 --- a/apmpackage/apm/0.1.0/data_stream/traces/fields/ecs.yml +++ b/apmpackage/apm/0.1.0/data_stream/traces/fields/ecs.yml @@ -1,556 +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: 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: Operating System + 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: Destination + 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: 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: - - type: text + - 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: Device + type: group description: | Information concerning the device. fields: - name: name + type: keyword description: | Name of the device. - name: os title: Operating System - type: 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: Cloud + 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: 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: Operating System + 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: Destination + 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: 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: - - type: text + - 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: Device + type: group description: | Information concerning the device. fields: - name: name + type: keyword description: | Name of the device. - name: os title: Operating System - type: 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: Cloud + 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 index f2769698086..a1839bc0ccc 100644 --- a/apmpackage/apm/0.1.0/data_stream/traces/fields/fields.yml +++ b/apmpackage/apm/0.1.0/data_stream/traces/fields/fields.yml @@ -1,495 +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: url - description: | - A complete Url, with scheme, host and path. - 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: node - 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: - - type: text + - 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 -- name: trace + type: long - name: parent + type: group fields: - name: id + type: keyword description: | The ID of the parent event. -- name: agent -- name: container - title: Container - type: Container - 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. - name: kubernetes title: Kubernetes - type: 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: host - description: | - Optional host fields. - fields: - - name: os - title: Operating System - group: 2 - type: Operating System - description: | - The OS fields contain information about the operating system. -- name: process - description: | - Information pertaining to the running process where the data was collected - 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: user -- name: client -- name: source -- name: destination - title: Destination - group: 2 - type: Destination - description: |- - Destination fields describe details about the destination of a packet/event. - Destination fields are usually populated in conjunction with source fields. -- name: user_agent - title: User agent - type: User agent - 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: device - title: Device - type: Device - description: | - Information concerning the device. - - name: os - title: Operating System - type: Operating System - description: | - The OS fields contain information about the operating system. - name: experimental + type: object description: Additional experimental data sent by the agents. -- name: cloud - title: Cloud - group: 2 - type: Cloud - description: | - Cloud metadata reported by agents - fields: - - name: account - - name: instance - - name: machine - - name: project -- name: event - 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: node - 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: - - type: text + - 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 -- name: trace + type: long - name: parent + type: group fields: - name: id + type: keyword description: | The ID of the parent event. -- name: agent -- name: container - title: Container - type: Container - 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. - name: kubernetes title: Kubernetes - type: 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: host - description: | - Optional host fields. - fields: - - name: os - title: Operating System - group: 2 - type: Operating System - description: | - The OS fields contain information about the operating system. -- name: process - description: | - Information pertaining to the running process where the data was collected - 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: user -- name: client -- name: source -- name: destination - title: Destination - group: 2 - type: Destination - description: |- - Destination fields describe details about the destination of a packet/event. - Destination fields are usually populated in conjunction with source fields. -- name: user_agent - title: User agent - type: User agent - 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: device - title: Device - type: Device - description: | - Information concerning the device. - - name: os - title: Operating System - type: Operating System - description: | - The OS fields contain information about the operating system. - name: experimental + type: object description: Additional experimental data sent by the agents. -- name: cloud - title: Cloud - group: 2 - type: Cloud - description: | - Cloud metadata reported by agents - fields: - - name: account - - name: instance - - name: machine - - name: project -- name: event - 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/model.go b/apmpackage/cmd/gen-package/field.go similarity index 72% rename from apmpackage/model.go rename to apmpackage/cmd/gen-package/field.go index 97b438efa1c..bde7617acdf 100644 --- a/apmpackage/model.go +++ b/apmpackage/cmd/gen-package/field.go @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -package apmpackage +package main type field struct { Name string `yaml:"name,omitempty"` @@ -33,7 +33,7 @@ type field struct { Footnote string `yaml:"footnote,omitempty"` IgnoreAbove *int `yaml:"ignore_above,omitempty"` MultiFields []multiFieldDefinition `yaml:"multi_fields,omitempty"` - Fields []field `yaml:"Fields,omitempty"` + Fields []field `yaml:"fields,omitempty"` IsECS bool `yaml:"-"` HasECS bool `yaml:"-"` HasNonECS bool `yaml:"-"` @@ -43,39 +43,14 @@ func (f field) isNonECSLeaf() bool { return f.Type != "group" && !f.IsECS } -type Fields []field - -func (f Fields) Len() int { return len(f) } -func (f Fields) Less(i, j int) bool { return f[i].Name < f[j].Name } -func (f Fields) Swap(i, j int) { f[i], f[j] = f[j], f[i] } - type multiFieldDefinition struct { - Name string `yaml:"Name,omitempty"` + 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 { - return field{ - Name: f.Name, - Key: f.Key, - Title: f.Title, - Group: f.Group, - Level: f.Level, - Required: f.Required, - Type: f.Title, - Format: f.Format, - Description: f.Description, - Release: f.Release, - Alias: f.Alias, - Path: f.Path, - Footnote: f.Footnote, - IgnoreAbove: f.IgnoreAbove, - Fields: nil, - MultiFields: f.MultiFields, - IsECS: f.IsECS, - HasECS: f.HasECS, - HasNonECS: f.HasNonECS, - } + f.Fields = nil + return f } diff --git a/apmpackage/gendocs.go b/apmpackage/cmd/gen-package/gendocs.go similarity index 85% rename from apmpackage/gendocs.go rename to apmpackage/cmd/gen-package/gendocs.go index 8d715792439..e6dbc8fe568 100644 --- a/apmpackage/gendocs.go +++ b/apmpackage/cmd/gen-package/gendocs.go @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -package apmpackage +package main import ( "encoding/json" @@ -27,7 +27,7 @@ import ( "text/template" ) -func GenerateDocs(inputFields map[string]Fields, version string) { +func generateDocs(inputFields map[string][]field, version string) { data := docsData{ Traces: prepareFields(inputFields, version, "traces"), Metrics: prepareFields(inputFields, version, "metrics"), @@ -44,11 +44,12 @@ func GenerateDocs(inputFields map[string]Fields, version string) { if err != nil { panic(err) } - path := DocsFilePath(version) + 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) @@ -65,9 +66,9 @@ type docsData struct { ErrorExample string } -func prepareFields(inputFields map[string]Fields, version, streamType string) Fields { - extend := func(fs Fields) Fields { - var baseFields Fields +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) @@ -78,13 +79,15 @@ func prepareFields(inputFields map[string]Fields, version, streamType string) Fi return extend(order(flatten("", inputFields[streamType]))) } -func order(fs Fields) Fields { - sort.Sort(fs) +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 Fields) Fields { - var ret Fields +func flatten(name string, fs []field) []field { + var ret []field for _, f := range fs { if name != "" { f.Name = name + "." + f.Name diff --git a/apmpackage/genfields.go b/apmpackage/cmd/gen-package/genfields.go similarity index 83% rename from apmpackage/genfields.go rename to apmpackage/cmd/gen-package/genfields.go index 1546e8e4914..39b81158967 100644 --- a/apmpackage/genfields.go +++ b/apmpackage/cmd/gen-package/genfields.go @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -package apmpackage +package main import ( "io/ioutil" @@ -23,21 +23,23 @@ import ( "path/filepath" "gopkg.in/yaml.v2" + + "github.com/elastic/ecs/code/go/ecs" ) -func GenerateFields(version string) map[string]Fields { +func generateFields(version string) map[string][]field { ecsFlatFields := loadECSFields() - inputFieldsFiles := map[string]Fields{ + inputFieldsFiles := map[string][]field{ "logs": concatFields("model/error/_meta/fields.yml"), "metrics": concatFields("model/metricset/_meta/fields.yml", "model/profile/_meta/fields.yml"), "traces": concatFields("model/transaction/_meta/fields.yml", "model/span/_meta/fields.yml"), } for streamType, inputFields := range inputFieldsFiles { - var ecsFields Fields - var nonECSFields Fields + var ecsFields []field + var nonECSFields []field for _, fields := range populateECSInfo(ecsFlatFields, inputFields) { ecs, nonECS := splitECSFields(fields) if len(ecs.Fields) > 0 || ecs.IsECS { @@ -47,7 +49,7 @@ func GenerateFields(version string) map[string]Fields { nonECSFields = append(nonECSFields, nonECS) } } - var writeOutFields = func(fName string, data Fields) { + var writeOutFields = func(fName string, data []field) { bytes, err := yaml.Marshal(&data) if err != nil { panic(err) @@ -67,9 +69,9 @@ func GenerateFields(version string) map[string]Fields { return inputFieldsFiles } -func populateECSInfo(ecsFlatFields map[string]interface{}, inputFields Fields) Fields { - var traverse func(string, Fields) (Fields, bool, bool) - traverse = func(fName string, fs Fields) (Fields, bool, bool) { +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 @@ -109,10 +111,10 @@ func splitECSFields(parent field) (field, field) { return ecsCopy, nonECSCopy } -// adapted from https://github.com/elastic/integrations/tree/master/dev/import-beats - func loadECSFields() map[string]interface{} { - resp, err := http.Get("https://raw.githubusercontent.com/elastic/ecs/master/generated/ecs/ecs_flat.yml") + 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) } @@ -128,8 +130,8 @@ func loadECSFields() map[string]interface{} { return ret } -func concatFields(fileNames ...string) Fields { - var ret Fields +func concatFields(fileNames ...string) []field { + var ret []field for _, fname := range fileNames { fs := loadFieldsFile(fname) for _, key := range fs { @@ -139,7 +141,7 @@ func concatFields(fileNames ...string) Fields { return ret } -func loadFieldsFile(path string) Fields { +func loadFieldsFile(path string) []field { fields, err := ioutil.ReadFile(path) if err != nil { panic(err) @@ -153,7 +155,7 @@ func loadFieldsFile(path string) Fields { return overrideFieldValues(fs) } -func overrideFieldValues(fs Fields) Fields { +func overrideFieldValues(fs []field) []field { var ret []field for _, f := range fs { if f.Type == "" { diff --git a/apmpackage/cmd/gen-package/main.go b/apmpackage/cmd/gen-package/main.go index 7a8d4f9edb6..cedadf4e367 100644 --- a/apmpackage/cmd/gen-package/main.go +++ b/apmpackage/cmd/gen-package/main.go @@ -18,33 +18,45 @@ package main import ( - "flag" + "errors" + "fmt" + "github.com/elastic/apm-server/cmd" + "github.com/elastic/beats/v7/libbeat/common" "io/ioutil" + "log" "os" - - "github.com/elastic/apm-server/apmpackage" ) -var packageVersion string +var versionMapping = map[string]string{ + "7.11": "0.1.0", + "8.0": "0.1.0", +} func main() { - flag.StringVar(&packageVersion, "packageVersion", "0.1.0", "Package version") - flag.Parse() + 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 := apmpackage.GenerateFields(packageVersion) - apmpackage.GenerateDocs(inputFields, 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(apmpackage.DataStreamPath(version)) + 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(apmpackage.ECSFilePath(version, f.Name())) - os.Remove(apmpackage.FieldsFilePath(version, f.Name())) + os.Remove(ecsFilePath(version, f.Name())) + os.Remove(fieldsFilePath(version, f.Name())) } } - ioutil.WriteFile(apmpackage.DocsFilePath(version), nil, 0644) + ioutil.WriteFile(docsFilePath(version), nil, 0644) } diff --git a/apmpackage/paths.go b/apmpackage/cmd/gen-package/paths.go similarity index 82% rename from apmpackage/paths.go rename to apmpackage/cmd/gen-package/paths.go index 25c2bf1dba2..73c01e9065c 100644 --- a/apmpackage/paths.go +++ b/apmpackage/cmd/gen-package/paths.go @@ -15,29 +15,29 @@ // specific language governing permissions and limitations // under the License. -package apmpackage +package main import "path/filepath" var docsTemplateFilePath = "apmpackage/docs/README.template.md" -func DocsFilePath(version string) string { +func docsFilePath(version string) string { return filepath.Join("apmpackage/apm/", version, "/docs/README.md") } -func DataStreamPath(version string) string { +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/") + return filepath.Join(dataStreamPath(version), dataStream, "fields/") } -func ECSFilePath(version, dataStream string) string { +func ecsFilePath(version, dataStream string) string { return filepath.Join(fieldsPath(version, dataStream), "ecs.yml") } -func FieldsFilePath(version, dataStream string) string { +func fieldsFilePath(version, dataStream string) string { return filepath.Join(fieldsPath(version, dataStream), "fields.yml") } diff --git a/go.mod b/go.mod index 97a796260a8..3cde986f9ad 100644 --- a/go.mod +++ b/go.mod @@ -16,13 +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.4-0.20200415140258-1232bd4774a6 - github.com/elastic/package-registry v0.13.0 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 @@ -30,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 0c005b8ea4f..c0a724715b3 100644 --- a/go.sum +++ b/go.sum @@ -67,8 +67,6 @@ github.com/DataDog/zstd v1.4.1 h1:3oxKN3wbHibqx897utPC2LTQU4J+IHWWJO+glkAkpFM= github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/Masterminds/semver v1.4.2 h1:WBLTQ37jOCzSLtXNdoo8bNM8876KhNqOKvrlGITgsTc= github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/semver/v3 v3.1.0 h1:Y2lUDsFKVRSYGojLJ1yLxSXdMmMYTYls0rCvoqmMUQk= -github.com/Masterminds/semver/v3 v3.1.0/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5 h1:ygIc8M6trr62pF5DucadTWGdEB4mEyvzi0e2nbcmcyA= github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= @@ -124,8 +122,6 @@ github.com/aws/aws-sdk-go-v2 v0.9.0 h1:dWtJKGRFv3UZkMBQaIzMsF0/y4ge3iQPWTzeC4r/v github.com/aws/aws-sdk-go-v2 v0.9.0/go.mod h1:sa1GePZ/LfBGI4dSq30f6uR4Tthll8axxtEPvlpXZ8U= github.com/awslabs/goformation/v3 v3.1.0/go.mod h1:hQ5RXo3GNm2laHWKizDzU5DsDy+yNcenSca2UxN0850= github.com/awslabs/goformation/v4 v4.1.0/go.mod h1:MBDN7u1lMNDoehbFuO4uPvgwPeolTMA2TzX1yO6KlxI= -github.com/aymerick/raymond v2.0.2+incompatible h1:VEp3GpgdAnv9B2GFyTvqgcKvY+mfKMjPOA3SbKLtnU0= -github.com/aymerick/raymond v2.0.2+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= @@ -290,8 +286,6 @@ github.com/elastic/go-windows v1.0.1 h1:AlYZOldA+UJ0/2nBuqWdo90GFCgG9xuyw9SYzGUt github.com/elastic/go-windows v1.0.1/go.mod h1:FoVvqWSun28vaDQPbj2Elfc0JahhPB7WQEGa3c814Ss= github.com/elastic/gosigar v0.12.0 h1:AsdhYCJlTudhfOYQyFNgx+fIVTfrDO0V1ST0vHgiapU= github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= -github.com/elastic/package-registry v0.13.0 h1:RdIzD111v1chu0L3MrbUGqgt6RZ9a9DVN3XMgjgOAu0= -github.com/elastic/package-registry v0.13.0/go.mod h1:oQx3Tg9ynuC6APd0o0OHud9kyPX6S6IzdJp/R4Hj1HY= github.com/elastic/sarama v0.0.0-20191122160421-355d120d0970 h1:rSo6gsz4zOanqtJ5fmZYQJvEJnA5YsVOB25casIwqUw= github.com/elastic/sarama v0.0.0-20191122160421-355d120d0970/go.mod h1:fGP8eQ6PugKEI0iUETYYtnP6d1pH/bdDMTel1X5ajsU= github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= @@ -547,6 +541,7 @@ 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= diff --git a/tests/system/apmserver.py b/tests/system/apmserver.py index cdfa165af1e..9a02f511520 100644 --- a/tests/system/apmserver.py +++ b/tests/system/apmserver.py @@ -1,8 +1,3 @@ -from kibana import Kibana -from es_helper import index_smap, index_span, index_error, apm_prefix -from es_helper import cleanup, default_pipelines -from helper import wait_until -from beat.beat import INTEGRATION_TESTS, TestCase, TimeoutError from datetime import datetime, timedelta import json import os @@ -24,6 +19,11 @@ beats_dir = beats_line.split(" ", 2)[1] sys.path.append(os.path.join(beats_dir, 'libbeat', 'tests', 'system')) +from beat.beat import INTEGRATION_TESTS, TestCase, TimeoutError +from helper import wait_until +from es_helper import cleanup, default_pipelines +from es_helper import index_smap, index_span, index_error, apm_prefix +from kibana import Kibana integration_test = unittest.skipUnless(INTEGRATION_TESTS, "integration test") diagnostic_interval = float(os.environ.get('DIAGNOSTIC_INTERVAL', 0)) From 2411077021aa1c6729ea634e3f3d12af7acf77f3 Mon Sep 17 00:00:00 2001 From: Juan Date: Tue, 24 Nov 2020 12:51:39 +0100 Subject: [PATCH 11/15] update docs to something decent --- apmpackage/apm/0.1.0/docs/README.md | 47 ++++++++++++++++++++--------- apmpackage/docs/README.template.md | 47 ++++++++++++++++++++--------- 2 files changed, 66 insertions(+), 28 deletions(-) diff --git a/apmpackage/apm/0.1.0/docs/README.md b/apmpackage/apm/0.1.0/docs/README.md index a8af882da86..f7b8122b4d3 100644 --- a/apmpackage/apm/0.1.0/docs/README.md +++ b/apmpackage/apm/0.1.0/docs/README.md @@ -1,18 +1,35 @@ # APM Integration -Lorem ipsum descriptium +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. -## Compatibility +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. -Dragons -## Configuration parameters +### Compatibility and limitations -Maybe RUM? +The APM integration requires Kibana 7.11 and Elasticsearch with basic license. +This version is experimental and has some limitations, listed bellow: -## Traces +- 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. -Lorem ipsum descriptium + +### 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** @@ -228,7 +245,7 @@ Lorem ipsum descriptium |view spans||keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png) | -### Example +#### Examples ```json { @@ -444,9 +461,10 @@ Lorem ipsum descriptium ``` -## Metrics +### Metrics -Lorem ipsum descriptium +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** @@ -627,7 +645,7 @@ Lorem ipsum descriptium |user_agent.version|Version of the user agent.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | -### Example +#### Example ```json { @@ -690,9 +708,10 @@ Lorem ipsum descriptium } ``` -## Logs +### Logs -Lorem ipsum descriptium +Logs are application log and error events. +Logs are written to `logs-apm.*` and `logs-apm.error.*` indices. **Exported Fields** @@ -806,7 +825,7 @@ Lorem ipsum descriptium |user_agent.version|Version of the user agent.|keyword| ![](https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png) | -### Example +#### Example ```json { diff --git a/apmpackage/docs/README.template.md b/apmpackage/docs/README.template.md index c9d26d5a9f0..d66347cdb17 100644 --- a/apmpackage/docs/README.template.md +++ b/apmpackage/docs/README.template.md @@ -1,18 +1,35 @@ # APM Integration -Lorem ipsum descriptium +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. -## Compatibility +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. -Dragons -## Configuration parameters +### Compatibility and limitations -Maybe RUM? +The APM integration requires Kibana 7.11 and Elasticsearch with basic license. +This version is experimental and has some limitations, listed bellow: -## Traces +- 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. -Lorem ipsum descriptium + +### 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** @@ -22,7 +39,7 @@ Lorem ipsum descriptium | {{- 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 +#### Examples ```json {{.TransactionExample}} @@ -33,9 +50,10 @@ Lorem ipsum descriptium ``` -## Metrics +### Metrics -Lorem ipsum descriptium +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** @@ -45,15 +63,16 @@ Lorem ipsum descriptium | {{- 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 +#### Example ```json {{.MetricsExample}} ``` -## Logs +### Logs -Lorem ipsum descriptium +Logs are application log and error events. +Logs are written to `logs-apm.*` and `logs-apm.error.*` indices. **Exported Fields** @@ -63,7 +82,7 @@ Lorem ipsum descriptium | {{- 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 +#### Example ```json {{.ErrorExample}} From 1223ff2c8eb4a05939a8191adf0fad1e38540b52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20=C3=81lvarez?= Date: Wed, 25 Nov 2020 08:40:18 +0100 Subject: [PATCH 12/15] Update apmpackage/cmd/gen-package/genfields.go Co-authored-by: Andrew Wilkins --- apmpackage/cmd/gen-package/genfields.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apmpackage/cmd/gen-package/genfields.go b/apmpackage/cmd/gen-package/genfields.go index 39b81158967..6fdad1350b2 100644 --- a/apmpackage/cmd/gen-package/genfields.go +++ b/apmpackage/cmd/gen-package/genfields.go @@ -33,7 +33,7 @@ func generateFields(version string) map[string][]field { inputFieldsFiles := map[string][]field{ "logs": concatFields("model/error/_meta/fields.yml"), - "metrics": concatFields("model/metricset/_meta/fields.yml", "model/profile/_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"), } From 68ecd2963be1b02b8882d47680fee8491e97f09e Mon Sep 17 00:00:00 2001 From: Juan Date: Wed, 25 Nov 2020 08:43:46 +0100 Subject: [PATCH 13/15] make update --- .../apm/0.1.0/agent/input/template.yml.hbs | 0 .../data_stream/metrics/fields/fields.yml | 22 +++++++++++++++++++ apmpackage/apm/0.1.0/docs/README.md | 4 ++++ 3 files changed, 26 insertions(+) create mode 100644 apmpackage/apm/0.1.0/agent/input/template.yml.hbs 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 00000000000..e69de29bb2d 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 index bf8d9176bdc..35720942e40 100644 --- a/apmpackage/apm/0.1.0/data_stream/metrics/fields/fields.yml +++ b/apmpackage/apm/0.1.0/data_stream/metrics/fields/fields.yml @@ -437,3 +437,25 @@ 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/docs/README.md b/apmpackage/apm/0.1.0/docs/README.md index f7b8122b4d3..d14954a78eb 100644 --- a/apmpackage/apm/0.1.0/docs/README.md +++ b/apmpackage/apm/0.1.0/docs/README.md @@ -533,6 +533,7 @@ Metrics are written to `metrics-apm.*`, `metrics-apm.internal.*` and `metrics-ap |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) | @@ -593,6 +594,8 @@ Metrics are written to `metrics-apm.*`, `metrics-apm.internal.*` and `metrics-ap |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) | @@ -609,6 +612,7 @@ Metrics are written to `metrics-apm.*`, `metrics-apm.internal.*` and `metrics-ap |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) | From 135d27d50f528d037a3f88f3bc15c98bd99552db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20=C3=81lvarez?= Date: Wed, 25 Nov 2020 08:44:41 +0100 Subject: [PATCH 14/15] Update apmpackage/cmd/gen-package/genfields.go Co-authored-by: Andrew Wilkins --- apmpackage/cmd/gen-package/genfields.go | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/apmpackage/cmd/gen-package/genfields.go b/apmpackage/cmd/gen-package/genfields.go index 6fdad1350b2..a55d5f7193a 100644 --- a/apmpackage/cmd/gen-package/genfields.go +++ b/apmpackage/cmd/gen-package/genfields.go @@ -118,12 +118,9 @@ func loadECSFields() map[string]interface{} { if err != nil { panic(err) } - fields, err := ioutil.ReadAll(resp.Body) - if err != nil { - panic(err) - } + defer resp.Body.Close() var ret map[string]interface{} - err = yaml.Unmarshal(fields, &ret) + err = yaml.NewDecoder(resp.Body).Decode(&ret) if err != nil { panic(err) } From b2b2c822e895f2cb4cf6e69d2d40a37cf7eca4b5 Mon Sep 17 00:00:00 2001 From: Juan Date: Wed, 25 Nov 2020 08:46:55 +0100 Subject: [PATCH 15/15] add handlebars template --- .../apm/0.1.0/agent/input/template.yml.hbs | 2 ++ apmpackage/apm/0.1.0/manifest.yml | 29 ++++++++++--------- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/apmpackage/apm/0.1.0/agent/input/template.yml.hbs b/apmpackage/apm/0.1.0/agent/input/template.yml.hbs index e69de29bb2d..fa5083b93a0 100644 --- a/apmpackage/apm/0.1.0/agent/input/template.yml.hbs +++ 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/manifest.yml b/apmpackage/apm/0.1.0/manifest.yml index 434d9a66927..774aec5d4b9 100644 --- a/apmpackage/apm/0.1.0/manifest.yml +++ b/apmpackage/apm/0.1.0/manifest.yml @@ -11,19 +11,20 @@ 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 +- 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