From f27c13af171fbdd6fd75f1c29f87ccada563874d Mon Sep 17 00:00:00 2001 From: Colleen McGinnis Date: Tue, 22 Oct 2024 14:48:43 -0500 Subject: [PATCH 01/13] migrate mdx to asciidoc --- .../ai-assistant/ai-assistant.asciidoc | 359 +++++++ .../aiops/aiops-analyze-spikes.asciidoc | 73 ++ .../aiops/aiops-detect-anomalies.asciidoc | 274 ++++++ .../aiops/aiops-detect-anomalies.mdx | 2 + .../aiops/aiops-detect-change-points.asciidoc | 70 ++ .../aiops/aiops-forecast-anomaly.asciidoc | 47 + .../aiops-tune-anomaly-detection-job.asciidoc | 186 ++++ docs/en/serverless/aiops/aiops.asciidoc | 24 + .../alerting/aggregation-options.asciidoc | 40 + .../aiops-generate-anomaly-alerts.asciidoc | 199 ++++ .../alerting/alerting-connectors.asciidoc | 26 + docs/en/serverless/alerting/alerting.asciidoc | 37 + .../create-anomaly-alert-rule.asciidoc | 114 +++ ...reate-custom-threshold-alert-rule.asciidoc | 209 ++++ ...te-elasticsearch-query-alert-rule.asciidoc | 292 ++++++ .../create-elasticsearch-query-alert-rule.mdx | 4 +- ...-error-count-threshold-alert-rule.asciidoc | 163 +++ ...saction-rate-threshold-alert-rule.asciidoc | 158 +++ ...te-inventory-threshold-alert-rule.asciidoc | 177 ++++ ...eate-latency-threshold-alert-rule.asciidoc | 162 +++ .../alerting/create-manage-rules.asciidoc | 142 +++ .../create-slo-burn-rate-alert-rule.asciidoc | 139 +++ .../alerting/rate-aggregation.asciidoc | 53 + .../triage-slo-burn-rate-breaches.asciidoc | 59 ++ .../triage-threshold-breaches.asciidoc | 64 ++ .../serverless/alerting/view-alerts.asciidoc | 142 +++ docs/en/serverless/alerting/view-alerts.mdx | 2 +- .../apm-agents-aws-lambda-functions.asciidoc | 47 + .../apm-agents-elastic-apm-agents.asciidoc | 128 +++ ...nts-opentelemetry-collect-metrics.asciidoc | 59 ++ ...-agents-opentelemetry-limitations.asciidoc | 40 + ...etry-opentelemetry-native-support.asciidoc | 181 ++++ ...opentelemetry-resource-attributes.asciidoc | 46 + .../apm-agents-opentelemetry.asciidoc | 131 +++ .../apm/apm-compress-spans.asciidoc | 96 ++ .../apm/apm-create-custom-links.asciidoc | 304 ++++++ .../en/serverless/apm/apm-data-types.asciidoc | 20 + .../apm/apm-distributed-tracing.asciidoc | 136 +++ .../apm/apm-filter-your-data.asciidoc | 49 + ...-latency-and-failure-correlations.asciidoc | 99 ++ .../serverless/apm/apm-get-started.asciidoc | 186 ++++ ...m-integrate-with-machine-learning.asciidoc | 73 ++ .../apm/apm-keep-data-secure.asciidoc | 101 ++ .../apm/apm-kibana-settings.asciidoc | 105 ++ .../apm/apm-observe-lambda-functions.asciidoc | 58 ++ .../apm/apm-query-your-data.asciidoc | 81 ++ .../apm/apm-reduce-your-data-usage.asciidoc | 19 + docs/en/serverless/apm/apm-reference.asciidoc | 15 + .../apm/apm-send-traces-to-elastic.asciidoc | 27 + .../en/serverless/apm/apm-server-api.asciidoc | 61 ++ .../apm/apm-server-api/api-error.asciidoc | 16 + .../apm/apm-server-api/api-events.asciidoc | 152 +++ .../apm/apm-server-api/api-info.asciidoc | 38 + .../apm/apm-server-api/api-metadata.asciidoc | 73 ++ .../apm/apm-server-api/api-metricset.asciidoc | 16 + .../apm/apm-server-api/api-span.asciidoc | 16 + .../apm-server-api/api-transaction.asciidoc | 16 + .../apm/apm-server-api/api.asciidoc | 7 + .../apm/apm-server-api/otel-api.asciidoc | 47 + .../apm/apm-stacktrace-collection.asciidoc | 13 + ...rack-deployments-with-annotations.asciidoc | 61 ++ .../apm/apm-transaction-sampling.asciidoc | 153 +++ .../configure-head-based-sampling.asciidoc | 27 + .../apm/apm-troubleshooting.asciidoc | 52 + .../common-problems.asciidoc | 73 ++ .../common-response-codes.asciidoc | 20 + .../apm/apm-ui-dependencies.asciidoc | 53 + docs/en/serverless/apm/apm-ui-errors.asciidoc | 38 + .../apm/apm-ui-infrastructure.asciidoc | 20 + docs/en/serverless/apm/apm-ui-logs.asciidoc | 18 + .../en/serverless/apm/apm-ui-metrics.asciidoc | 27 + .../serverless/apm/apm-ui-overview.asciidoc | 25 + .../apm/apm-ui-service-map.asciidoc | 120 +++ .../apm/apm-ui-service-overview.asciidoc | 155 +++ .../serverless/apm/apm-ui-services.asciidoc | 65 ++ .../apm/apm-ui-trace-sample-timeline.asciidoc | 82 ++ docs/en/serverless/apm/apm-ui-traces.asciidoc | 42 + .../apm/apm-ui-transactions.asciidoc | 174 ++++ .../apm/apm-view-and-analyze-traces.asciidoc | 25 + docs/en/serverless/apm/apm.asciidoc | 26 + docs/en/serverless/cases/cases.asciidoc | 18 + .../cases/create-manage-cases.asciidoc | 133 +++ .../cases/manage-cases-settings.asciidoc | 151 +++ .../dashboards-and-visualizations.asciidoc | 46 + .../serverless/elastic-entity-model.asciidoc | 60 ++ docs/en/serverless/images/icons/addFilter.svg | 1 + .../images/icons/ai-assistant-bw.svg | 1 + .../serverless/images/icons/ai-assistant.svg | 1 + docs/en/serverless/images/icons/apmTrace.svg | 1 + docs/en/serverless/images/icons/apps.svg | 1 + docs/en/serverless/images/icons/arrowLeft.svg | 1 + .../en/serverless/images/icons/arrowRight.svg | 1 + docs/en/serverless/images/icons/beaker.svg | 1 + docs/en/serverless/images/icons/bell.svg | 1 + .../images/icons/boxesHorizontal.svg | 1 + .../serverless/images/icons/boxesVertical.svg | 1 + docs/en/serverless/images/icons/calendar.svg | 1 + docs/en/serverless/images/icons/check.svg | 1 + docs/en/serverless/images/icons/cross.svg | 1 + .../serverless/images/icons/documentation.svg | 1 + docs/en/serverless/images/icons/expand.svg | 1 + docs/en/serverless/images/icons/eye.svg | 1 + docs/en/serverless/images/icons/filter.svg | 1 + docs/en/serverless/images/icons/help.svg | 1 + .../serverless/images/icons/importAction.svg | 1 + .../en/serverless/images/icons/indexClose.svg | 1 + docs/en/serverless/images/icons/indexOpen.svg | 1 + docs/en/serverless/images/icons/inspect.svg | 1 + docs/en/serverless/images/icons/list.svg | 1 + docs/en/serverless/images/icons/listAdd.svg | 1 + docs/en/serverless/images/icons/merge.svg | 1 + docs/en/serverless/images/icons/minus.svg | 1 + .../serverless/images/icons/minusInCircle.svg | 1 + .../serverless/images/icons/pagesSelect.svg | 1 + docs/en/serverless/images/icons/pencil.svg | 1 + .../serverless/images/icons/plusInCircle.svg | 1 + .../images/icons/plusInCircleFilled.svg | 1 + docs/en/serverless/images/icons/popout.svg | 1 + .../images/icons/questionInCircle.svg | 1 + docs/en/serverless/images/icons/refresh.svg | 1 + docs/en/serverless/images/icons/sortDown.svg | 1 + docs/en/serverless/images/icons/sortUp.svg | 1 + .../images/icons/tableDensityCompact.svg | 1 + docs/en/serverless/index.asciidoc | 152 +++ .../infra-monitoring/analyze-hosts.asciidoc | 320 ++++++ .../infra-monitoring/aws-metrics.asciidoc | 123 +++ .../configure-infra-settings.asciidoc | 38 + .../container-metrics.asciidoc | 112 +++ .../detect-metric-anomalies.asciidoc | 79 ++ .../get-started-with-metrics.asciidoc | 63 ++ .../handle-no-results-found-message.asciidoc | 48 + .../infra-monitoring/host-metrics.asciidoc | 263 +++++ .../infra-monitoring.asciidoc | 32 + .../kubernetes-pod-metrics.asciidoc | 30 + .../metrics-app-fields.asciidoc | 297 ++++++ .../metrics-reference.asciidoc | 15 + .../troubleshooting-infra.asciidoc | 26 + .../view-infrastructure-metrics.asciidoc | 150 +++ docs/en/serverless/inventory.asciidoc | 99 ++ docs/en/serverless/inventory.mdx | 24 +- .../logging/add-logs-service-name.asciidoc | 64 ++ .../correlate-application-logs.asciidoc | 104 ++ .../logging/ecs-application-logs.asciidoc | 213 ++++ .../filter-and-aggregate-logs.asciidoc | 357 +++++++ .../logging/get-started-with-logs.asciidoc | 49 + .../logging/log-monitoring.asciidoc | 118 +++ docs/en/serverless/logging/log-monitoring.mdx | 2 +- .../logging/parse-log-data.asciidoc | 930 ++++++++++++++++++ .../plaintext-application-logs.asciidoc | 288 ++++++ .../logging/run-log-pattern-analysis.asciidoc | 35 + .../logging/send-application-logs.asciidoc | 15 + .../logging/stream-log-files.asciidoc | 297 ++++++ .../logging/troubleshoot-logs.asciidoc | 142 +++ .../serverless/logging/troubleshoot-logs.mdx | 2 +- .../logging/view-and-monitor-logs.asciidoc | 109 ++ .../logging/view-and-monitor-logs.mdx | 2 +- docs/en/serverless/monitor-datasets.asciidoc | 72 ++ .../observability-overview.asciidoc | 151 +++ .../partials/apm-agent-warning.asciidoc | 4 + .../serverless/partials/feature-beta.asciidoc | 5 + docs/en/serverless/partials/roles.asciidoc | 5 + docs/en/serverless/partials/roles.mdx | 2 +- docs/en/serverless/projects/billing.asciidoc | 23 + docs/en/serverless/projects/billing.mdx | 2 +- .../create-an-observability-project.asciidoc | 49 + .../quickstarts/k8s-logs-metrics.asciidoc | 53 + .../quickstarts/k8s-logs-metrics.mdx | 5 +- .../monitor-hosts-with-elastic-agent.asciidoc | 128 +++ .../monitor-hosts-with-elastic-agent.mdx | 8 +- .../serverless/quickstarts/overview.asciidoc | 20 + .../en/serverless/slos/create-an-slo.asciidoc | 259 +++++ docs/en/serverless/slos/slos.asciidoc | 106 ++ .../synthetics/synthetics-analyze.asciidoc | 393 ++++++++ .../synthetics-command-reference.asciidoc | 325 ++++++ .../synthetics-configuration.asciidoc | 211 ++++ .../synthetics-create-test.asciidoc | 443 +++++++++ .../synthetics/synthetics-create-test.mdx | 2 +- .../synthetics-feature-roles.asciidoc | 26 + .../synthetics/synthetics-feature-roles.mdx | 2 +- .../synthetics-get-started-project.asciidoc | 223 +++++ .../synthetics-get-started-ui.asciidoc | 143 +++ .../synthetics-get-started.asciidoc | 41 + .../synthetics/synthetics-intro.asciidoc | 66 ++ .../synthetics/synthetics-journeys.asciidoc | 23 + .../synthetics-lightweight.asciidoc | 230 +++++ .../synthetics-manage-monitors.asciidoc | 89 ++ .../synthetics-manage-retention.asciidoc | 76 ++ .../synthetics-monitor-use.asciidoc | 61 ++ .../synthetics-params-secrets.asciidoc | 187 ++++ .../synthetics-private-location.asciidoc | 171 ++++ .../synthetics/synthetics-recorder.asciidoc | 147 +++ .../synthetics-scale-and-architect.asciidoc | 24 + .../synthetics-security-encryption.asciidoc | 29 + .../synthetics/synthetics-settings.asciidoc | 118 +++ .../synthetics-troubleshooting.asciidoc | 133 +++ .../technical-preview-limitations.asciidoc | 9 + .../technical-preview-limitations.mdx | 2 +- .../transclusion/apm/guide/about/go.asciidoc | 43 + .../apm/guide/about/java.asciidoc | 25 + .../transclusion/apm/guide/about/net.asciidoc | 27 + .../apm/guide/about/node.asciidoc | 25 + .../transclusion/apm/guide/about/php.asciidoc | 19 + .../apm/guide/about/python.asciidoc | 31 + .../apm/guide/about/ruby.asciidoc | 25 + .../diagrams/apm-otel-architecture.asciidoc | 513 ++++++++++ .../apm/guide/install-agents/go.asciidoc | 43 + .../apm/guide/install-agents/java.asciidoc | 44 + .../apm/guide/install-agents/net.asciidoc | 20 + .../apm/guide/install-agents/node.asciidoc | 45 + .../apm/guide/install-agents/php.asciidoc | 75 ++ .../apm/guide/install-agents/python.asciidoc | 98 ++ .../apm/guide/install-agents/ruby.asciidoc | 80 ++ .../open-telemetry/otel-get-started.asciidoc | 5 + .../apm/guide/spec/v2/error.asciidoc | 3 + .../apm/guide/spec/v2/metadata.asciidoc | 3 + .../apm/guide/spec/v2/metricset.asciidoc | 3 + .../apm/guide/spec/v2/span.asciidoc | 3 + .../apm/guide/spec/v2/transaction.asciidoc | 3 + .../distributed-trace-receive-widget.asciidoc | 71 ++ .../distributed-trace-receive/go.asciidoc | 30 + .../distributed-trace-receive/java.asciidoc | 36 + .../distributed-trace-receive/net.asciidoc | 13 + .../distributed-trace-receive/node.asciidoc | 16 + .../distributed-trace-receive/php.asciidoc | 24 + .../distributed-trace-receive/python.asciidoc | 19 + .../distributed-trace-receive/ruby.asciidoc | 23 + .../distributed-trace-send-widget.asciidoc | 71 ++ .../distributed-trace-send/go.asciidoc | 23 + .../distributed-trace-send/java.asciidoc | 31 + .../distributed-trace-send/net.asciidoc | 14 + .../distributed-trace-send/node.asciidoc | 20 + .../distributed-trace-send/php.asciidoc | 11 + .../distributed-trace-send/python.asciidoc | 18 + .../distributed-trace-send/ruby.asciidoc | 17 + .../no-data-indexed/fleet-managed.asciidoc | 15 + .../transclusion/container-details.asciidoc | 65 ++ .../tab-widgets/download-widget.asciidoc | 53 + .../fleet/tab-widgets/download/deb.asciidoc | 11 + .../fleet/tab-widgets/download/linux.asciidoc | 5 + .../fleet/tab-widgets/download/mac.asciidoc | 5 + .../fleet/tab-widgets/download/rpm.asciidoc | 11 + .../fleet/tab-widgets/download/win.asciidoc | 12 + .../run-standalone-widget.asciidoc | 53 + .../run-standalone/content/deb.asciidoc | 15 + .../run-standalone/content/linux.asciidoc | 10 + .../run-standalone/content/mac.asciidoc | 10 + .../run-standalone/content/rpm.asciidoc | 15 + .../run-standalone/content/win.asciidoc | 10 + .../fleet/tab-widgets/start-widget.asciidoc | 53 + .../fleet/tab-widgets/start/deb.asciidoc | 20 + .../fleet/tab-widgets/start/linux.asciidoc | 4 + .../fleet/tab-widgets/start/mac.asciidoc | 4 + .../fleet/tab-widgets/start/rpm.asciidoc | 20 + .../fleet/tab-widgets/start/win.asciidoc | 4 + .../fleet/tab-widgets/stop-widget.asciidoc | 53 + .../fleet/tab-widgets/stop/deb.asciidoc | 25 + .../fleet/tab-widgets/stop/linux.asciidoc | 9 + .../fleet/tab-widgets/stop/mac.asciidoc | 9 + .../fleet/tab-widgets/stop/rpm.asciidoc | 25 + .../fleet/tab-widgets/stop/win.asciidoc | 12 + .../transclusion/host-details.asciidoc | 128 +++ .../service-overview/dependencies.asciidoc | 9 + .../kibana/apm/service-overview/ftr.asciidoc | 13 + .../throughput-transactions.asciidoc | 14 + .../kibana/logs/log-overview.asciidoc | 6 + .../apm-agent-log-sending.asciidoc | 23 + .../application-logs/correlate-logs.asciidoc | 14 + .../ecs-logging-logs.asciidoc | 21 + .../log-reformatting.asciidoc | 26 + .../application-logs/plaintext-logs.asciidoc | 19 + .../filebeat-install/content/deb.asciidoc | 5 + .../filebeat-install/content/linux.asciidoc | 5 + .../filebeat-install/content/macos.asciidoc | 5 + .../filebeat-install/content/rpm.asciidoc | 5 + .../filebeat-install/content/windows.asciidoc | 18 + .../filebeat-install/widget.asciidoc | 53 + .../filebeat-logs/content/docker.asciidoc | 25 + .../filebeat-logs/content/kubernetes.asciidoc | 25 + .../filebeat-logs/content/logs.asciidoc | 58 ++ .../tab-widgets/filebeat-logs/widget.asciidoc | 35 + .../filebeat-setup/content/deb.asciidoc | 4 + .../filebeat-setup/content/linux.asciidoc | 4 + .../filebeat-setup/content/macos.asciidoc | 4 + .../filebeat-setup/content/rpm.asciidoc | 4 + .../filebeat-setup/content/windows.asciidoc | 4 + .../filebeat-setup/widget.asciidoc | 53 + .../filebeat-start/content/deb.asciidoc | 11 + .../filebeat-start/content/linux.asciidoc | 10 + .../filebeat-start/content/macos.asciidoc | 10 + .../filebeat-start/content/rpm.asciidoc | 11 + .../filebeat-start/content/windows.asciidoc | 6 + .../filebeat-start/widget.asciidoc | 53 + .../logs/agent-location/content/deb.asciidoc | 3 + .../agent-location/content/linux.asciidoc | 3 + .../logs/agent-location/content/mac.asciidoc | 5 + .../logs/agent-location/content/rpm.asciidoc | 3 + .../logs/agent-location/content/win.asciidoc | 3 + .../logs/agent-location/widget.asciidoc | 53 + .../serverless/transclusion/support.asciidoc | 3 + .../monitor-config-options.asciidoc | 69 ++ .../global-managed-paid-for.asciidoc | 2 + .../lightweight-config/common.asciidoc | 279 ++++++ .../reference/lightweight-config/common.mdx | 2 +- .../lightweight-config/http.asciidoc | 201 ++++ .../lightweight-config/icmp.asciidoc | 27 + .../reference/lightweight-config/tcp.asciidoc | 82 ++ .../project.asciidoc | 9 + .../ui.asciidoc | 5 + ...ge-monitors-delete-monitor-widget.asciidoc | 26 + .../project.asciidoc | 23 + .../ui.asciidoc | 11 + ...ge-monitors-update-monitor-widget.asciidoc | 26 + .../what-is-observability-serverless.asciidoc | 86 ++ 313 files changed, 19711 insertions(+), 28 deletions(-) create mode 100644 docs/en/serverless/ai-assistant/ai-assistant.asciidoc create mode 100644 docs/en/serverless/aiops/aiops-analyze-spikes.asciidoc create mode 100644 docs/en/serverless/aiops/aiops-detect-anomalies.asciidoc create mode 100644 docs/en/serverless/aiops/aiops-detect-change-points.asciidoc create mode 100644 docs/en/serverless/aiops/aiops-forecast-anomaly.asciidoc create mode 100644 docs/en/serverless/aiops/aiops-tune-anomaly-detection-job.asciidoc create mode 100644 docs/en/serverless/aiops/aiops.asciidoc create mode 100644 docs/en/serverless/alerting/aggregation-options.asciidoc create mode 100644 docs/en/serverless/alerting/aiops-generate-anomaly-alerts.asciidoc create mode 100644 docs/en/serverless/alerting/alerting-connectors.asciidoc create mode 100644 docs/en/serverless/alerting/alerting.asciidoc create mode 100644 docs/en/serverless/alerting/create-anomaly-alert-rule.asciidoc create mode 100644 docs/en/serverless/alerting/create-custom-threshold-alert-rule.asciidoc create mode 100644 docs/en/serverless/alerting/create-elasticsearch-query-alert-rule.asciidoc create mode 100644 docs/en/serverless/alerting/create-error-count-threshold-alert-rule.asciidoc create mode 100644 docs/en/serverless/alerting/create-failed-transaction-rate-threshold-alert-rule.asciidoc create mode 100644 docs/en/serverless/alerting/create-inventory-threshold-alert-rule.asciidoc create mode 100644 docs/en/serverless/alerting/create-latency-threshold-alert-rule.asciidoc create mode 100644 docs/en/serverless/alerting/create-manage-rules.asciidoc create mode 100644 docs/en/serverless/alerting/create-slo-burn-rate-alert-rule.asciidoc create mode 100644 docs/en/serverless/alerting/rate-aggregation.asciidoc create mode 100644 docs/en/serverless/alerting/triage-slo-burn-rate-breaches.asciidoc create mode 100644 docs/en/serverless/alerting/triage-threshold-breaches.asciidoc create mode 100644 docs/en/serverless/alerting/view-alerts.asciidoc create mode 100644 docs/en/serverless/apm-agents/apm-agents-aws-lambda-functions.asciidoc create mode 100644 docs/en/serverless/apm-agents/apm-agents-elastic-apm-agents.asciidoc create mode 100644 docs/en/serverless/apm-agents/apm-agents-opentelemetry-collect-metrics.asciidoc create mode 100644 docs/en/serverless/apm-agents/apm-agents-opentelemetry-limitations.asciidoc create mode 100644 docs/en/serverless/apm-agents/apm-agents-opentelemetry-opentelemetry-native-support.asciidoc create mode 100644 docs/en/serverless/apm-agents/apm-agents-opentelemetry-resource-attributes.asciidoc create mode 100644 docs/en/serverless/apm-agents/apm-agents-opentelemetry.asciidoc create mode 100644 docs/en/serverless/apm/apm-compress-spans.asciidoc create mode 100644 docs/en/serverless/apm/apm-create-custom-links.asciidoc create mode 100644 docs/en/serverless/apm/apm-data-types.asciidoc create mode 100644 docs/en/serverless/apm/apm-distributed-tracing.asciidoc create mode 100644 docs/en/serverless/apm/apm-filter-your-data.asciidoc create mode 100644 docs/en/serverless/apm/apm-find-transaction-latency-and-failure-correlations.asciidoc create mode 100644 docs/en/serverless/apm/apm-get-started.asciidoc create mode 100644 docs/en/serverless/apm/apm-integrate-with-machine-learning.asciidoc create mode 100644 docs/en/serverless/apm/apm-keep-data-secure.asciidoc create mode 100644 docs/en/serverless/apm/apm-kibana-settings.asciidoc create mode 100644 docs/en/serverless/apm/apm-observe-lambda-functions.asciidoc create mode 100644 docs/en/serverless/apm/apm-query-your-data.asciidoc create mode 100644 docs/en/serverless/apm/apm-reduce-your-data-usage.asciidoc create mode 100644 docs/en/serverless/apm/apm-reference.asciidoc create mode 100644 docs/en/serverless/apm/apm-send-traces-to-elastic.asciidoc create mode 100644 docs/en/serverless/apm/apm-server-api.asciidoc create mode 100644 docs/en/serverless/apm/apm-server-api/api-error.asciidoc create mode 100644 docs/en/serverless/apm/apm-server-api/api-events.asciidoc create mode 100644 docs/en/serverless/apm/apm-server-api/api-info.asciidoc create mode 100644 docs/en/serverless/apm/apm-server-api/api-metadata.asciidoc create mode 100644 docs/en/serverless/apm/apm-server-api/api-metricset.asciidoc create mode 100644 docs/en/serverless/apm/apm-server-api/api-span.asciidoc create mode 100644 docs/en/serverless/apm/apm-server-api/api-transaction.asciidoc create mode 100644 docs/en/serverless/apm/apm-server-api/api.asciidoc create mode 100644 docs/en/serverless/apm/apm-server-api/otel-api.asciidoc create mode 100644 docs/en/serverless/apm/apm-stacktrace-collection.asciidoc create mode 100644 docs/en/serverless/apm/apm-track-deployments-with-annotations.asciidoc create mode 100644 docs/en/serverless/apm/apm-transaction-sampling.asciidoc create mode 100644 docs/en/serverless/apm/apm-transaction-sampling/configure-head-based-sampling.asciidoc create mode 100644 docs/en/serverless/apm/apm-troubleshooting.asciidoc create mode 100644 docs/en/serverless/apm/apm-troubleshooting/common-problems.asciidoc create mode 100644 docs/en/serverless/apm/apm-troubleshooting/common-response-codes.asciidoc create mode 100644 docs/en/serverless/apm/apm-ui-dependencies.asciidoc create mode 100644 docs/en/serverless/apm/apm-ui-errors.asciidoc create mode 100644 docs/en/serverless/apm/apm-ui-infrastructure.asciidoc create mode 100644 docs/en/serverless/apm/apm-ui-logs.asciidoc create mode 100644 docs/en/serverless/apm/apm-ui-metrics.asciidoc create mode 100644 docs/en/serverless/apm/apm-ui-overview.asciidoc create mode 100644 docs/en/serverless/apm/apm-ui-service-map.asciidoc create mode 100644 docs/en/serverless/apm/apm-ui-service-overview.asciidoc create mode 100644 docs/en/serverless/apm/apm-ui-services.asciidoc create mode 100644 docs/en/serverless/apm/apm-ui-trace-sample-timeline.asciidoc create mode 100644 docs/en/serverless/apm/apm-ui-traces.asciidoc create mode 100644 docs/en/serverless/apm/apm-ui-transactions.asciidoc create mode 100644 docs/en/serverless/apm/apm-view-and-analyze-traces.asciidoc create mode 100644 docs/en/serverless/apm/apm.asciidoc create mode 100644 docs/en/serverless/cases/cases.asciidoc create mode 100644 docs/en/serverless/cases/create-manage-cases.asciidoc create mode 100644 docs/en/serverless/cases/manage-cases-settings.asciidoc create mode 100644 docs/en/serverless/dashboards/dashboards-and-visualizations.asciidoc create mode 100644 docs/en/serverless/elastic-entity-model.asciidoc create mode 100644 docs/en/serverless/images/icons/addFilter.svg create mode 100644 docs/en/serverless/images/icons/ai-assistant-bw.svg create mode 100644 docs/en/serverless/images/icons/ai-assistant.svg create mode 100644 docs/en/serverless/images/icons/apmTrace.svg create mode 100644 docs/en/serverless/images/icons/apps.svg create mode 100644 docs/en/serverless/images/icons/arrowLeft.svg create mode 100644 docs/en/serverless/images/icons/arrowRight.svg create mode 100644 docs/en/serverless/images/icons/beaker.svg create mode 100644 docs/en/serverless/images/icons/bell.svg create mode 100644 docs/en/serverless/images/icons/boxesHorizontal.svg create mode 100644 docs/en/serverless/images/icons/boxesVertical.svg create mode 100644 docs/en/serverless/images/icons/calendar.svg create mode 100644 docs/en/serverless/images/icons/check.svg create mode 100644 docs/en/serverless/images/icons/cross.svg create mode 100644 docs/en/serverless/images/icons/documentation.svg create mode 100644 docs/en/serverless/images/icons/expand.svg create mode 100644 docs/en/serverless/images/icons/eye.svg create mode 100644 docs/en/serverless/images/icons/filter.svg create mode 100644 docs/en/serverless/images/icons/help.svg create mode 100644 docs/en/serverless/images/icons/importAction.svg create mode 100644 docs/en/serverless/images/icons/indexClose.svg create mode 100644 docs/en/serverless/images/icons/indexOpen.svg create mode 100644 docs/en/serverless/images/icons/inspect.svg create mode 100644 docs/en/serverless/images/icons/list.svg create mode 100644 docs/en/serverless/images/icons/listAdd.svg create mode 100644 docs/en/serverless/images/icons/merge.svg create mode 100644 docs/en/serverless/images/icons/minus.svg create mode 100644 docs/en/serverless/images/icons/minusInCircle.svg create mode 100644 docs/en/serverless/images/icons/pagesSelect.svg create mode 100644 docs/en/serverless/images/icons/pencil.svg create mode 100644 docs/en/serverless/images/icons/plusInCircle.svg create mode 100644 docs/en/serverless/images/icons/plusInCircleFilled.svg create mode 100644 docs/en/serverless/images/icons/popout.svg create mode 100644 docs/en/serverless/images/icons/questionInCircle.svg create mode 100644 docs/en/serverless/images/icons/refresh.svg create mode 100644 docs/en/serverless/images/icons/sortDown.svg create mode 100644 docs/en/serverless/images/icons/sortUp.svg create mode 100644 docs/en/serverless/images/icons/tableDensityCompact.svg create mode 100644 docs/en/serverless/index.asciidoc create mode 100644 docs/en/serverless/infra-monitoring/analyze-hosts.asciidoc create mode 100644 docs/en/serverless/infra-monitoring/aws-metrics.asciidoc create mode 100644 docs/en/serverless/infra-monitoring/configure-infra-settings.asciidoc create mode 100644 docs/en/serverless/infra-monitoring/container-metrics.asciidoc create mode 100644 docs/en/serverless/infra-monitoring/detect-metric-anomalies.asciidoc create mode 100644 docs/en/serverless/infra-monitoring/get-started-with-metrics.asciidoc create mode 100644 docs/en/serverless/infra-monitoring/handle-no-results-found-message.asciidoc create mode 100644 docs/en/serverless/infra-monitoring/host-metrics.asciidoc create mode 100644 docs/en/serverless/infra-monitoring/infra-monitoring.asciidoc create mode 100644 docs/en/serverless/infra-monitoring/kubernetes-pod-metrics.asciidoc create mode 100644 docs/en/serverless/infra-monitoring/metrics-app-fields.asciidoc create mode 100644 docs/en/serverless/infra-monitoring/metrics-reference.asciidoc create mode 100644 docs/en/serverless/infra-monitoring/troubleshooting-infra.asciidoc create mode 100644 docs/en/serverless/infra-monitoring/view-infrastructure-metrics.asciidoc create mode 100644 docs/en/serverless/inventory.asciidoc create mode 100644 docs/en/serverless/logging/add-logs-service-name.asciidoc create mode 100644 docs/en/serverless/logging/correlate-application-logs.asciidoc create mode 100644 docs/en/serverless/logging/ecs-application-logs.asciidoc create mode 100644 docs/en/serverless/logging/filter-and-aggregate-logs.asciidoc create mode 100644 docs/en/serverless/logging/get-started-with-logs.asciidoc create mode 100644 docs/en/serverless/logging/log-monitoring.asciidoc create mode 100644 docs/en/serverless/logging/parse-log-data.asciidoc create mode 100644 docs/en/serverless/logging/plaintext-application-logs.asciidoc create mode 100644 docs/en/serverless/logging/run-log-pattern-analysis.asciidoc create mode 100644 docs/en/serverless/logging/send-application-logs.asciidoc create mode 100644 docs/en/serverless/logging/stream-log-files.asciidoc create mode 100644 docs/en/serverless/logging/troubleshoot-logs.asciidoc create mode 100644 docs/en/serverless/logging/view-and-monitor-logs.asciidoc create mode 100644 docs/en/serverless/monitor-datasets.asciidoc create mode 100644 docs/en/serverless/observability-overview.asciidoc create mode 100644 docs/en/serverless/partials/apm-agent-warning.asciidoc create mode 100644 docs/en/serverless/partials/feature-beta.asciidoc create mode 100644 docs/en/serverless/partials/roles.asciidoc create mode 100644 docs/en/serverless/projects/billing.asciidoc create mode 100644 docs/en/serverless/projects/create-an-observability-project.asciidoc create mode 100644 docs/en/serverless/quickstarts/k8s-logs-metrics.asciidoc create mode 100644 docs/en/serverless/quickstarts/monitor-hosts-with-elastic-agent.asciidoc create mode 100644 docs/en/serverless/quickstarts/overview.asciidoc create mode 100644 docs/en/serverless/slos/create-an-slo.asciidoc create mode 100644 docs/en/serverless/slos/slos.asciidoc create mode 100644 docs/en/serverless/synthetics/synthetics-analyze.asciidoc create mode 100644 docs/en/serverless/synthetics/synthetics-command-reference.asciidoc create mode 100644 docs/en/serverless/synthetics/synthetics-configuration.asciidoc create mode 100644 docs/en/serverless/synthetics/synthetics-create-test.asciidoc create mode 100644 docs/en/serverless/synthetics/synthetics-feature-roles.asciidoc create mode 100644 docs/en/serverless/synthetics/synthetics-get-started-project.asciidoc create mode 100644 docs/en/serverless/synthetics/synthetics-get-started-ui.asciidoc create mode 100644 docs/en/serverless/synthetics/synthetics-get-started.asciidoc create mode 100644 docs/en/serverless/synthetics/synthetics-intro.asciidoc create mode 100644 docs/en/serverless/synthetics/synthetics-journeys.asciidoc create mode 100644 docs/en/serverless/synthetics/synthetics-lightweight.asciidoc create mode 100644 docs/en/serverless/synthetics/synthetics-manage-monitors.asciidoc create mode 100644 docs/en/serverless/synthetics/synthetics-manage-retention.asciidoc create mode 100644 docs/en/serverless/synthetics/synthetics-monitor-use.asciidoc create mode 100644 docs/en/serverless/synthetics/synthetics-params-secrets.asciidoc create mode 100644 docs/en/serverless/synthetics/synthetics-private-location.asciidoc create mode 100644 docs/en/serverless/synthetics/synthetics-recorder.asciidoc create mode 100644 docs/en/serverless/synthetics/synthetics-scale-and-architect.asciidoc create mode 100644 docs/en/serverless/synthetics/synthetics-security-encryption.asciidoc create mode 100644 docs/en/serverless/synthetics/synthetics-settings.asciidoc create mode 100644 docs/en/serverless/synthetics/synthetics-troubleshooting.asciidoc create mode 100644 docs/en/serverless/technical-preview-limitations.asciidoc create mode 100644 docs/en/serverless/transclusion/apm/guide/about/go.asciidoc create mode 100644 docs/en/serverless/transclusion/apm/guide/about/java.asciidoc create mode 100644 docs/en/serverless/transclusion/apm/guide/about/net.asciidoc create mode 100644 docs/en/serverless/transclusion/apm/guide/about/node.asciidoc create mode 100644 docs/en/serverless/transclusion/apm/guide/about/php.asciidoc create mode 100644 docs/en/serverless/transclusion/apm/guide/about/python.asciidoc create mode 100644 docs/en/serverless/transclusion/apm/guide/about/ruby.asciidoc create mode 100644 docs/en/serverless/transclusion/apm/guide/diagrams/apm-otel-architecture.asciidoc create mode 100644 docs/en/serverless/transclusion/apm/guide/install-agents/go.asciidoc create mode 100644 docs/en/serverless/transclusion/apm/guide/install-agents/java.asciidoc create mode 100644 docs/en/serverless/transclusion/apm/guide/install-agents/net.asciidoc create mode 100644 docs/en/serverless/transclusion/apm/guide/install-agents/node.asciidoc create mode 100644 docs/en/serverless/transclusion/apm/guide/install-agents/php.asciidoc create mode 100644 docs/en/serverless/transclusion/apm/guide/install-agents/python.asciidoc create mode 100644 docs/en/serverless/transclusion/apm/guide/install-agents/ruby.asciidoc create mode 100644 docs/en/serverless/transclusion/apm/guide/open-telemetry/otel-get-started.asciidoc create mode 100644 docs/en/serverless/transclusion/apm/guide/spec/v2/error.asciidoc create mode 100644 docs/en/serverless/transclusion/apm/guide/spec/v2/metadata.asciidoc create mode 100644 docs/en/serverless/transclusion/apm/guide/spec/v2/metricset.asciidoc create mode 100644 docs/en/serverless/transclusion/apm/guide/spec/v2/span.asciidoc create mode 100644 docs/en/serverless/transclusion/apm/guide/spec/v2/transaction.asciidoc create mode 100644 docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-receive-widget.asciidoc create mode 100644 docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-receive/go.asciidoc create mode 100644 docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-receive/java.asciidoc create mode 100644 docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-receive/net.asciidoc create mode 100644 docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-receive/node.asciidoc create mode 100644 docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-receive/php.asciidoc create mode 100644 docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-receive/python.asciidoc create mode 100644 docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-receive/ruby.asciidoc create mode 100644 docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-send-widget.asciidoc create mode 100644 docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-send/go.asciidoc create mode 100644 docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-send/java.asciidoc create mode 100644 docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-send/net.asciidoc create mode 100644 docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-send/node.asciidoc create mode 100644 docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-send/php.asciidoc create mode 100644 docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-send/python.asciidoc create mode 100644 docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-send/ruby.asciidoc create mode 100644 docs/en/serverless/transclusion/apm/guide/tab-widgets/no-data-indexed/fleet-managed.asciidoc create mode 100644 docs/en/serverless/transclusion/container-details.asciidoc create mode 100644 docs/en/serverless/transclusion/fleet/tab-widgets/download-widget.asciidoc create mode 100644 docs/en/serverless/transclusion/fleet/tab-widgets/download/deb.asciidoc create mode 100644 docs/en/serverless/transclusion/fleet/tab-widgets/download/linux.asciidoc create mode 100644 docs/en/serverless/transclusion/fleet/tab-widgets/download/mac.asciidoc create mode 100644 docs/en/serverless/transclusion/fleet/tab-widgets/download/rpm.asciidoc create mode 100644 docs/en/serverless/transclusion/fleet/tab-widgets/download/win.asciidoc create mode 100644 docs/en/serverless/transclusion/fleet/tab-widgets/run-standalone-widget.asciidoc create mode 100644 docs/en/serverless/transclusion/fleet/tab-widgets/run-standalone/content/deb.asciidoc create mode 100644 docs/en/serverless/transclusion/fleet/tab-widgets/run-standalone/content/linux.asciidoc create mode 100644 docs/en/serverless/transclusion/fleet/tab-widgets/run-standalone/content/mac.asciidoc create mode 100644 docs/en/serverless/transclusion/fleet/tab-widgets/run-standalone/content/rpm.asciidoc create mode 100644 docs/en/serverless/transclusion/fleet/tab-widgets/run-standalone/content/win.asciidoc create mode 100644 docs/en/serverless/transclusion/fleet/tab-widgets/start-widget.asciidoc create mode 100644 docs/en/serverless/transclusion/fleet/tab-widgets/start/deb.asciidoc create mode 100644 docs/en/serverless/transclusion/fleet/tab-widgets/start/linux.asciidoc create mode 100644 docs/en/serverless/transclusion/fleet/tab-widgets/start/mac.asciidoc create mode 100644 docs/en/serverless/transclusion/fleet/tab-widgets/start/rpm.asciidoc create mode 100644 docs/en/serverless/transclusion/fleet/tab-widgets/start/win.asciidoc create mode 100644 docs/en/serverless/transclusion/fleet/tab-widgets/stop-widget.asciidoc create mode 100644 docs/en/serverless/transclusion/fleet/tab-widgets/stop/deb.asciidoc create mode 100644 docs/en/serverless/transclusion/fleet/tab-widgets/stop/linux.asciidoc create mode 100644 docs/en/serverless/transclusion/fleet/tab-widgets/stop/mac.asciidoc create mode 100644 docs/en/serverless/transclusion/fleet/tab-widgets/stop/rpm.asciidoc create mode 100644 docs/en/serverless/transclusion/fleet/tab-widgets/stop/win.asciidoc create mode 100644 docs/en/serverless/transclusion/host-details.asciidoc create mode 100644 docs/en/serverless/transclusion/kibana/apm/service-overview/dependencies.asciidoc create mode 100644 docs/en/serverless/transclusion/kibana/apm/service-overview/ftr.asciidoc create mode 100644 docs/en/serverless/transclusion/kibana/apm/service-overview/throughput-transactions.asciidoc create mode 100644 docs/en/serverless/transclusion/kibana/logs/log-overview.asciidoc create mode 100644 docs/en/serverless/transclusion/observability/application-logs/apm-agent-log-sending.asciidoc create mode 100644 docs/en/serverless/transclusion/observability/application-logs/correlate-logs.asciidoc create mode 100644 docs/en/serverless/transclusion/observability/application-logs/ecs-logging-logs.asciidoc create mode 100644 docs/en/serverless/transclusion/observability/application-logs/log-reformatting.asciidoc create mode 100644 docs/en/serverless/transclusion/observability/application-logs/plaintext-logs.asciidoc create mode 100644 docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/deb.asciidoc create mode 100644 docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/linux.asciidoc create mode 100644 docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/macos.asciidoc create mode 100644 docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/rpm.asciidoc create mode 100644 docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/windows.asciidoc create mode 100644 docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/widget.asciidoc create mode 100644 docs/en/serverless/transclusion/observability/tab-widgets/filebeat-logs/content/docker.asciidoc create mode 100644 docs/en/serverless/transclusion/observability/tab-widgets/filebeat-logs/content/kubernetes.asciidoc create mode 100644 docs/en/serverless/transclusion/observability/tab-widgets/filebeat-logs/content/logs.asciidoc create mode 100644 docs/en/serverless/transclusion/observability/tab-widgets/filebeat-logs/widget.asciidoc create mode 100644 docs/en/serverless/transclusion/observability/tab-widgets/filebeat-setup/content/deb.asciidoc create mode 100644 docs/en/serverless/transclusion/observability/tab-widgets/filebeat-setup/content/linux.asciidoc create mode 100644 docs/en/serverless/transclusion/observability/tab-widgets/filebeat-setup/content/macos.asciidoc create mode 100644 docs/en/serverless/transclusion/observability/tab-widgets/filebeat-setup/content/rpm.asciidoc create mode 100644 docs/en/serverless/transclusion/observability/tab-widgets/filebeat-setup/content/windows.asciidoc create mode 100644 docs/en/serverless/transclusion/observability/tab-widgets/filebeat-setup/widget.asciidoc create mode 100644 docs/en/serverless/transclusion/observability/tab-widgets/filebeat-start/content/deb.asciidoc create mode 100644 docs/en/serverless/transclusion/observability/tab-widgets/filebeat-start/content/linux.asciidoc create mode 100644 docs/en/serverless/transclusion/observability/tab-widgets/filebeat-start/content/macos.asciidoc create mode 100644 docs/en/serverless/transclusion/observability/tab-widgets/filebeat-start/content/rpm.asciidoc create mode 100644 docs/en/serverless/transclusion/observability/tab-widgets/filebeat-start/content/windows.asciidoc create mode 100644 docs/en/serverless/transclusion/observability/tab-widgets/filebeat-start/widget.asciidoc create mode 100644 docs/en/serverless/transclusion/observability/tab-widgets/logs/agent-location/content/deb.asciidoc create mode 100644 docs/en/serverless/transclusion/observability/tab-widgets/logs/agent-location/content/linux.asciidoc create mode 100644 docs/en/serverless/transclusion/observability/tab-widgets/logs/agent-location/content/mac.asciidoc create mode 100644 docs/en/serverless/transclusion/observability/tab-widgets/logs/agent-location/content/rpm.asciidoc create mode 100644 docs/en/serverless/transclusion/observability/tab-widgets/logs/agent-location/content/win.asciidoc create mode 100644 docs/en/serverless/transclusion/observability/tab-widgets/logs/agent-location/widget.asciidoc create mode 100644 docs/en/serverless/transclusion/support.asciidoc create mode 100644 docs/en/serverless/transclusion/synthetics/configuration/monitor-config-options.asciidoc create mode 100644 docs/en/serverless/transclusion/synthetics/global-managed-paid-for.asciidoc create mode 100644 docs/en/serverless/transclusion/synthetics/reference/lightweight-config/common.asciidoc create mode 100644 docs/en/serverless/transclusion/synthetics/reference/lightweight-config/http.asciidoc create mode 100644 docs/en/serverless/transclusion/synthetics/reference/lightweight-config/icmp.asciidoc create mode 100644 docs/en/serverless/transclusion/synthetics/reference/lightweight-config/tcp.asciidoc create mode 100644 docs/en/serverless/transclusion/synthetics/tab-widgets/manage-monitors-delete-monitor-content/project.asciidoc create mode 100644 docs/en/serverless/transclusion/synthetics/tab-widgets/manage-monitors-delete-monitor-content/ui.asciidoc create mode 100644 docs/en/serverless/transclusion/synthetics/tab-widgets/manage-monitors-delete-monitor-widget.asciidoc create mode 100644 docs/en/serverless/transclusion/synthetics/tab-widgets/manage-monitors-update-monitor-content/project.asciidoc create mode 100644 docs/en/serverless/transclusion/synthetics/tab-widgets/manage-monitors-update-monitor-content/ui.asciidoc create mode 100644 docs/en/serverless/transclusion/synthetics/tab-widgets/manage-monitors-update-monitor-widget.asciidoc create mode 100644 docs/en/serverless/what-is-observability-serverless.asciidoc diff --git a/docs/en/serverless/ai-assistant/ai-assistant.asciidoc b/docs/en/serverless/ai-assistant/ai-assistant.asciidoc new file mode 100644 index 0000000000..968e6c09db --- /dev/null +++ b/docs/en/serverless/ai-assistant/ai-assistant.asciidoc @@ -0,0 +1,359 @@ +[[ai-assistant]] += AI Assistant + +:keywords: serverless, observability, overview + +preview:[] + +The AI Assistant uses generative AI to provide: + +* **Chat**: Have conversations with the AI Assistant. Chat uses function calling to request, analyze, and visualize your data. +* **Contextual insights**: Open prompts throughout {observability} that explain errors and messages and suggest remediation. + +[role="screenshot"] +image::images/ai-assistant-overview.gif[Observability AI assistant preview] + +The AI Assistant integrates with your large language model (LLM) provider through our supported Elastic connectors: + +* {kibana-ref}/openai-action-type.html[OpenAI connector] for OpenAI or Azure OpenAI Service. +* {kibana-ref}/bedrock-action-type.html[Amazon Bedrock connector] for Amazon Bedrock, specifically for the Claude models. +* {kibana-ref}/gemini-action-type.html[Google Gemini connector] for Google Gemini. + +[IMPORTANT] +==== +The AI Assistant is powered by an integration with your large language model (LLM) provider. +LLMs are known to sometimes present incorrect information as if it's correct. +Elastic supports configuration and connection to the LLM provider and your knowledge base, +but is not responsible for the LLM's responses. +==== + +[IMPORTANT] +==== +Also, the data you provide to the Observability AI assistant is _not_ anonymized, and is stored and processed by the third-party AI provider. This includes any data used in conversations for analysis or context, such as alert or event data, detection rule configurations, and queries. Therefore, be careful about sharing any confidential or sensitive details while using this feature. +==== + +[discrete] +[[ai-assistant-requirements]] +== Requirements + +The AI assistant requires the following: + +* An account with a third-party generative AI provider that preferably supports function calling. +If your AI provider does not support function calling, you can configure AI Assistant settings under **Project settings** → **Management** → **AI Assistant for Observability Settings** to simulate function calling, but this might affect performance. ++ +Refer to the {kibana-ref}/action-types.html[connector documentation] for your provider to learn about supported and default models. +* The knowledge base requires a 4 GB {ml} node. + +[IMPORTANT] +==== +The free tier offered by third-party generative AI providers may not be sufficient for the proper functioning of the AI assistant. +In most cases, a paid subscription to one of the supported providers is required. +The Observability AI assistant doesn't support connecting to a private LLM. +Elastic doesn't recommend using private LLMs with the Observability AI assistant. +==== + +[discrete] +[[ai-assistant-your-data-and-the-ai-assistant]] +== Your data and the AI Assistant + +Elastic does not use customer data for model training. This includes anything you send the model, such as alert or event data, detection rule configurations, queries, and prompts. However, any data you provide to the AI Assistant will be processed by the third-party provider you chose when setting up the OpenAI connector as part of the assistant setup. + +Elastic does not control third-party tools, and assumes no responsibility or liability for their content, operation, or use, nor for any loss or damage that may arise from your using such tools. Please exercise caution when using AI tools with personal, sensitive, or confidential information. Any data you submit may be used by the provider for AI training or other purposes. There is no guarantee that the provider will keep any information you provide secure or confidential. You should familiarize yourself with the privacy practices and terms of use of any generative AI tools prior to use. + +[discrete] +[[ai-assistant-set-up-the-ai-assistant]] +== Set up the AI Assistant + +To set up the AI Assistant: + +. Create an authentication key with your AI provider to authenticate requests from the AI Assistant. You'll use this in the next step. Refer to your provider's documentation for information about creating authentication keys: ++ +** https://platform.openai.com/docs/api-reference[OpenAI API keys] +** https://learn.microsoft.com/en-us/azure/cognitive-services/openai/reference[Azure OpenAI Service API keys] +** https://docs.aws.amazon.com/bedrock/latest/userguide/security-iam.html[Amazon Bedrock authentication keys and secrets] +** https://cloud.google.com/iam/docs/keys-list-get[Google Gemini service account keys] +. From **Project settings** → **Management** → **Connectors**, create a connector for your AI provider: ++ +** {kibana-ref}/openai-action-type.html[OpenAI] +** {kibana-ref}/bedrock-action-type.html[Amazon Bedrock] +** {kibana-ref}/gemini-action-type.html[Google Gemini] +. Authenticate communication between {observability} and the AI provider by providing the following information: ++ +.. In the **URL** field, enter the AI provider's API endpoint URL. +.. Under **Authentication**, enter the key or secret you created in the previous step. + +[discrete] +[[ai-assistant-add-data-to-the-ai-assistant-knowledge-base]] +== Add data to the AI Assistant knowledge base + +[IMPORTANT] +==== +**If you started using the AI Assistant in technical preview**, +any knowledge base articles you created using ELSER v1 will need to be reindexed or upgraded before they can be used. +Going forward, you must create knowledge base articles using ELSER v2. +You can either: + +* Clear all old knowledge base articles manually and reindex them. +* Upgrade all knowledge base articles indexed with ELSER v1 to ELSER v2 using a https://github.com/elastic/elasticsearch-labs/blob/main/notebooks/model-upgrades/upgrading-index-to-use-elser.ipynb[Python script]. +==== + +The AI Assistant uses {ml-docs}/ml-nlp-elser.html[ELSER], Elastic's semantic search engine, to recall data from its internal knowledge base index to create retrieval augmented generation (RAG) responses. Adding data such as Runbooks, GitHub issues, internal documentation, and Slack messages to the knowledge base gives the AI Assistant context to provide more specific assistance. + +[NOTE] +==== +Your AI provider may collect telemetry when using the AI Assistant. Contact your AI provider for information on how data is collected. +==== + +You can add information to the knowledge base by asking the AI Assistant to remember something while chatting (for example, "remember this for next time"). The assistant will create a summary of the information and add it to the knowledge base. + +You can also add external data to the knowledge base either in the Project Settings UI or using the {es} Index API. + +[discrete] +[[ai-assistant-use-the-ui]] +=== Use the UI + +To add external data to the knowledge base in the Project Settings UI: + +. Go to **Project Settings**. +. In the _Other_ section, click **AI assistant for Observability settings**. +. Then select the **Elastic AI Assistant for Observability**. +. Switch to the **Knowledge base** tab. +. Click the **New entry** button, and choose either: ++ +** **Single entry**: Write content for a single entry in the UI. +** **Bulk import**: Upload a newline delimited JSON (`ndjson`) file containing a list of entries to add to the knowledge base. +Each object should conform to the following format: ++ +[source,json] +---- +{ + "id": "a_unique_human_readable_id", + "text": "Contents of item", +} +---- + +[discrete] +[[ai-assistant-use-the-es-index-api]] +=== Use the {es} Index API + +. Ingest external data (GitHub issues, Markdown files, Jira tickets, text files, etc.) into {es} using the {es} {ref}/docs-index_.html[Index API]. +. Reindex your data into the AI Assistant's knowledge base index by completing the following query in **Developer Tools** → **Console**. Update the following fields before reindexing: ++ +** `InternalDocsIndex`: Name of the index where your internal documents are stored. +** `text_field`: Name of the field containing your internal documents' text. +** `timestamp`: Name of the timestamp field in your internal documents. +** `public`: If `true`, the document is available to all users with access to your Observability project. If `false`, the document is restricted to the user indicated in the following `user.name` field. +** `user.name` (optional): If defined, restricts the internal document's availability to a specific user. +** You can add a query filter to index specific documents. + +[source,console] +---- +POST _reindex +{ + "source": { + "index": "", + "_source": [ + "", + "", + "namespace", + "is_correction", + "public", + "confidence" + ] + }, + "dest": { + "index": ".kibana-observability-ai-assistant-kb-000001", + "pipeline": ".kibana-observability-ai-assistant-kb-ingest-pipeline" + }, + "script": { + "inline": "ctx._source.text = ctx._source.remove(\"\");ctx._source.namespace=\"\";ctx._source.is_correction=false;ctx._source.public=;ctx._source.confidence=\"high\";ctx._source['@timestamp'] = ctx._source.remove(\"\");ctx._source['user.name'] = \"\"" + } +} +---- + +[discrete] +[[ai-assistant-interact-with-the-ai-assistant]] +== Interact with the AI Assistant + +You can chat with the AI Assistant or interact with contextual insights located throughout {observability}. +See the following sections for more on interacting with the AI Assistant. + +[TIP] +==== +After every answer the LLM provides, let us know if the answer was helpful. +Your feedback helps us improve the AI Assistant! +==== + +[discrete] +[[ai-assistant-chat-with-the-assistant]] +=== Chat with the assistant + +Click **AI Assistant** in the upper-right corner where available to start the chat: + +[role="screenshot"] +image::images/ai-assistant-button.png[Observability AI assistant preview] + +This opens the AI Assistant flyout, where you can ask the assistant questions about your instance: + +[role="screenshot"] +image::images/ai-assistant-chat.png[Observability AI assistant chat] + +[IMPORTANT] +==== +Asking questions about your data requires function calling, which enables LLMs to reliably interact with third-party generative AI providers to perform searches or run advanced functions using customer data. + +When the Observability AI Assistant performs searches in the cluster, the queries are run with the same level of permissions as the user. +==== + +[discrete] +[[ai-assistant-suggest-functions]] +=== Suggest functions + +beta::[] + +The AI Assistant uses several functions to include relevant context in the chat conversation through text, data, and visual components. Both you and the AI Assistant can suggest functions. You can also edit the AI Assistant's function suggestions and inspect function responses. For example, you could use the `kibana` function to call a {kib} API on your behalf. + +You can suggest the following functions: + +|=== +| Function | Description + +| `alerts` +| Get alerts for {observability}. + +| `elasticsearch` +| Call {es} APIs on your behalf. + +| `kibana` +| Call {kib} APIs on your behalf. + +| `summarize` +| Summarize parts of the conversation. + +| `visualize_query` +| Visualize charts for ES|QL queries. +|=== + +Additional functions are available when your cluster has APM data: + +|=== +| Function | Description + +| `get_apm_correlations` +| Get field values that are more prominent in the foreground set than the background set. This can be useful in determining which attributes (such as `error.message`, `service.node.name`, or `transaction.name`) are contributing to, for instance, a higher latency. Another option is a time-based comparison, where you compare before and after a change point. + +| `get_apm_downstream_dependencies` +| Get the downstream dependencies (services or uninstrumented backends) for a service. Map the downstream dependency name to a service by returning both `span.destination.service.resource` and `service.name`. Use this to drill down further if needed. + +| `get_apm_error_document` +| Get a sample error document based on the grouping name. This also includes the stacktrace of the error, which might hint to the cause. + +| `get_apm_service_summary` +| Get a summary of a single service, including the language, service version, deployments, the environments, and the infrastructure that it is running in. For example, the number of pods and a list of their downstream dependencies. It also returns active alerts and anomalies. + +| `get_apm_services_list` +| Get the list of monitored services, their health statuses, and alerts. + +| `get_apm_timeseries` +| Display different APM metrics (such as throughput, failure rate, or latency) for any service or all services and any or all of their dependencies. Displayed both as a time series and as a single statistic. Additionally, the function returns any changes, such as spikes, step and trend changes, or dips. You can also use it to compare data by requesting two different time ranges, or, for example, two different service versions. +|=== + +[discrete] +[[ai-assistant-use-contextual-prompts]] +=== Use contextual prompts + +AI Assistant contextual prompts throughout {observability} provide the following information: + +* **Alerts**: Provides possible causes and remediation suggestions for log rate changes. +* **Application performance monitoring (APM)**: Explains APM errors and provides remediation suggestions. +* **Logs**: Explains log messages and generates search patterns to find similar issues. + +// Not included in initial serverless launch + +// - **Universal Profiling**: explains the most expensive libraries and functions in your fleet and provides optimization suggestions. + +// - **Infrastructure Observability**: explains the processes running on a host. + +For example, in the log details, you'll see prompts for **What's this message?** and **How do I find similar log messages?**: + +[role="screenshot"] +image::images/ai-assistant-logs-prompts.png[Observability AI assistant example prompts for logs] + +Clicking a prompt generates a message specific to that log entry. +You can continue a conversation from a contextual prompt by clicking **Start chat** to open the AI Assistant chat. + +[role="screenshot"] +image::images/ai-assistant-logs.png[Observability AI assistant example] + +[discrete] +[[ai-assistant-add-the-ai-assistant-connector-to-alerting-workflows]] +=== Add the AI Assistant connector to alerting workflows + +You can use the {kibana-ref}/obs-ai-assistant-action-type.html[Observability AI Assistant connector] to add AI-generated insights and custom actions to your alerting workflows. +To do this: + +. <> and specify the conditions that must be met for the alert to fire. +. Under **Actions**, select the **Observability AI Assistant** connector type. +. In the **Connector** list, select the AI connector you created when you set up the assistant. +. In the **Message** field, specify the message to send to the assistant: + +[role="screenshot"] +image::images/obs-ai-assistant-action-high-cpu.png[Add an Observability AI assistant action while creating a rule in the Observability UI] + +You can ask the assistant to generate a report of the alert that fired, +recall any information or potential resolutions of past occurrences stored in the knowledge base, +provide troubleshooting guidance and resolution steps, +and also include other active alerts that may be related. +As a last step, you can ask the assistant to trigger an action, +such as sending the report (or any other message) to a Slack webhook. + +.NOTE +[NOTE] +==== +Currently you can only send messages to Slack, email, Jira, PagerDuty, or a webhook. +Additional actions will be added in the future. +==== + +When the alert fires, contextual details about the event—such as when the alert fired, +the service or host impacted, and the threshold breached—are sent to the AI Assistant, +along with the message provided during configuration. +The AI Assistant runs the tasks requested in the message and creates a conversation you can use to chat with the assistant: + +[role="screenshot"] +image::images/obs-ai-assistant-output.png[AI Assistant conversation created in response to an alert] + +[IMPORTANT] +==== +Conversations created by the AI Assistant are public and accessible to every user with permissions to use the assistant. +==== + +It might take a minute or two for the AI Assistant to process the message and create the conversation. + +Note that overly broad prompts may result in the request exceeding token limits. +For more information, refer to <>. +Also, attempting to analyze several alerts in a single connector execution may cause you to exceed the function call limit. +If this happens, modify the message specified in the connector configuration to avoid exceeding limits. + +When asked to send a message to another connector, such as Slack, +the AI Assistant attempts to include a link to the generated conversation. + +[role="screenshot"] +image::images/obs-ai-assistant-slack-message.png[Message sent by Slack by the AI Assistant includes a link to the conversation] + +The Observability AI Assistant connector is called when the alert fires and when it recovers. + +To learn more about alerting, actions, and connectors, refer to <>. + +[discrete] +[[ai-assistant-known-issues]] +== Known issues + +[discrete] +[[token-limits]] +=== Token limits + +Most LLMs have a set number of tokens they can manage in single a conversation. +When you reach the token limit, the LLM will throw an error, and Elastic will display a "Token limit reached" error. +The exact number of tokens that the LLM can support depends on the LLM provider and model you're using. +If you are using an OpenAI connector, you can monitor token usage in **OpenAI Token Usage** dashboard. +For more information, refer to the {kibana-ref}/openai-action-type.html#openai-connector-token-dashboard[OpenAI Connector documentation]. diff --git a/docs/en/serverless/aiops/aiops-analyze-spikes.asciidoc b/docs/en/serverless/aiops/aiops-analyze-spikes.asciidoc new file mode 100644 index 0000000000..36a2881008 --- /dev/null +++ b/docs/en/serverless/aiops/aiops-analyze-spikes.asciidoc @@ -0,0 +1,73 @@ +[[aiops-analyze-spikes]] += Analyze log spikes and drops + +:description: Find and investigate the causes of unusual spikes or drops in log rates. +:keywords: serverless, observability, how-to + +preview:[] + +// + +Elastic {observability} provides built-in log rate analysis capabilities, +based on advanced statistical methods, +to help you find and investigate the causes of unusual spikes or drops in log rates. + +To analyze log spikes and drops: + +. In your {observability} project, go to **AIOps** → **Log rate analysis**. +. Choose a data view or saved search to access the log data you want to analyze. +. In the histogram chart, click a spike (or drop) to start the analysis. ++ +[role="screenshot"] +image::images/log-rate-histogram.png[Histogram showing log spikes and drops ] ++ +When the analysis runs, it identifies statistically significant field-value combinations that contribute to the spike or drop, +and then displays them in a table: ++ +[role="screenshot"] +image::images/log-rate-analysis-results.png[Histogram showing log spikes and drops ] ++ +Notice that you can optionally turn on **Smart grouping** to summarize the results into groups. +You can also click **Filter fields** to remove fields that are not relevant. ++ +The table shows an indicator of the level of impact and a sparkline showing the shape of the impact in the chart. +. Select a row to display the impact of the field on the histogram chart. +. From the **Actions** menu in the table, you can choose to view the field in **Discover**, +view it in <>, +or copy the table row information to the clipboard as a query filter. + +To pin a table row, click the row, then move the cursor to the histogram chart. +It displays a tooltip with exact count values for the pinned field which enables closer investigation. + +Brushes in the chart show the baseline time range and the deviation in the analyzed data. +You can move the brushes to redefine both the baseline and the deviation and rerun the analysis with the modified values. + +[discrete] +[[log-pattern-analysis]] +== Log pattern analysis + +// + +Use log pattern analysis to find patterns in unstructured log messages and examine your data. +When you run a log pattern analysis, it performs categorization analysis on a selected field, +creates categories based on the data, and then displays them together in a chart. +The chart shows the distribution of each category and an example document that matches the category. +Log pattern analysis is useful when you want to examine how often different types of logs appear in your data set. +It also helps you group logs in ways that go beyond what you can achieve with a terms aggregation. + +To run log pattern analysis: + +. Follow the steps under <> to run a log rate analysis. +. From the **Actions** menu, choose **View in Log Pattern Analysis**. +. Select a category field and optionally apply any filters that you want. +. Click **Run pattern analysis**. ++ +The results of the analysis are shown in a table: ++ +[role="screenshot"] +image::images/log-pattern-analysis.png[Log pattern analysis of the message field ] +. From the **Actions** menu, click the plus (or minus) icon to open **Discover** and show (or filter out) the given category there, which helps you to further examine your log messages. + +// TODO: Question: Is the log pattern analysis only available through the log rate analysis UI? + +// TODO: Add some good examples to this topic taken from existing docs or recommendations from reviewers. diff --git a/docs/en/serverless/aiops/aiops-detect-anomalies.asciidoc b/docs/en/serverless/aiops/aiops-detect-anomalies.asciidoc new file mode 100644 index 0000000000..b7cdfa2a35 --- /dev/null +++ b/docs/en/serverless/aiops/aiops-detect-anomalies.asciidoc @@ -0,0 +1,274 @@ +[[aiops-detect-anomalies]] += Detect anomalies + +:description: Detect anomalies by comparing real-time and historical data from different sources to look for unusual, problematic patterns. +:keywords: serverless, observability, how-to + +preview:[] + +:role: Editor +:goal: create, run, and view {anomaly-job}s +include::../partials/roles.asciidoc[] +:role!: + +:goal!: + +The anomaly detection feature in Elastic {observability} automatically models the normal behavior of your time series data — learning trends, +periodicity, and more — in real time to identify anomalies, streamline root cause analysis, and reduce false positives. + +To set up anomaly detection, you create and run anomaly detection jobs. +Anomaly detection jobs use proprietary {ml} algorithms to detect anomalous events or patterns, such as: + +* Anomalies related to temporal deviations in values, counts, or frequencies +* Anomalies related to unusual locations in geographic data +* Statistical rarity +* Unusual behaviors for a member of a population + +To learn more about anomaly detection algorithms, refer to the {ml-docs}/ml-ad-algorithms.html[{ml}] documentation. +Note that the {ml} documentation may contain details that are not valid when using a serverless project. + +.Some terms you might need to know +[NOTE] +==== +A _datafeed_ retrieves time series data from {es} and provides it to an +anomaly detection job for analysis. + +The job uses _buckets_ to divide the time series into batches for processing. +For example, a job may use a bucket span of 1 hour. + +Each {anomaly-job} contains one or more _detectors_, which define the type of +analysis that occurs (for example, `max`, `average`, or `rare` analytical +functions) and the fields that are analyzed. Some of the analytical functions +look for single anomalous data points. For example, `max` identifies the maximum +value that is seen within a bucket. Others perform some aggregation over the +length of the bucket. For example, `mean` calculates the mean of all the data +points seen within the bucket. + +To learn more about anomaly detection, refer to the {ml-docs}/ml-ad-overview.html[{ml}] documentation. +==== + +[discrete] +[[create-anomaly-detection-job]] += Create and run an anomaly detection job + +. In your {observability} project, go to **AIOps** → **Anomaly detection**. +. Click **Create anomaly detection job** (or **Create job** if other jobs exist). +. Choose a data view or saved search to access the data you want to analyze. +. Select the wizard for the type of job you want to create. +The following wizards are available. +You might also see specialized wizards based on the type of data you are analyzing. + +[TIP] +==== +In general, it is a good idea to start with single metric anomaly detection jobs for your key performance indicators. +After you examine these simple analysis results, you will have a better idea of what the influencers might be. +Then you can create multi-metric jobs and split the data or create more complex analysis functions as necessary. +==== + +Single metric:: +Creates simple jobs that have a single detector. A _detector_ applies an analytical function to specific fields in your data. In addition to limiting the number of detectors, the single metric wizard omits many of the more advanced configuration options. + +Multi-metric:: +Creates jobs that can have more than one detector, which is more efficient than running multiple jobs against the same data. + +Population:: +Creates jobs that detect activity that is unusual compared to the behavior of the population. + +Advanced:: +Creates jobs that can have multiple detectors and enables you to configure all job settings. + +Categorization:: +Creates jobs that group log messages into categories and use `count` or `rare` functions to detect anomalies within them. + +Rare:: +Creates jobs that detect rare occurrences in time series data. Rare jobs use the `rare` or `freq_rare` functions and also detect rare occurrences in populations. + +Geo:: +Creates jobs that detect unusual occurrences in the geographic locations of your data. Your data set must contain geo data. + +For more information about job types, refer to the {ml-docs}/ml-anomaly-detection-job-types.html[{ml}] documentation. + +.Not sure what type of job to create? +[NOTE] +==== +Before selecting a wizard, click **Data Visualizer** to explore the fields and metrics in your data. +To get the best results, you must understand your data, including its data types and the range and distribution of values. + +In the **Data Visualizer**, use the time filter to select a time period that you’re interested in exploring, +or click **Use full data** to view the full time range of data. +Expand the fields to see details about the range and distribution of values. +When you're done, go back to the first step and create your job. +==== + +. Step through the instructions in the job creation wizard to configure your job. +You can accept the default settings for most settings now and <> later. +. If you want the job to start immediately when the job is created, make sure that option is selected on the summary page. +. When you're done, click **Create job**. +When the job runs, the {ml} features analyze the input stream of data, model its behavior, and perform analysis based on the detectors in each job. +When an event occurs outside of the baselines of normal behavior, that event is identified as an anomaly. +. After the job is started, click **View results**. + +[discrete] +[[aiops-detect-anomalies-view-the-results]] += View the results + +After the anomaly detection job has processed some data, +you can view the results in Elastic {observability}. + +[TIP] +==== +Depending on the capacity of your machine, +you might need to wait a few seconds for the analysis to generate initial results. +==== + +If you clicked **View results** after creating the job, the results open in either the **Single Metric Viewer** or **Anomaly Explorer**. +To switch between these tools, click the icons in the upper-left corner of each tool. + +Read the following sections to learn more about these tools: + +* <> +* <> + +[discrete] +[[view-single-metric]] +== View single metric job results + +The **Single Metric Viewer** contains a chart that represents the actual and expected values over time: + +[role="screenshot"] +image::images/anomaly-detection-single-metric-viewer.png[Single Metric Viewer showing analysis ] + +* The line in the chart represents the actual data values. +* The shaded area represents the bounds for the expected values. +* The area between the upper and lower bounds are the most likely values for the model, using a 95% confidence level. +That is to say, there is a 95% chance of the actual value falling within these bounds. +If a value is outside of this area then it will usually be identified as anomalous. + +[TIP] +==== +Expected values are available only if **Enable model plot** was selected under Job Details +when you created the job. +==== + +To explore your data: + +. If the **Single Metric Explorer** is not already open, go to **AIOps** → **Anomaly detection** and click the Single Metric Explorer icon next to the job you created. +Note that the Single Metric Explorer icon will be grayed out for advanced or multi-metric jobs. +. In the time filter, specify a time range that covers the majority of the analyzed data points. +. Notice that the model improves as it processes more data. +At the beginning, the expected range of values is pretty broad, and the model is not capturing the periodicity in the data. +But it quickly learns and begins to reflect the patterns in your data. +The duration of the learning process heavily depends on the characteristics and complexity of the input data. +. Look for anomaly data points, depicted by colored dots or cross symbols, and hover over a data point to see more details about the anomaly. +Note that anomalies with medium or high multi-bucket impact are depicted with a cross symbol instead of a dot. ++ +.How are anomaly scores calculated? +[NOTE] +==== +Any data points outside the range that was predicted by the model are marked +as anomalies. In order to provide a sensible view of the results, an +_anomaly score_ is calculated for each bucket time interval. The anomaly score +is a value from 0 to 100, which indicates the significance of the anomaly +compared to previously seen anomalies. The highly anomalous values are shown in +red and the low scored values are shown in blue. An interval with a high +anomaly score is significant and requires investigation. +For more information about anomaly scores, refer to the {ml-docs}/ml-ad-explain.html[{ml}] documentation. +==== +. (Optional) Annotate your job results by drag-selecting a period of time and entering annotation text. +Annotations are notes that refer to events in a specific time period. +They can be created by the user or generated automatically by the anomaly detection job to reflect model changes and noteworthy occurrences. +. Under **Anomalies**, expand each anomaly to see key details, such as the time, the actual and expected ("typical") values, and their probability. +The **Anomaly explanation** section gives you further insights about each anomaly, such as its type and impact, to make it easier to interpret the job results: ++ +[role="screenshot"] +image::images/anomaly-detection-details.png[Single Metric Viewer showing anomaly details ] ++ +By default, the **Anomalies** table contains all anomalies that have a severity of "warning" or higher in the selected section of the timeline. +If you are only interested in critical anomalies, for example, you can change the severity threshold for this table. +. (Optional) From the **Actions** menu in the **Anomalies** table, you can choose to view relevant documents in **Discover** or create a job rule. +Job rules instruct anomaly detectors to change their behavior based on domain-specific knowledge that you provide. +To learn more, refer to <> + +After you have identified anomalies, often the next step is to try to determine +the context of those situations. For example, are there other factors that are +contributing to the problem? Are the anomalies confined to particular +applications or servers? You can begin to troubleshoot these situations by +layering additional jobs or creating multi-metric jobs. + +[discrete] +[[anomaly-explorer]] +== View advanced or multi-metric job results + +Conceptually, you can think of _multi-metric anomaly detection jobs_ as running multiple independent single metric jobs. +By bundling them together in a multi-metric job, however, +you can see an overall score and shared influencers for all the metrics and all the entities in the job. +Multi-metric jobs therefore scale better than having many independent single metric jobs. +They also provide better results when you have influencers that are shared across the detectors. + +.What is an influencer? +[NOTE] +==== +When you create an anomaly detection job, you can identify fields as _influencers_. +These are fields that you think contain information about someone or something that influences or contributes to anomalies. +As a best practice, do not pick too many influencers. +For example, you generally do not need more than three. +If you pick many influencers, the results can be overwhelming, and there is some overhead to the analysis. + +To learn more about influencers, refer to the {ml-docs}/ml-ad-run-jobs.html#ml-ad-influencers[{ml}] documentation. +==== + +You can also configure your anomaly detection jobs to split a single time series into multiple time series based on a categorical field. +For example, you could create a job for analyzing response code rates that has a single detector that splits the data based on the `response.keyword`, +and uses the `count` function to determine when the number of events is anomalous. +You might use a job like this if you want to look at both high and low request rates partitioned by response code. + +To view advanced or multi-metric results in the +**Anomaly Explorer**: + +. If the **Anomaly Explorer** is not already open, go to **AIOps** → **Anomaly detection** and click the Anomaly Explorer icon next to the job you created. +. In the time filter, specify a time range that covers the majority of the analyzed data points. +. If you specified influencers during job creation, the view includes a list of the top influencers for all of the detected anomalies in that same time period. +The list includes maximum anomaly scores, which in this case are aggregated for each influencer, for each bucket, across all detectors. +There is also a total sum of the anomaly scores for each influencer. +Use this list to help you narrow down the contributing factors and focus on the most anomalous entities. +. Under **Anomaly timeline**, click a section in the swim lanes to obtain more information about the anomalies in that time period. ++ +[role="screenshot"] +image::images/anomaly-explorer.png[Anomaly Explorer showing swim lanes with anomaly selected ] ++ +You can see exact times when anomalies occurred. +If there are multiple detectors or metrics in the job, you can see which caught the anomaly. +You can also switch to viewing this time series in the **Single Metric Viewer** by selecting **View series** in the **Actions** menu. +. Under **Anomalies** (in the **Anomaly Explorer**), expand an anomaly to see key details, such as the time, +the actual and expected ("typical") values, and the influencers that contributed to the anomaly: ++ +[role="screenshot"] +image::images/anomaly-detection-multi-metric-details.png[Anomaly Explorer showing anomaly details ] ++ +By default, the **Anomalies** table contains all anomalies that have a severity of "warning" or higher in the selected section of the timeline. +If you are only interested in critical anomalies, for example, you can change the severity threshold for this table. ++ +If your job has multiple detectors, the table aggregates the anomalies to show the highest severity anomaly per detector and entity, +which is the field value that is displayed in the **found for** column. ++ +To view all the anomalies without any aggregation, set the **Interval** to **Show all**. + +[TIP] +==== +The anomaly scores that you see in each section of the **Anomaly Explorer** might differ slightly. +This disparity occurs because for each job there are bucket results, influencer results, and record results. +Anomaly scores are generated for each type of result. +The anomaly timeline uses the bucket-level anomaly scores. +The list of top influencers uses the influencer-level anomaly scores. +The list of anomalies uses the record-level anomaly scores. +==== + +[discrete] +[[aiops-detect-anomalies-next-steps]] +== Next steps + +After setting up an anomaly detection job, you may want to: + +* <> +* <> +* <> diff --git a/docs/en/serverless/aiops/aiops-detect-anomalies.mdx b/docs/en/serverless/aiops/aiops-detect-anomalies.mdx index 8798bfe592..88c91c0bc3 100644 --- a/docs/en/serverless/aiops/aiops-detect-anomalies.mdx +++ b/docs/en/serverless/aiops/aiops-detect-anomalies.mdx @@ -227,7 +227,9 @@ The list includes maximum anomaly scores, which in this case are aggregated for There is also a total sum of the anomaly scores for each influencer. Use this list to help you narrow down the contributing factors and focus on the most anomalous entities. 1. Under **Anomaly timeline**, click a section in the swim lanes to obtain more information about the anomalies in that time period. + ![Anomaly Explorer showing swim lanes with anomaly selected ](../images/anomaly-explorer.png) + You can see exact times when anomalies occurred. If there are multiple detectors or metrics in the job, you can see which caught the anomaly. You can also switch to viewing this time series in the **Single Metric Viewer** by selecting **View series** in the **Actions** menu. diff --git a/docs/en/serverless/aiops/aiops-detect-change-points.asciidoc b/docs/en/serverless/aiops/aiops-detect-change-points.asciidoc new file mode 100644 index 0000000000..3302c32264 --- /dev/null +++ b/docs/en/serverless/aiops/aiops-detect-change-points.asciidoc @@ -0,0 +1,70 @@ +[[aiops-detect-change-points]] += Detect change points + +:description: Detect distribution changes, trend changes, and other statistically significant change points in a metric of your time series data. +:keywords: serverless, observability, how-to + +preview:[] + +// + +The change point detection feature in Elastic {observability} detects distribution changes, +trend changes, and other statistically significant change points in time series data. +Unlike anomaly detection, change point detection does not require you to configure a job or generate a model. +Instead you select a metric and immediately see a visual representation that splits the time series into two parts, before and after the change point. + +Elastic {observability} uses a {ref}/search-aggregations-change-point-aggregation.html[change point aggregation] +to detect change points. This aggregation can detect change points when: + +* a significant dip or spike occurs +* the overall distribution of values has changed significantly +* there was a statistically significant step up or down in value distribution +* an overall trend change occurs + +To detect change points: + +. In your {observability} project, go to **AIOps** → **Change point detection**. +. Choose a data view or saved search to access the data you want to analyze. +. Select a function: **avg**, **max**, **min**, or **sum**. +. In the time filter, specify a time range over which you want to detect change points. +. From the **Metric field** list, select a field you want to check for change points. +. (Optional) From the **Split field** list, select a field to split the data by. +If the cardinality of the split field exceeds 10,000, only the first 10,000 values, sorted by document count, are analyzed. +Use this option when you want to investigate the change point across multiple instances, pods, clusters, and so on. +For example, you may want to view CPU utilization split across multiple instances without having to jump across multiple dashboards and visualizations. + +[NOTE] +==== +You can configure a maximum of six combinations of a function applied to a metric field, partitioned by a split field, to identify change points. +==== + +The change point detection feature automatically dissects the time series into multiple points within the given time window, +tests whether the behavior is statistically different before and after each point in time, and then detects a change point if one exists: + +[role="screenshot"] +image::images/change-point-detection.png[Change point detection UI showing change points split by process ] + +The resulting view includes: + +* The timestamp of the change point +* A preview chart +* The type of change point and its p-value. The p-value indicates the magnitude of the change; lower values indicate more significant changes. +* The name and value of the split field, if used. + +If the analysis is split by a field, a separate chart is shown for every partition that has a detected change point. +The chart displays the type of change point, its value, and the timestamp of the bucket where the change point has been detected. + +On the **Change point detection page**, you can also: + +* Select a subset of charts and click **View selected** to view only the selected charts. ++ +[role="screenshot"] +image::images/change-point-detection-view-selected.png[View selected change point detection charts ] +* Filter the results by specific types of change points by using the change point type selector: ++ +[role="screenshot"] +image::images/change-point-detection-filter-by-type.png[Change point detection filter by type list] +* Attach change points to a chart or dashboard by using the context menu: ++ +[role="screenshot"] +image::images/change-point-detection-attach-charts.png[Change point detection add to charts menu] diff --git a/docs/en/serverless/aiops/aiops-forecast-anomaly.asciidoc b/docs/en/serverless/aiops/aiops-forecast-anomaly.asciidoc new file mode 100644 index 0000000000..b7936db6b8 --- /dev/null +++ b/docs/en/serverless/aiops/aiops-forecast-anomaly.asciidoc @@ -0,0 +1,47 @@ +[[aiops-forecast-anomalies]] += Forecast future behavior + +:description: Predict future behavior of your data by creating a forecast for an anomaly detection job. +:keywords: serverless, observability, how-to + +preview:[] + +:role: Editor +:goal: create a forecast for an {anomaly-job} +include::../partials/roles.asciidoc[] +:role!: + +:goal!: + +In addition to detecting anomalous behavior in your data, +you can use the {ml} features to predict future behavior. + +You can use a forecast to estimate a time series value at a specific future date. +For example, you might want to determine how much disk usage to expect +next Sunday at 09:00. + +You can also use a forecast to estimate the probability of a time series value occurring at a future date. +For example, you might want to determine how likely it is that your disk utilization will reach 100% before the end of next week. + +To create a forecast: + +. <> and view the results in the **Single Metric Viewer**. +. Click **Forecast**. +. Specify a duration for your forecast. +This value indicates how far to extrapolate beyond the last record that was processed. +You must use time units, for example 1w, 1d, 1h, and so on. +. Click **Run**. +. View the forecast in the **Single Metric Viewer**: ++ +[role="screenshot"] +image::images/anomaly-detection-forecast.png[Single Metric Viewer showing forecast ] ++ +** The line in the chart represents the predicted data values. +** The shaded area represents the bounds for the predicted values, which also gives an indication of the confidence of the predictions. +** Note that the bounds generally increase with time (that is to say, the confidence levels decrease), +since you are forecasting further into the future. +Eventually if the confidence levels are too low, the forecast stops. +. (Optional) After the job has processed more data, click the **Forecast** button again to compare the forecast to actual data. ++ +The resulting chart will contain the actual data values, the bounds for the expected values, the anomalies, the forecast data values, and the bounds for the forecast. +This combination of actual and forecast data gives you an indication of how well the {ml} features can extrapolate the future behavior of the data. diff --git a/docs/en/serverless/aiops/aiops-tune-anomaly-detection-job.asciidoc b/docs/en/serverless/aiops/aiops-tune-anomaly-detection-job.asciidoc new file mode 100644 index 0000000000..c2aba08202 --- /dev/null +++ b/docs/en/serverless/aiops/aiops-tune-anomaly-detection-job.asciidoc @@ -0,0 +1,186 @@ +[[aiops-tune-anomaly-detection-job]] += Tune your anomaly detection job + +:description: Tune your job by creating calendars, adding job rules, and defining custom URLs. +:keywords: serverless, observability, how-to + +preview:[] + +:role: Editor +:goal: create calendars, add job rules, and define custom URLs +include::../partials/roles.asciidoc[] +:role!: + +:goal!: + +After you run an anomaly detection job and view the results, +you might find that you need to alter the job configuration or settings. + +To further tune your job, you can: + +* <> that contain a list of scheduled events for which you do not want to generate anomalies, such as planned system outages or public holidays. +* <> that instruct anomaly detectors to change their behavior based on domain-specific knowledge that you provide. +Your job rules can use filter lists, which contain values that you can use to include or exclude events from the {ml} analysis. +* <> to make dashboards and other resources readily available when viewing job results. + +For more information about tuning your job, +refer to the how-to guides in the {ml-docs}/anomaly-how-tos.html[{ml}] documentation. +Note that the {ml} documentation may contain details that are not valid when using a fully-managed Elastic project. + +[TIP] +==== +You can also create calendars and add URLs when configuring settings during job creation, +but generally it's easier to start with a simple job and add complexity later. +==== + +[discrete] +[[create-calendars]] +== Create calendars + +Sometimes there are periods when you expect unusual activity to take place, +such as bank holidays, "Black Friday", or planned system outages. +If you identify these events in advance, no anomalies are generated during that period. +The {ml} model is not ill-affected, and you do not receive spurious results. + +To create a calendar and add scheduled events: + +. In your {observability} project, go to **AIOps** → **Anomaly detection**. +. Click **Settings**. +. Under **Calendars**, click **Create**. +. Enter an ID and description for the calendar. +. Select the jobs you want to apply the calendar to, or turn on **Apply calendar to all jobs**. +. Under **Events**, click **New event** or click **Import events** to import events from an iCalendar (ICS) file: ++ +[role="screenshot"] +image::images/anomaly-detection-create-calendar.png[Create new calendar page] ++ +A scheduled event must have a start time, end time, and calendar ID. +In general, scheduled events are short in duration (typically lasting from a few hours to a day) and occur infrequently. +If you have regularly occurring events, such as weekly maintenance periods, +you do not need to create scheduled events for these circumstances; +they are already handled by the {ml} analytics. +If your ICS file contains recurring events, only the first occurrence is imported. +. When you're done adding events, save your calendar. + +You must identify scheduled events _before_ your anomaly detection job analyzes the data for that time period. +{ml-cap} results are not updated retroactively. +Bucket results are generated during scheduled events, but they have an anomaly score of zero. + +[TIP] +==== +If you use long or frequent scheduled events, +it might take longer for the {ml} analytics to learn to model your data, +and some anomalous behavior might be missed. +==== + +[discrete] +[[create-job-rules]] +== Create job rules and filters + +By default, anomaly detection is unsupervised, +and the {ml} models have no awareness of the domain of your data. +As a result, anomaly detection jobs might identify events that are statistically significant but are uninteresting when you know the larger context. + +You can customize anomaly detection by creating custom job rules. +_Job rules_ instruct anomaly detectors to change their behavior based on domain-specific knowledge that you provide. +When you create a rule, you can specify conditions, scope, and actions. +When the conditions of a rule are satisfied, its actions are triggered. + +.Example use case for creating a job rule +[NOTE] +==== +If you have an anomaly detector that is analyzing CPU usage, +you might decide you are only interested in anomalies where the CPU usage is greater than a certain threshold. +You can define a rule with conditions and actions that instruct the detector to refrain from generating {ml} results when there are anomalous events related to low CPU usage. +You might also decide to add a scope for the rule so that it applies only to certain machines. +The scope is defined by using {ml} filters. +==== + +_Filters_ contain a list of values that you can use to include or exclude events from the {ml} analysis. +You can use the same filter in multiple anomaly detection jobs. + +.Example use case for creating a filter list +[NOTE] +==== +If you are analyzing web traffic, you might create a filter that contains a list of IP addresses. +The list could contain IP addresses that you trust to upload data to your website or to send large amounts of data from behind your firewall. +You can define the rule's scope so that the action triggers only when a specific field in your data matches (or doesn't match) a value in the filter. +This gives you much greater control over which anomalous events affect the {ml} model and appear in the {ml} results. +==== + +To create a job rule, first create any filter lists you want to use in the rule, then configure the rule: + +. In your {observability} project, go to **AIOps** → **Anomaly detection**. +. (Optional) Create one or more filter lists: ++ +.. Click **Settings**. +.. Under **Filter lists**, click **Create**. +.. Enter the filter list ID. This is the ID you will select when you want to use the filter list in a job rule. +.. Click **Add item** and enter one item per line. +.. Click **Add** then save the filter list: ++ +[role="screenshot"] +image::images/anomaly-detection-create-filter-list.png[Create filter list] +. Open the job results in the **Single Metric Viewer** or **Anomaly Explorer**. +. From the **Actions** menu in the **Anomalies** table, select **Configure job rules**. ++ +[role="screenshot"] +image::images/anomaly-detection-configure-job-rules.png[Configure job rules menu selection] +. Choose which actions to take when the job rule matches the anomaly: **Skip result**, **Skip model update**, or both. +. Under **Conditions**, add one or more conditions that must be met for the action to be triggered. +. Under **Scope** (if available), add one or more filter lists to limit where the job rule applies. +. Save the job rule. +Note that changes to job rules take effect for new results only. +To apply these changes to existing results, you must clone and rerun the job. + +[discrete] +[[define-custom-urls]] +== Define custom URLs + +You can optionally attach one or more custom URLs to your anomaly detection jobs. +Links for these URLs will appear in the **Actions** menu of the anomalies table when viewing job results in the **Single Metric Viewer** or **Anomaly Explorer**. +Custom URLs can point to dashboards, the Discover app, or external websites. +For example, you can define a custom URL that enables users to drill down to the source data from the results set. + +To add a custom URL to the **Actions** menu: + +. In your {observability} project, go to **AIOps** → **Anomaly detection**. +. From the **Actions** menu in the job list, select **Edit job**. +. Select the **Custom URLs** tab, then click **Add custom URL**. +. Enter the label to use for the link text. +. Choose the type of resource you want to link to: ++ +|=== +| If you select... | Do this... + +| {kib} dashboard +| Select the dashboard you want to link to. + +| Discover +| Select the data view to use. + +| Other +| Specify the URL for the external website. +|=== +. Click **Test** to test your link. +. Click **Add**, then save your changes. + +Now when you view job results in **Single Metric Viewer** or **Anomaly Explorer**, +the **Actions** menu includes the custom link: + +[role="screenshot"] +image::images/anomaly-detection-custom-url.png[Create filter list] + +[TIP] +==== +It is also possible to use string substitution in custom URLs. +For example, you might have a **Raw data** URL defined as: + +`discover#/?_g=(time:(from:'$earliest$',mode:absolute,to:'$latest$'))&_a=(index:ff959d40-b880-11e8-a6d9-e546fe2bba5f,query:(language:kuery,query:'customer_full_name.keyword:"$customer_full_name.keyword$"'))`. + +The value of the `customer_full_name.keyword` field is passed to the target page when the link is clicked. + +For more information about using string substitution, +refer to the {ml-docs}/ml-configuring-url.html#ml-configuring-url-strings[{ml}] documentation. +Note that the {ml} documentation may contain details that are not valid when using a fully-managed Elastic project. +==== diff --git a/docs/en/serverless/aiops/aiops.asciidoc b/docs/en/serverless/aiops/aiops.asciidoc new file mode 100644 index 0000000000..306b517122 --- /dev/null +++ b/docs/en/serverless/aiops/aiops.asciidoc @@ -0,0 +1,24 @@ +[[aiops]] += AIOps + +:description: Automate anomaly detection and accelerate root cause analysis with AIOps. +:keywords: serverless, observability, overview + +preview:[] + +The AIOps capabilities available in Elastic {observability} enable you to consume and process large observability data sets at scale, reducing the time and effort required to detect, understand, investigate, and resolve incidents. +Built on predictive analytics and {ml}, our AIOps capabilities require no prior experience with {ml}. +DevOps engineers, SREs, and security analysts can get started right away using these AIOps features with little or no advanced configuration: + +|=== +| Feature | Description + +| <> +| Detect anomalies by comparing real-time and historical data from different sources to look for unusual, problematic patterns. + +| <> +| Find and investigate the causes of unusual spikes or drops in log rates. + +| <> +| Detect distribution changes, trend changes, and other statistically significant change points in a metric of your time series data. +|=== diff --git a/docs/en/serverless/alerting/aggregation-options.asciidoc b/docs/en/serverless/alerting/aggregation-options.asciidoc new file mode 100644 index 0000000000..049fb67ded --- /dev/null +++ b/docs/en/serverless/alerting/aggregation-options.asciidoc @@ -0,0 +1,40 @@ +[[aggregationOptions]] += Aggregation options + +:description: Learn about aggregations available in alerting rules. +:keywords: serverless, observability, reference + +preview:[] + +Aggregations summarize your data to make it easier to analyze. +In some alerting rules, you can specify aggregations to gather data for the rule. + +The following aggregations are available in some rules: + +|=== +| Aggregation | Description + +| Average +| Average value of a numeric field. + +| Cardinality +| Approximate number of unique values in a field. + +| Document count +| Number of documents in the selected dataset. + +| Max +| Highest value of a numeric field. + +| Min +| Lowest value of a numeric field. + +| Percentile +| Numeric value which represents the point at which n% of all values in the selected dataset are lower (choices are 95th or 99th). + +| Rate +| Rate at which a specific field changes over time. To learn about how the rate is calculated, refer to <>. + +| Sum +| Total of a numeric field in the selected dataset. +|=== diff --git a/docs/en/serverless/alerting/aiops-generate-anomaly-alerts.asciidoc b/docs/en/serverless/alerting/aiops-generate-anomaly-alerts.asciidoc new file mode 100644 index 0000000000..d27163a716 --- /dev/null +++ b/docs/en/serverless/alerting/aiops-generate-anomaly-alerts.asciidoc @@ -0,0 +1,199 @@ +[[aiops-generate-anomaly-alerts]] += Create an anomaly detection rule + +:description: Get alerts when anomalies match specific conditions. +:keywords: serverless, observability, how-to + +++++ +Anomaly detection +++++ + +preview:[] + +:role: Editor +:goal: create anomaly detection rules +include::../partials/roles.asciidoc[] +:role!: + +:goal!: + +:feature: Anomaly detection alerting +include::../partials/feature-beta.asciidoc[] +:feature!: + +Create an anomaly detection rule to check for anomalies in one or more anomaly detection jobs. +If the conditions of the rule are met, an alert is created, and any actions specified in the rule are triggered. +For example, you can create a rule to check every fifteen minutes for critical anomalies and then alert you by email when they are detected. + +To create an anomaly detection rule: + +. In your {observability} project, go to **AIOps** → **Anomaly detection**. +. In the list of anomaly detection jobs, find the job you want to check for anomalies. +Haven't created a job yet? <>. +. From the **Actions** menu next to the job, select **Create alert rule**. +. Specify a name and optional tags for the rule. You can use these tags later to filter alerts. +. Verify that the correct job is selected and configure the alert details: ++ +[role="screenshot"] +image::images/anomaly-detection-alert.png[Anomaly detection alert settings ] +. For the result type: ++ +|=== +| Choose... | To generate an alert based on... + +| **Bucket** +| How unusual the anomaly was within the bucket of time + +| **Record** +| What individual anomalies are present in a time range + +| **Influencer** +| The most unusual entities in a time range +|=== +. Adjust the **Severity** to match the anomaly score that will trigger the action. +The anomaly score indicates the significance of a given anomaly compared to previous anomalies. +The default severity threshold is 75, which means every anomaly with an anomaly score of 75 or higher will trigger the associated action. +. (Optional) Turn on **Include interim results** to include results that are created by the anomaly detection job _before_ a bucket is finalized. These results might disappear after the bucket is fully processed. +Include interim results if you want to be notified earlier about a potential anomaly even if it might be a false positive. +. (Optional) Expand and change **Advanced settings**: ++ +|=== +| Setting | Description + +| **Lookback interval** +| The interval used to query previous anomalies during each condition check. Setting the lookback interval lower than the default value might result in missed anomalies. + +| **Number of latest buckets** +| The number of buckets to check to obtain the highest anomaly from all the anomalies that are found during the Lookback interval. An alert is created based on the anomaly with the highest anomaly score from the most anomalous bucket. +|=== +. (Optional) Under **Check the rule condition with an interval**, specify an interval, then click **Test** to check the rule condition with the interval specified. +The button is grayed out if the datafeed is not started. +To test the rule, start the data feed. +. (Optional) If you want to change how often the condition is evaluated, adjust the **Check every** setting. +. (Optional) Set up **Actions**. +. **Save** your rule. + +[NOTE] +==== +Anomaly detection rules are defined as part of a job. +Alerts generated by these rules do not appear on the **Alerts** page. +==== + +[discrete] +[[aiops-generate-anomaly-alerts-add-actions]] +== Add actions + +You can extend your rules with actions that interact with third-party systems, write to logs or indices, or send user notifications. You can add an action to a rule at any time. You can create rules without adding actions, and you can also define multiple actions for a single rule. + +To add actions to rules, you must first create a connector for that service (for example, an email or external incident management system), which you can then use for different rules, each with their own action frequency. + +.Connector types +[%collapsible] +===== +Connectors provide a central place to store connection information for services and integrations with third party systems. +The following connectors are available when defining actions for alerting rules: + +include::./alerting-connectors.asciidoc[] + +For more information on creating connectors, refer to https://www.elastic.co/docs/current/serverless/action-connectors[Connectors]. +===== + +.Action frequency +[%collapsible] +===== +After you select a connector, you must set the action frequency. You can choose to create a **Summary of alerts** on each check interval or on a custom interval. For example, you can send email notifications that summarize the new, ongoing, and recovered alerts every twelve hours. + +Alternatively, you can set the action frequency to **For each alert** and specify the conditions each alert must meet for the action to run. For example, you can send an email only when alert status changes to critical. + +[role="screenshot"] +image::images/alert-action-frequency.png[Configure when a rule is triggered] + +With the **Run when** menu you can choose if an action runs when the the anomaly score matched the condition or was recovered. For example, you can add a corresponding action for each state to ensure you are alerted when the anomaly score was matched and also when it recovers. + +[role="screenshot"] +image::images/alert-anomaly-action-frequency-recovered.png[Choose between anomaly score matched condition or recovered] +===== + +.Action variables +[%collapsible] +===== +Use the default notification message or customize it. +You can add more context to the message by clicking the Add variable icon image:images/icons/indexOpen.svg[Add variable] and selecting from a list of available variables. + +[role="screenshot"] +image::images/action-variables-popup.png[Action variables list] + +The following variables are specific to this rule type. +You can also specify {kibana-ref}/rule-action-variables.html[variables common to all rules]. + +`context.anomalyExplorerUrl`:: +URL to open in the Anomaly Explorer. + +`context.isInterim`:: +Indicate if top hits contain interim results. + +`context.jobIds`:: +List of job IDs that triggered the alert. + +`context.message`:: +Alert info message. + +`context.score`:: +Anomaly score at the time of the notification action. + +`context.timestamp`:: +The bucket timestamp of the anomaly. + +`context.timestampIso8601`:: +The bucket timestamp of the anomaly in ISO8601 format. + +`context.topInfluencers`:: +The list of top influencers. Properties include: ++ +`influencer_field_name`::: +The field name of the influencer. + +`influencer_field_value`::: +The entity that influenced, contributed to, or was to blame for the anomaly. + +`score`::: +The influencer score. A normalized score between 0-100 which shows the influencer’s overall contribution to the anomalies. + +`context.topRecords`:: +The list of top records. Properties include: ++ +`actual`::: +The actual value for the bucket. + +`by_field_value`::: +The value of the by field. + +`field_name`::: +Certain functions require a field to operate on, for example, `sum()`. For those functions, this value is the name of the field to be analyzed. + +`function`::: +The function in which the anomaly occurs, as specified in the detector configuration. For example, `max`. + +`over_field_name`::: +The field used to split the data. + +`partition_field_value`::: +The field used to segment the analysis. + +`score`::: +A normalized score between 0-100, which is based on the probability of the anomalousness of this record. + +`typical`::: +The typical value for the bucket, according to analytical modeling. + +===== + +[discrete] +[[aiops-generate-anomaly-alerts-edit-an-anomaly-detection-rule]] +== Edit an anomaly detection rule + +To edit an anomaly detection rule: + +. In your {observability} project, go to **AIOps** → **Anomaly detection**. +. Expand the job that uses the rule you want to edit. +. On the **Job settings** tab, under **Alert rules**, click the rule to edit it. diff --git a/docs/en/serverless/alerting/alerting-connectors.asciidoc b/docs/en/serverless/alerting/alerting-connectors.asciidoc new file mode 100644 index 0000000000..c157d7d1eb --- /dev/null +++ b/docs/en/serverless/alerting/alerting-connectors.asciidoc @@ -0,0 +1,26 @@ +* {kibana-ref}/cases-action-type.html[Cases] +* {kibana-ref}/d3security-action-type.html[D3 Security] +* {kibana-ref}/email-action-type.html[Email] +* {kibana-ref}/resilient-action-type.html[{ibm-r}] +* {kibana-ref}/index-action-type.html[Index] +* {kibana-ref}/jira-action-type.html[Jira] +* {kibana-ref}/teams-action-type.html[Microsoft Teams] +* {kibana-ref}/obs-ai-assistant-action-type.html[Observability AI Assistant] +* {kibana-ref}/opsgenie-action-type.html[{opsgenie}] +* {kibana-ref}/pagerduty-action-type.html[PagerDuty] +* {kibana-ref}/server-log-action-type.html[Server log] +* {kibana-ref}/servicenow-itom-action-type.html[{sn-itom}] +* {kibana-ref}/servicenow-action-type.html[{sn-itsm}] +* {kibana-ref}/servicenow-sir-action-type.html[{sn-sir}] +* {kibana-ref}/slack-action-type.html[Slack] +* {kibana-ref}/swimlane-action-type.html[{swimlane}] +* {kibana-ref}/torq-action-type.html[Torq] +* {kibana-ref}/webhook-action-type.html[{webhook}] +* {kibana-ref}/xmatters-action-type.html[xMatters] + +[NOTE] +==== +Some connector types are paid commercial features, while others are free. +For a comparison of the Elastic subscription levels, go to +https://www.elastic.co/subscriptions[the subscription page]. +==== diff --git a/docs/en/serverless/alerting/alerting.asciidoc b/docs/en/serverless/alerting/alerting.asciidoc new file mode 100644 index 0000000000..2a5d0534db --- /dev/null +++ b/docs/en/serverless/alerting/alerting.asciidoc @@ -0,0 +1,37 @@ +[[alerting]] += Alerting + +:description: Get alerts based on rules you define for detecting complex conditions in your applications and services. +:keywords: serverless, observability, overview, alerting + +preview:[] + +Alerting enables you to define _rules_, which detect complex conditions within different apps and trigger actions when those conditions are met. Alerting provides a set of built-in connectors and rules for you to use. This page describes all of these elements and how they operate together. + +[discrete] +[[alerting-important-concepts]] +== Important concepts + +Alerting works by running checks on a schedule to detect conditions defined by a rule. You can define rules at different levels (service, environment, transaction) or use custom KQL queries. When a condition is met, the rule tracks it as an _alert_ and responds by triggering one or more _actions_. + +Actions typically involve interaction with Elastic services or third-party integrations. https://www.elastic.co/docs/current/serverless/action-connectors[Connectors] enable actions to talk to these services and integrations. + +Once you've defined your rules, you can monitor any alerts triggered by these rules in real time, with detailed dashboards that help you quickly identify and troubleshoot any issues that may arise. You can also extend your alerts with notifications via services or third-party incident management systems. + +[discrete] +[[alerting-alerts-page]] +== Alerts page + +On the **Alerts** page, the Alerts table provides a snapshot of alerts occurring within the specified time frame. The table includes the alert status, when it was last updated, the reason for the alert, and more. + +[role="screenshot"] +image::images/observability-alerts-overview.png[Summary of Alerts on the {observability} overview page] + +You can filter this table by alert status or time period, customize the visible columns, and search for specific alerts (for example, alerts related to a specific service or environment) using KQL. Select **View alert detail** from the **More actions** menu image:images/icons/boxesHorizontal.svg[action menu], or click the Reason link for any alert to <> in detail, and you can then either **View in app** or **View rule details**. + +[discrete] +[[alerting-next-steps]] +== Next steps + +* <> +* <> diff --git a/docs/en/serverless/alerting/create-anomaly-alert-rule.asciidoc b/docs/en/serverless/alerting/create-anomaly-alert-rule.asciidoc new file mode 100644 index 0000000000..356ef2de8e --- /dev/null +++ b/docs/en/serverless/alerting/create-anomaly-alert-rule.asciidoc @@ -0,0 +1,114 @@ +[[create-anomaly-alert-rule]] += Create an APM anomaly rule + +:description: Get alerts when either the latency, throughput, or failed transaction rate of a service is abnormal. +:keywords: serverless, observability, how-to, alerting + +++++ +APM anomaly +++++ + +preview:[] + +:role: Editor +:goal: create anomaly rules +include::../partials/roles.asciidoc[] +:role!: + +:goal!: + +You can create an anomaly rule to alert you when either the latency, throughput, or failed transaction rate of a service is abnormal. Anomaly rules can be set at different levels: environment, service, and/or transaction type. Add actions to raise alerts via services or third-party integrations (for example, send an email or create a Jira issue). + +[role="screenshot"] +image::images/alerts-create-apm-anomaly.png[Create rule for APM anomaly alert] + +[TIP] +==== +These steps show how to use the **Alerts** UI. +You can also create an anomaly rule directly from any page within **Applications**. Click the **Alerts and rules** button, and select **Create anomaly rule**. When you create a rule this way, the **Name** and **Tags** fields will be prepopulated but you can still change these. +==== + +To create your anomaly rule: + +. In your {observability} project, go to **Alerts**. +. Select **Manage Rules** from the **Alerts** page, and select **Create rule**. +. Enter a **Name** for your rule, and any optional **Tags** for more granular reporting (leave blank if unsure). +. Select the **APM Anomaly** rule type. +. Select the appropriate **Service**, **Type**, and **Environment** (or leave **ALL** to include all options). +. Select the desired severity (critical, major, minor, warning) from **Has anomaly with severity**. +. Define the interval to check the rule (for example, check every 1 minute). +. (Optional) Set up **Actions**. +. **Save** your rule. + +[discrete] +[[create-anomaly-alert-rule-add-actions]] +== Add actions + +You can extend your rules with actions that interact with third-party systems, write to logs or indices, or send user notifications. You can add an action to a rule at any time. You can create rules without adding actions, and you can also define multiple actions for a single rule. + +To add actions to rules, you must first create a connector for that service (for example, an email or external incident management system), which you can then use for different rules, each with their own action frequency. + +.Connector types +[%collapsible] +===== +Connectors provide a central place to store connection information for services and integrations with third party systems. +The following connectors are available when defining actions for alerting rules: + +include::./alerting-connectors.asciidoc[] + +For more information on creating connectors, refer to https://www.elastic.co/docs/current/serverless/action-connectors[Connectors]. +===== + +.Action frequency +[%collapsible] +===== +After you select a connector, you must set the action frequency. You can choose to create a **Summary of alerts** on each check interval or on a custom interval. For example, you can send email notifications that summarize the new, ongoing, and recovered alerts every twelve hours. + +Alternatively, you can set the action frequency to **For each alert** and specify the conditions each alert must meet for the action to run. For example, you can send an email only when the alert status changes to critical. + +[role="screenshot"] +image::images/alert-action-frequency.png[Configure when a rule is triggered] + +With the **Run when** menu you can choose if an action runs when the threshold for an alert is reached, or when the alert is recovered. For example, you can add a corresponding action for each state to ensure you are alerted when the rule is triggered and also when it recovers. + +[role="screenshot"] +image::images/alert-apm-action-frequency-recovered.png[Choose between threshold met or recovered] +===== + +.Action variables +[%collapsible] +===== +Use the default notification message or customize it. +You can add more context to the message by clicking the Add variable icon image:images/icons/indexOpen.svg[Add variable] and selecting from a list of available variables. + +[role="screenshot"] +image::images/action-variables-popup.png[Action variables list] + +The following variables are specific to this rule type. +You can also specify {kibana-ref}/rule-action-variables.html[variables common to all rules]. + +`context.alertDetailsUrl`:: +Link to the alert troubleshooting view for further context and details. This will be an empty string if the `server.publicBaseUrl` is not configured. + +`context.environment`:: +The transaction type the alert is created for. + +`context.reason`:: +A concise description of the reason for the alert. + +`context.serviceName`:: +The service the alert is created for. + +`context.threshold`:: +Any trigger value above this value will cause the alert to fire. + +`context.transactionType`:: +The transaction type the alert is created for. + +`context.triggerValue`:: +The value that breached the threshold and triggered the alert. + +`context.viewInAppUrl`:: +Link to the alert source. + +===== diff --git a/docs/en/serverless/alerting/create-custom-threshold-alert-rule.asciidoc b/docs/en/serverless/alerting/create-custom-threshold-alert-rule.asciidoc new file mode 100644 index 0000000000..52862e7ad9 --- /dev/null +++ b/docs/en/serverless/alerting/create-custom-threshold-alert-rule.asciidoc @@ -0,0 +1,209 @@ +[[create-custom-threshold-alert-rule]] += Create a custom threshold rule + +:description: Get alerts when an Observability data type reach a given value. +:keywords: serverless, observability, how-to, alerting + +++++ +Custom threshold +++++ + +preview:[] + +:role: Editor +:goal: create a custom threshold rule +include::../partials/roles.asciidoc[] +:role!: + +:goal!: + +Create a custom threshold rule to trigger an alert when an {observability} data type reaches or exceeds a given value. + +. To access this page, from your project go to **Alerts**. +. Click **Manage Rules** -> **Create rule**. +. Under **Select rule type**, select **Custom threshold**. + +[role="screenshot"] +image::images/custom-threshold-rule.png[Rule details (custom threshold)] + +[discrete] +[[custom-threshold-scope]] +== Define rule data + +Specify the following settings to define the data the rule applies to: + +* **Select a data view:** Click the data view field to search for and select a data view that points to the indices or data streams that you're creating a rule for. You can also create a _new_ data view by clicking **Create a data view**. Refer to {kibana-ref}/data-views.html[Create a data view] for more on creating data views. +* **Define query filter (optional):** Use a query filter to narrow down the data that the rule applies to. For example, set a query filter to a specific host name using the query filter `host.name:host-1` to only apply the rule to that host. + +[discrete] +[[custom-threshold-rule-conditions]] +== Set rule conditions + +Set the conditions for the rule to detect using aggregations, an equation, and a threshold. + +[discrete] +[[custom-threshold-aggregation]] +=== Set aggregations + +Aggregations summarize your data to make it easier to analyze. +Set any of the following aggregation types to gather data to create your rule: +`Average`, `Max`, `Min`, `Cardinality`, `Count`, `Sum,` `Percentile`, or `Rate`. +For more information about these options, refer to <>. + +For example, to gather the total number of log documents with a log level of `warn`: + +. Set the **Aggregation** to **Count**, and set the **KQL Filter** to `log.level: "warn"`. +. Set the threshold to `IS ABOVE 100` to trigger an alert when the number of log documents with a log level of `warn` reaches 100. + +[discrete] +[[custom-threshold-equation]] +=== Set the equation and threshold + +Set an equation using your aggregations. Based on the results of your equation, set a threshold to define when to trigger an alert. The equations use basic math or boolean logic. Refer to the following examples for possible use cases. + +[discrete] +[[custom-threshold-math-equation]] +=== Basic math equation + +Add, subtract, multiply, or divide your aggregations to define conditions for alerting. + +**Example:** +Set an equation and threshold to trigger an alert when a metric is above a threshold. For this example, we'll use average CPU usage—the percentage of CPU time spent in states other than `idle` or `IOWait` normalized by the number of CPU cores—and trigger an alert when CPU usage is above a specific percentage. To do this, set the following aggregations, equation, and threshold: + +. Set the following aggregations: ++ +** **Aggregation A:** Average `system.cpu.user.pct` +** **Aggregation B:** Average `system.cpu.system.pct` +** **Aggregation C:** Max `system.cpu.cores`. +. Set the equation to `(A + B) / C * 100` +. Set the threshold to `IS ABOVE 95` to alert when CPU usage is above 95%. + +[discrete] +[[custom-threshold-boolean-equation]] +=== Boolean logic + +Use conditional operators and comparison operators with you aggregations to define conditions for alerting. + +**Example:** +Set an equation and threshold to trigger an alert when the number of stateful pods differs from the number of desired pods. For this example, we'll use `kubernetes.statefulset.ready` and `kubernetes.statefulset.desired`, and trigger an alert when their values differ. To do this, set the following aggregations, equation, and threshold: + +. Set the following aggregations: ++ +** **Aggregation A:** Sum `kubernetes.statefulset.ready` +** **Aggregation B:** Sum `kubernetes.statefulset.desired` +. Set the equation to `A == B ? 1 : 0`. If A and B are equal, the result is `1`. If they're not equal, the result is `0`. +. Set the threshold to `IS BELOW 1` to trigger an alert when the result is `0` and the field values do not match. + +[discrete] +[[custom-threshold-chart-preview]] +== Preview chart + +The preview chart provides a visualization of how many entries match your configuration. +The shaded area shows the threshold you've set. + +[discrete] +[[custom-threshold-group-by]] +== Group alerts by (optional) + +Set one or more **group alerts by** fields for custom threshold rules to perform a composite aggregation against the selected fields. +When any of these groups match the selected rule conditions, an alert is triggered _per group_. + +When you select multiple groupings, the group name is separated by commas. + +For example, if you group alerts by the `host.name` and `host.architecture` fields, and there are two hosts (`Host A` and `Host B`) and two architectures (`Architecture A` and `Architecture B`), the composite aggregation forms multiple groups. + +If the `Host A, Architecture A` group matches the rule conditions, but the `Host B, Architecture B` group doesn't, one alert is triggered for `Host A, Architecture A`. + +If you select one field—for example, `host.name`—and `Host A` matches the conditions but `Host B` doesn't, one alert is triggered for `Host A`. +If both groups match the conditions, alerts are triggered for both groups. + +When you select **Alert me if a group stops reporting data**, the rule is triggered if a group that previously reported metrics does not report them again over the expected time period. + +[discrete] +[[create-custom-threshold-alert-rule-add-actions]] +== Add actions + +You can extend your rules with actions that interact with third-party systems, write to logs or indices, or send user notifications. You can add an action to a rule at any time. You can create rules without adding actions, and you can also define multiple actions for a single rule. + +To add actions to rules, you must first create a connector for that service (for example, an email or external incident management system), which you can then use for different rules, each with their own action frequency. + +.Connector types +[%collapsible] +===== +Connectors provide a central place to store connection information for services and integrations with third party systems. +The following connectors are available when defining actions for alerting rules: + +include::./alerting-connectors.asciidoc[] + +For more information on creating connectors, refer to https://www.elastic.co/docs/current/serverless/action-connectors[Connectors]. +===== + +.Action frequency +[%collapsible] +===== +After you select a connector, you must set the action frequency. +You can choose to create a summary of alerts on each check interval or on a custom interval. +Alternatively, you can set the action frequency such that you choose how often the action runs (for example, +at each check interval, only when the alert status changes, or at a custom action interval). +In this case, you must also select the specific threshold condition that affects when actions run: `Alert`, `No Data`, or `Recovered`. + +[role="screenshot"] +image::images/custom-threshold-run-when.png[Configure when a rule is triggered] + +You can also further refine the conditions under which actions run by specifying that actions only run when they match a KQL query or when an alert occurs within a specific time frame: + +* **If alert matches query**: Enter a KQL query that defines field-value pairs or query conditions that must be met for notifications to send. The query only searches alert documents in the indices specified for the rule. +* **If alert is generated during timeframe**: Set timeframe details. Notifications are only sent if alerts are generated within the timeframe you define. + +[role="screenshot"] +image::images/logs-threshold-conditional-alert.png[Configure a conditional alert] +===== + +.Action variables +[%collapsible] +===== +Use the default notification message or customize it. +You can add more context to the message by clicking the Add variable icon image:images/icons/indexOpen.svg[Add variable] and selecting from a list of available variables. + +[role="screenshot"] +image::images/action-variables-popup.png[Action variables list] + +The following variables are specific to this rule type. +You can also specify {kibana-ref}/rule-action-variables.html[variables common to all rules]. + +`context.alertDetailsUrl`:: +Link to the alert troubleshooting view for further context and details. This will be an empty string if the `server.publicBaseUrl` is not configured. + +`context.cloud`:: +The cloud object defined by ECS if available in the source. + +`context.container`:: +The container object defined by ECS if available in the source. + +`context.group`:: +The object containing groups that are reporting data. + +`context.host`:: +The host object defined by ECS if available in the source. + +`context.labels`:: +List of labels associated with the entity where this alert triggered. + +`context.orchestrator`:: +The orchestrator object defined by ECS if available in the source. + +`context.reason`:: +A concise description of the reason for the alert. + +`context.tags`:: +List of tags associated with the entity where this alert triggered. + +`context.timestamp`:: +A timestamp of when the alert was detected. + +`context.value`:: +List of the condition values. + +`context.viewInAppUrl`:: +Link to the alert source. +===== diff --git a/docs/en/serverless/alerting/create-elasticsearch-query-alert-rule.asciidoc b/docs/en/serverless/alerting/create-elasticsearch-query-alert-rule.asciidoc new file mode 100644 index 0000000000..f3f2d38726 --- /dev/null +++ b/docs/en/serverless/alerting/create-elasticsearch-query-alert-rule.asciidoc @@ -0,0 +1,292 @@ +[[create-elasticsearch-query-rule]] += Create an Elasticsearch query rule + +:description: Get alerts when matches are found during the latest query run. +:keywords: serverless, observability, how-to, alerting + +++++ +Elasticsearch query +++++ + +preview:[] + +:role: Editor +:goal: create Elasticsearch query rules +include::../partials/roles.asciidoc[] +:role!: + +:goal!: + +The {es} query rule type runs a user-configured query, compares the number of +matches to a configured threshold, and schedules actions to run when the +threshold condition is met. + +. To access this page, from your project go to **Alerts**. +. Click **Manage Rules** → **Create rule**. +. Under **Select rule type**, select **{es} query**. + +An {es} query rule can be defined using {es} Query Domain Specific Language (DSL), {es} Query Language (ES|QL), {kib} Query Language (KQL), or Lucene. + +[discrete] +[[create-elasticsearch-query-rule-define-the-conditions]] +== Define the conditions + +When you create an {es} query rule, your choice of query type affects the information you must provide. +For example: + +[role="screenshot"] +image::images/alerting-rule-types-es-query-conditions.png[Define the condition to detect] + +// NOTE: This is an autogenerated screenshot. Do not edit it directly. + +. Define your query ++ +If you use {ref}/query-dsl.html[query DSL], you must select an index and time field then provide your query. +Only the `query`, `fields`, `_source` and `runtime_mappings` fields are used, other DSL fields are not considered. +For example: ++ +[source,sh] +---- +{ + "query":{ + "match_all" : {} + } +} +---- ++ +If you use {kibana-ref}/kuery-query.html[KQL] or {kibana-ref}/lucene-query.html[Lucene], you must specify a data view then define a text-based query. +For example, `http.request.referrer: "https://example.com"`. ++ +preview:[]If you use {ref}/esql.html[ES|QL], you must provide a source command followed by an optional series of processing commands, separated by pipe characters (|). +For example: ++ +[source,sh] +---- +FROM kibana_sample_data_logs +| STATS total_bytes = SUM(bytes) BY host +| WHERE total_bytes > 200000 +| SORT total_bytes DESC +| LIMIT 10 +---- +. If you use query DSL, KQL, or Lucene, set the group and theshold. ++ +When:: +Specify how to calculate the value that is compared to the threshold. The value is calculated by aggregating a numeric field within the time window. The aggregation options are: `count`, `average`, `sum`, `min`, and `max`. When using `count` the document count is used and an aggregation field is not necessary. ++ +Over or Grouped Over:: +Specify whether the aggregation is applied over all documents or split into groups using up to four grouping fields. +If you choose to use grouping, it's a {ref}/search-aggregations-bucket-terms-aggregation.html[terms] or {ref}/search-aggregations-bucket-multi-terms-aggregation.html[multi terms aggregation]; an alert will be created for each unique set of values when it meets the condition. +To limit the number of alerts on high cardinality fields, you must specify the number of groups to check against the threshold. +Only the top groups are checked. ++ +Threshold:: +Defines a threshold value and a comparison operator (`is above`, +`is above or equals`, `is below`, `is below or equals`, or `is between`). The value +calculated by the aggregation is compared to this threshold. +. Set the time window, which defines how far back to search for documents. +. If you use query DSL, KQL, or Lucene, set the number of documents to send to the configured actions when the threshold condition is met. +. If you use query DSL, KQL, or Lucene, choose whether to avoid alert duplication by excluding matches from the previous run. +This option is not available when you use a grouping field. +. Set the check interval, which defines how often to evaluate the rule conditions. +Generally this value should be set to a value that is smaller than the time window, to avoid gaps in +detection. + +[discrete] +[[create-elasticsearch-query-rule-test-your-query]] +== Test your query + +Use the **Test query** feature to verify that your query is valid. + +If you use query DSL, KQL, or Lucene, the query runs against the selected indices using the configured time window. +The number of documents that match the query is displayed. +For example: + +[role="screenshot"] +image::images/alerting-rule-types-es-query-valid.png[Test {es} query returns number of matches when valid] + +// NOTE: This is an autogenerated screenshot. Do not edit it directly. + +preview:[] If you use an ES|QL query, a table is displayed. For example: + +[role="screenshot"] +image::images/alerting-rule-types-esql-query-valid.png[Test ES|QL query returns a table when valid] + +If the query is not valid, an error occurs. + +[discrete] +[[create-elasticsearch-query-rule-add-actions]] +== Add actions + +// TODO: Decide whether to use boiler plate text, or the text from the source docs for this rule. + +You can optionally send notifications when the rule conditions are met and when they are no longer met. +In particular, this rule type supports: + +* alert summaries +* actions that run when the query is matched +* recovery actions that run when the rule conditions are no longer met + +For each action, you must choose a connector, which provides connection information for a service or third party integration. + +.Connector types +[%collapsible] +===== +Connectors provide a central place to store connection information for services and integrations with third party systems. +The following connectors are available when defining actions for alerting rules: + +include::./alerting-connectors.asciidoc[] + +For more information on creating connectors, refer to https://www.elastic.co/docs/current/serverless/action-connectors[Connectors]. +===== + +.Action frequency +[%collapsible] +===== +After you select a connector, you must set the action frequency. You can choose to create a **Summary of alerts** on each check interval or on a custom interval. For example, you can send email notifications that summarize the new, ongoing, and recovered alerts at a custom interval: + +[role="screenshot"] +image::images/alerting-es-query-rule-action-summary.png[UI for defining alert summary action in an {es} query rule] + +// NOTE: This is an autogenerated screenshot. Do not edit it directly. + +Alternatively, you can set the action frequency to **For each alert** and specify the conditions each alert must meet for the action to run. + +With the **Run when** menu you can choose how often the action runs (at each check interval, only when the alert status changes, or at a custom action interval). +You must also choose an action group, which indicates whether the action runs when the query is matched or when the alert is recovered. +Each connector supports a specific set of actions for each action group. +For example: + +[role="screenshot"] +image::images/alerting-es-query-rule-action-query-matched.png[UI for defining a recovery action] + +// NOTE: This is an autogenerated screenshot. Do not edit it directly. + +You can further refine the conditions under which actions run by specifying that actions only run when they match a KQL query or when an alert occurs within a specific time frame. +===== + +.Action variables +[%collapsible] +===== +Use the default notification message or customize it. +You can add more context to the message by clicking the Add variable icon image:images/icons/indexOpen.svg[Add variable] and selecting from a list of available variables. + +[role="screenshot"] +image::images/action-variables-popup.png[Action variables list] + +The following variables are specific to this rule type. +You can also specify {kibana-ref}/rule-action-variables.html[variables common to all rules]. + +`context.conditions`:: +A string that describes the threshold condition. Example: +`count greater than 4`. + +`context.date`:: +The date, in ISO format, that the rule met the condition. +Example: `2022-02-03T20:29:27.732Z`. + +`context.hits`:: +The most recent documents that matched the query. Using the +https://mustache.github.io/[Mustache] template array syntax, you can iterate +over these hits to get values from the {es} documents into your actions. ++ +For example, the message in an email connector action might contain: ++ +[source] +---- +Elasticsearch query rule '{{rule.name}}' is active: + +{{#context.hits}} +Document with {{_id}} and hostname {{_source.host.name}} has +{{_source.system.memory.actual.free}} bytes of memory free +{{/context.hits}} +---- ++ +The documents returned by `context.hits` include the {ref}/mapping-source-field.html[`_source`] field. +If the {es} query search API's {ref}/search-fields.html#search-fields-param[`fields`] parameter is used, documents will also return the `fields` field, +which can be used to access any runtime fields defined by the {ref}/runtime-search-request.html[`runtime_mappings`] parameter. +For example: ++ +// NOTCONSOLE ++ +[source] +---- +{{#context.hits}} +timestamp: {{_source.@timestamp}} +day of the week: {{fields.day_of_week}} +{{/context.hits}} +---- ++ +As the {ref}/search-fields.html#search-fields-response[`fields`] response always returns an array of values for each field, +the https://mustache.github.io/[Mustache] template array syntax is used to iterate over these values in your actions. +For example: ++ +[source] +---- +{{#context.hits}} +Labels: +{{#fields.labels}} +- {{.}} +{{/fields.labels}} +{{/context.hits}} +---- ++ +// NOTCONSOLE + +`context.link`:: +Link to Discover and show the records that triggered the alert. + +`context.message`:: +A message for the alert. Example: +`rule 'my es-query' is active:` +`- Value: 2` +`- Conditions Met: Number of matching documents is greater than 1 over 5m` +`- Timestamp: 2022-02-03T20:29:27.732Z` + +`context.title`:: +A title for the alert. Example: +`rule term match alert query matched`. + +`context.value`:: +The value that met the threshold condition. + +===== + +[discrete] +[[create-elasticsearch-query-rule-handling-multiple-matches-of-the-same-document]] +== Handling multiple matches of the same document + +By default, **Exclude matches from previous run** is turned on and the rule checks +for duplication of document matches across multiple runs. If you configure the +rule with a schedule interval smaller than the time window and a document +matches a query in multiple runs, it is alerted on only once. + +The rule uses the timestamp of the matches to avoid alerting on the same match +multiple times. The timestamp of the latest match is used for evaluating the +rule conditions when the rule runs. Only matches between the latest timestamp +from the previous run and the current run are considered. + +Suppose you have a rule configured to run every minute. The rule uses a time +window of 1 hour and checks if there are more than 99 matches for the query. The +{es} query rule type does the following: + +// [cols="3*<"] + +|=== +| | | + +| `Run 1 (0:00)` +| Rule finds 113 matches in the last hour: `113 > 99` +| Rule is active and user is alerted. + +| `Run 2 (0:01)` +| Rule finds 127 matches in the last hour. 105 of the matches are duplicates that were already alerted on previously, so you actually have 22 matches: `22 !> 99` +| No alert. + +| `Run 3 (0:02)` +| Rule finds 159 matches in the last hour. 88 of the matches are duplicates that were already alerted on previously, so you actually have 71 matches: `71 !> 99` +| No alert. + +| `Run 4 (0:03)` +| Rule finds 190 matches in the last hour. 71 of them are duplicates that were already alerted on previously, so you actually have 119 matches: `119 > 99` +| Rule is active and user is alerted. +|=== diff --git a/docs/en/serverless/alerting/create-elasticsearch-query-alert-rule.mdx b/docs/en/serverless/alerting/create-elasticsearch-query-alert-rule.mdx index 69fe4b943f..1819458c01 100644 --- a/docs/en/serverless/alerting/create-elasticsearch-query-alert-rule.mdx +++ b/docs/en/serverless/alerting/create-elasticsearch-query-alert-rule.mdx @@ -66,6 +66,7 @@ For example: When : Specify how to calculate the value that is compared to the threshold. The value is calculated by aggregating a numeric field within the time window. The aggregation options are: `count`, `average`, `sum`, `min`, and `max`. When using `count` the document count is used and an aggregation field is not necessary. + Over or Grouped Over : Specify whether the aggregation is applied over all documents or split into groups using up to four grouping fields. If you choose to use grouping, it's a [terms](((ref))/search-aggregations-bucket-terms-aggregation.html) or [multi terms aggregation](((ref))/search-aggregations-bucket-multi-terms-aggregation.html); an alert will be created for each unique set of values when it meets the condition. @@ -194,10 +195,9 @@ You can also specify [variables common to all rules](((kibana-ref))/rule-action- ``` {{#context.hits}} timestamp: {{_source.@timestamp}} - day of the week: {{fields.day_of_week}} [^1] + day of the week: {{fields.day_of_week}} {{/context.hits}} ``` - [^1]: The `fields` parameter here is used to access the `day_of_week` runtime field. As the [`fields`](((ref))/search-fields.html#search-fields-response) response always returns an array of values for each field, the [Mustache](https://mustache.github.io/) template array syntax is used to iterate over these values in your actions. diff --git a/docs/en/serverless/alerting/create-error-count-threshold-alert-rule.asciidoc b/docs/en/serverless/alerting/create-error-count-threshold-alert-rule.asciidoc new file mode 100644 index 0000000000..16db8902bb --- /dev/null +++ b/docs/en/serverless/alerting/create-error-count-threshold-alert-rule.asciidoc @@ -0,0 +1,163 @@ +[[create-error-count-threshold-alert-rule]] += Create an error count threshold rule + +:description: Get alerts when the number of errors in a service exceeds a defined threshold. +:keywords: serverless, observability, how-to, alerting + +++++ +Error count threshold +++++ + +preview:[] + +:role: Editor +:goal: create error count threshold rules +include::../partials/roles.asciidoc[] +:role!: + +:goal!: + +Create an error count threshold rule to alert you when the number of errors in a service exceeds a defined threshold. Threshold rules can be set at different levels: environment, service, transaction type, and/or transaction name. + +[role="screenshot"] +image::images/alerts-create-rule-error-count.png[Create rule for error count threshold alert] + +[TIP] +==== +These steps show how to use the **Alerts** UI. +You can also create an error count threshold rule directly from any page within **Applications**. Click the **Alerts and rules** button, and select **Create error count rule**. When you create a rule this way, the **Name** and **Tags** fields will be prepopulated but you can still change these. +==== + +To create your error count threshold rule: + +. In your {observability} project, go to **Alerts**. +. Select **Manage Rules** from the **Alerts** page, and select **Create rule**. +. Enter a **Name** for your rule, and any optional **Tags** for more granular reporting (leave blank if unsure). +. Select the **Error count threshold** rule type from the APM use case. +. Select the appropriate **Service**, **Environment**, and **Error Grouping Key** (or leave **ALL** to include all options). Alternatively, you can select **Use KQL Filter** and enter a KQL expression to limit the scope of your rule. +. Enter the error threshold in **Is Above** (defaults to 25 errors). +. Define the period to be assessed in **For the last** (defaults to last 5 minutes). +. Choose how to **Group alerts by**. Every unique value will create an alert. +. Define the interval to check the rule (for example, check every 1 minute). +. (Optional) Set up **Actions**. +. **Save** your rule. + +[discrete] +[[create-error-count-threshold-alert-rule-add-actions]] +== Add actions + +You can extend your rules with actions that interact with third-party systems, write to logs or indices, or send user notifications. You can add an action to a rule at any time. You can create rules without adding actions, and you can also define multiple actions for a single rule. + +To add actions to rules, you must first create a connector for that service (for example, an email or external incident management system), which you can then use for different rules, each with their own action frequency. + +.Connector types +[%collapsible] +===== +Connectors provide a central place to store connection information for services and integrations with third party systems. +The following connectors are available when defining actions for alerting rules: + +include::./alerting-connectors.asciidoc[] + +For more information on creating connectors, refer to https://www.elastic.co/docs/current/serverless/action-connectors[Connectors]. +===== + +.Action frequency +[%collapsible] +===== +After you select a connector, you must set the action frequency. You can choose to create a **Summary of alerts** on each check interval or on a custom interval. For example, you can send email notifications that summarize the new, ongoing, and recovered alerts every twelve hours. + +Alternatively, you can set the action frequency to **For each alert** and specify the conditions each alert must meet for the action to run. For example, you can send an email only when the alert status changes to critical. + +[role="screenshot"] +image::images/alert-action-frequency.png[Configure when a rule is triggered] + +With the **Run when** menu you can choose if an action runs when the threshold for an alert is reached, or when the alert is recovered. For example, you can add a corresponding action for each state to ensure you are alerted when the rule is triggered and also when it recovers. + +[role="screenshot"] +image::images/alert-apm-action-frequency-recovered.png[Choose between threshold met or recovered] +===== + +.Action variables +[%collapsible] +===== +Use the default notification message or customize it. +You can add more context to the message by clicking the Add variable icon image:images/icons/indexOpen.svg[Add variable] and selecting from a list of available variables. + +[role="screenshot"] +image::images/action-variables-popup.png[Action variables list] + +The following variables are specific to this rule type. +You can also specify {kibana-ref}/rule-action-variables.html[variables common to all rules]. + +`context.alertDetailsUrl`:: +Link to the alert troubleshooting view for further context and details. This will be an empty string if the `server.publicBaseUrl` is not configured. + +`context.environment`:: +The transaction type the alert is created for. + +`context.errorGroupingKey`:: +The error grouping key the alert is created for. + +`context.errorGroupingName`:: +The error grouping name the alert is created for. + +`context.interval`:: +The length and unit of time period where the alert conditions were met. + +`context.reason`:: +A concise description of the reason for the alert. + +`context.serviceName`:: +The service the alert is created for. + +`context.threshold`:: +Any trigger value above this value will cause the alert to fire. + +`context.transactionName`:: +The transaction name the alert is created for. + +`context.triggerValue`:: +The value that breached the threshold and triggered the alert. + +`context.viewInAppUrl`:: +Link to the alert source. + +===== + +[discrete] +[[create-error-count-threshold-example]] +== Example + +The error count threshold alert triggers when the number of errors in a service exceeds a defined threshold. Because some errors are more important than others, this guide will focus a specific error group ID. + +Before continuing, identify the service name, environment name, and error group ID that you’d like to create an error count threshold rule for. + +// The easiest way to find an error group ID is to select the service that you’re interested in and navigating to the Errors tab. // is there a Serverless equivalent? + +This guide will create an alert for an error group ID based on the following criteria: + +* Service: `{your_service.name}` +* Environment: `{your_service.environment}` +* Error Grouping Key: `{your_error.ID}` +* Error count is above 25 errors for the last five minutes +* Group alerts by `service.name` and `service.environment` +* Check every 1 minute +* Send the alert via email to the site reliability team + +From any page in **Applications**, select **Alerts and rules** → **Create threshold rule** → **Error count rule**. Change the name of the alert (if you wish), but do not edit the tags. + +Based on the criteria above, define the following rule details: + +* **Service**: `{your_service.name}` +* **Environment**: `{your_service.environment}` +* **Error Grouping Key**: `{your_error.ID}` +* **Is above:** `25 errors` +* **For the last:** `5 minutes` +* **Group alerts by:** `service.name` `service.environment` +* **Check every:** `1 minute` + +Next, select the **Email** connector and click **Create a connector**. Fill out the required details: sender, host, port, etc., and select **Save**. + +A default message is provided as a starting point for your alert. You can use the Mustache template syntax (`{{variable}}`) to pass additional alert values at the time a condition is detected to an action. A list of available variables can be accessed by clicking the Add variable icon image:images/icons/indexOpen.svg[Add variable]. + +Select **Save**. The alert has been created and is now active! diff --git a/docs/en/serverless/alerting/create-failed-transaction-rate-threshold-alert-rule.asciidoc b/docs/en/serverless/alerting/create-failed-transaction-rate-threshold-alert-rule.asciidoc new file mode 100644 index 0000000000..6dbcc418e0 --- /dev/null +++ b/docs/en/serverless/alerting/create-failed-transaction-rate-threshold-alert-rule.asciidoc @@ -0,0 +1,158 @@ +[[create-failed-transaction-rate-threshold-alert-rule]] += Create a failed transaction rate threshold rule + +:description: Get alerts when the rate of transaction errors in a service exceeds a defined threshold. +:keywords: serverless, observability, how-to, alerting + +++++ +Failed transaction rate threshold +++++ + +preview:[] + +:role: Editor +:goal: create failed transaction rate threshold rules +include::../partials/roles.asciidoc[] +:role!: + +:goal!: + +You can create a failed transaction rate threshold rule to alert you when the rate of transaction errors in a service exceeds a defined threshold. Threshold rules can be set at different levels: environment, service, transaction type, and/or transaction name. Add actions to raise alerts via services or third-party integrations e.g. mail, Slack, Jira. + +[role="screenshot"] +image::images/alerts-create-rule-failed-transaction-rate.png[Create rule for failed transaction rate threshold alert] + +[TIP] +==== +These steps show how to use the **Alerts** UI. +You can also create a failed transaction rate threshold rule directly from any page within **Applications**. Click the **Alerts and rules** button, and select **Create threshold rule** and then **Failed transaction rate**. When you create a rule this way, the **Name** and **Tags** fields will be prepopulated but you can still change these. +==== + +To create your failed transaction rate threshold rule: + +. In your {observability} project, go to **Alerts**. +. Select **Manage Rules** from the **Alerts** page, and select **Create rule**. +. Enter a **Name** for your rule, and any optional **Tags** for more granular reporting (leave blank if unsure). +. Select the **Failed transaction rate threshold** rule type from the APM use case. +. Select the appropriate **Service**, **Type**, **Environment** and **Name** (or leave **ALL** to include all options). Alternatively, you can select **Use KQL Filter** and enter a KQL expression to limit the scope of your rule. +. Enter a fail rate in the **Is Above** (defaults to 30%). +. Define the period to be assessed in **For the last** (defaults to last 5 minutes). +. Choose how to **Group alerts by**. Every unique value will create an alert. +. Define the interval to check the rule (for example, check every 1 minute). +. (Optional) Set up **Actions**. +. **Save** your rule. + +[discrete] +[[create-failed-transaction-rate-threshold-alert-rule-add-actions]] +== Add actions + +You can extend your rules with actions that interact with third-party systems, write to logs or indices, or send user notifications. You can add an action to a rule at any time. You can create rules without adding actions, and you can also define multiple actions for a single rule. + +To add actions to rules, you must first create a connector for that service (for example, an email or external incident management system), which you can then use for different rules, each with their own action frequency. + +.Connector types +[%collapsible] +===== +Connectors provide a central place to store connection information for services and integrations with third party systems. +The following connectors are available when defining actions for alerting rules: + +include::./alerting-connectors.asciidoc[] + +For more information on creating connectors, refer to https://www.elastic.co/docs/current/serverless/action-connectors[Connectors]. +===== + +.Action frequency +[%collapsible] +===== +After you select a connector, you must set the action frequency. You can choose to create a **Summary of alerts** on each check interval or on a custom interval. For example, you can send email notifications that summarize the new, ongoing, and recovered alerts every twelve hours. + +Alternatively, you can set the action frequency to **For each alert** and specify the conditions each alert must meet for the action to run. For example, you can send an email only when the alert status changes to critical. + +[role="screenshot"] +image::images/alert-action-frequency.png[Configure when a rule is triggered] + +With the **Run when** menu you can choose if an action runs when the threshold for an alert is reached, or when the alert is recovered. For example, you can add a corresponding action for each state to ensure you are alerted when the rule is triggered and also when it recovers. + +[role="screenshot"] +image::images/alert-apm-action-frequency-recovered.png[Choose between threshold met or recovered] +===== + +.Action variables +[%collapsible] +===== +Use the default notification message or customize it. +You can add more context to the message by clicking the Add variable icon image:images/icons/indexOpen.svg[Add variable] and selecting from a list of available variables. + +[role="screenshot"] +image::images/action-variables-popup.png[Action variables list] + +The following variables are specific to this rule type. +You can also specify {kibana-ref}/rule-action-variables.html[variables common to all rules]. + +`context.alertDetailsUrl`:: +Link to the alert troubleshooting view for further context and details. This will be an empty string if the `server.publicBaseUrl` is not configured. + +`context.environment`:: +The transaction type the alert is created for. + +`context.interval`:: +The length and unit of time period where the alert conditions were met. + +`context.reason`:: +A concise description of the reason for the alert. + +`context.serviceName`:: +The service the alert is created for. + +`context.threshold`:: +Any trigger value above this value will cause the alert to fire. + +`context.transactionName`:: +The transaction name the alert is created for. + +`context.transactionType`:: +The transaction type the alert is created for. + +`context.triggerValue`:: +The value that breached the threshold and triggered the alert. + +`context.viewInAppUrl`:: +Link to the alert source. + +===== + +[discrete] +[[create-failed-transaction-rate-threshold-example]] +== Example + +The failed transaction rate threshold alert triggers when the number of transaction errors in a service exceeds a defined threshold. + +Before continuing, identify the service name, environment name, and transaction type that you’d like to create a failed transaction rate threshold rule for. + +This guide will create an alert for an error group ID based on the following criteria: + +* Service: `{your_service.name}` +* Transaction: `{your_transaction.name}` +* Environment: `{your_service.environment}` +* Error rate is above 30% for the last five minutes +* Group alerts by `service.name` and `service.environment` +* Check every 1 minute +* Send the alert via email to the site reliability team + +From any page in **Applications**, select **Alerts and rules** → **Create threshold rule** → **Failed transaction rate**. Change the name of the alert (if you wish), but do not edit the tags. + +Based on the criteria above, define the following rule details: + +* **Service**: `{your_service.name}` +* **Type**: `{your_transaction.name}` +* **Environment**: `{your_service.environment}` +* **Is above:** `30%` +* **For the last:** `5 minutes` +* **Group alerts by:** `service.name` `service.environment` +* **Check every:** `1 minute` + +Next, select the **Email** connector and click **Create a connector**. Fill out the required details: sender, host, port, etc., and select **Save**. + +A default message is provided as a starting point for your alert. You can use the Mustache template syntax (`{{variable}}`) to pass additional alert values at the time a condition is detected to an action. A list of available variables can be accessed by clicking the Add variable icon image:images/icons/indexOpen.svg[Add variable]. + +Select **Save**. The alert has been created and is now active! diff --git a/docs/en/serverless/alerting/create-inventory-threshold-alert-rule.asciidoc b/docs/en/serverless/alerting/create-inventory-threshold-alert-rule.asciidoc new file mode 100644 index 0000000000..ae3671a988 --- /dev/null +++ b/docs/en/serverless/alerting/create-inventory-threshold-alert-rule.asciidoc @@ -0,0 +1,177 @@ +[[create-inventory-threshold-alert-rule]] += Create an inventory rule + +:description: Get alerts when the infrastructure inventory exceeds a defined threshold. +:keywords: serverless, observability, how-to, alerting + +++++ +Inventory +++++ + +preview:[] + +:role: Editor +:goal: create inventory threshold rules +include::../partials/roles.asciidoc[] +:role!: + +:goal!: + +Based on the resources listed on the **Inventory** page within the {infrastructure-app}, +you can create a threshold rule to notify you when a metric has reached or exceeded a value for a specific +resource or a group of resources within your infrastructure. + +Additionally, each rule can be defined using multiple +conditions that combine metrics and thresholds to create precise notifications and reduce false positives. + +. To access this page, go to **{observability}** -> **Infrastructure**. +. On the **Inventory** page or the **Metrics Explorer** page, click **Alerts and rules** -> **Infrastructure**. +. Select **Create inventory rule**. + +[TIP] +==== +When you select **Create inventory alert**, the parameters you configured on the **Inventory** page will automatically +populate the rule. You can use the Inventory first to view which nodes in your infrastructure you'd +like to be notified about and then quickly create a rule in just a few clicks. +==== + +[discrete] +[[inventory-conditions]] +== Inventory conditions + +Conditions for each rule can be applied to specific metrics relating to the inventory type you select. +You can choose the aggregation type, the metric, and by including a warning threshold value, you can be +alerted on multiple threshold values based on severity scores. When creating the rule, you can still get +notified if no data is returned for the specific metric or if the rule fails to query {es}. + +In this example, Kubernetes Pods is the selected inventory type. The conditions state that you will receive +a critical alert for any pods within the `ingress-nginx` namespace with a memory usage of 95% or above +and a warning alert if memory usage is 90% or above. +The chart shows the results of applying the rule to the last 20 minutes of data. +Note that the chart time range is 20 times the value of the look-back window specified in the `FOR THE LAST` field. + +[role="screenshot"] +image::images/inventory-alert.png[Inventory rule] + +[discrete] +[[action-types-infrastructure]] +== Add actions + +You can extend your rules with actions that interact with third-party systems, write to logs or indices, or send user notifications. You can add an action to a rule at any time. You can create rules without adding actions, and you can also define multiple actions for a single rule. + +To add actions to rules, you must first create a connector for that service (for example, an email or external incident management system), which you can then use for different rules, each with their own action frequency. + +.Connector types +[%collapsible] +===== +Connectors provide a central place to store connection information for services and integrations with third party systems. +The following connectors are available when defining actions for alerting rules: + +include::./alerting-connectors.asciidoc[] + +For more information on creating connectors, refer to https://www.elastic.co/docs/current/serverless/action-connectors[Connectors]. +===== + +.Action frequency +[%collapsible] +===== +After you select a connector, you must set the action frequency. You can choose to create a summary of alerts on each check interval or on a custom interval. For example, send email notifications that summarize the new, ongoing, and recovered alerts each hour: + +[role="screenshot"] +image::images/action-alert-summary.png[Action types] + +// NOTE: This is an autogenerated screenshot. Do not edit it directly. + +Alternatively, you can set the action frequency such that you choose how often the action runs (for example, at each check interval, only when the alert status changes, or at a custom action interval). In this case, you define precisely when the alert is triggered by selecting a specific +threshold condition: `Alert`, `Warning`, or `Recovered` (a value that was once above a threshold has now dropped below it). + +[role="screenshot"] +image::images/inventory-threshold-run-when-selection.png[Configure when an alert is triggered] + +// NOTE: This is an autogenerated screenshot. Do not edit it directly. + +You can also further refine the conditions under which actions run by specifying that actions only run when they match a KQL query or when an alert occurs within a specific time frame: + +* **If alert matches query**: Enter a KQL query that defines field-value pairs or query conditions that must be met for notifications to send. The query only searches alert documents in the indices specified for the rule. +* **If alert is generated during timeframe**: Set timeframe details. Notifications are only sent if alerts are generated within the timeframe you define. + +[role="screenshot"] +image::images/conditional-alerts.png[Configure a conditional alert] +===== + +.Action variables +[%collapsible] +===== +Use the default notification message or customize it. +You can add more context to the message by clicking the Add variable icon image:images/icons/indexOpen.svg[Add variable] and selecting from a list of available variables. + +[role="screenshot"] +image::images/action-variables-popup.png[Action variables list] + +The following variables are specific to this rule type. +You can also specify {kibana-ref}/rule-action-variables.html[variables common to all rules]. + +`context.alertDetailsUrl`:: +Link to the alert troubleshooting view for further context and details. This will be an empty string if the `server.publicBaseUrl` is not configured. + +`context.alertState`:: +Current state of the alert. + +`context.cloud`:: +The cloud object defined by ECS if available in the source. + +`context.container`:: +The container object defined by ECS if available in the source. + +`context.group`:: +Name of the group reporting data. + +`context.host`:: +The host object defined by ECS if available in the source. + +`context.labels`:: +List of labels associated with the entity where this alert triggered. + +`context.metric`:: +The metric name in the specified condition. Usage: (`ctx.metric.condition0`, `ctx.metric.condition1`, and so on). + +`context.orchestrator`:: +The orchestrator object defined by ECS if available in the source. + +`context.originalAlertState`:: +The state of the alert before it recovered. This is only available in the recovery context. + +`context.originalAlertStateWasALERT`:: +Boolean value of the state of the alert before it recovered. This can be used for template conditions. This is only available in the recovery context. + +`context.originalAlertStateWasWARNING`:: +Boolean value of the state of the alert before it recovered. This can be used for template conditions. This is only available in the recovery context. + +`context.reason`:: +A concise description of the reason for the alert. + +`context.tags`:: +List of tags associated with the entity where this alert triggered. + +`context.threshold`:: +The threshold value of the metric for the specified condition. Usage: (`ctx.threshold.condition0`, `ctx.threshold.condition1`, and so on) + +`context.timestamp`:: +A timestamp of when the alert was detected. + +`context.value`:: +The value of the metric in the specified condition. Usage: (`ctx.value.condition0`, `ctx.value.condition1`, and so on). + +`context.viewInAppUrl`:: +Link to the alert source. + +===== + +[discrete] +[[infra-alert-settings]] +== Settings + +With infrastructure threshold rules, it's not possible to set an explicit index pattern as part of the configuration. The index pattern +is instead inferred from **Metrics indices** on the <> page of the {infrastructure-app}. + +With each execution of the rule check, the **Metrics indices** setting is checked, but it is not stored when the rule is created. diff --git a/docs/en/serverless/alerting/create-latency-threshold-alert-rule.asciidoc b/docs/en/serverless/alerting/create-latency-threshold-alert-rule.asciidoc new file mode 100644 index 0000000000..b406938267 --- /dev/null +++ b/docs/en/serverless/alerting/create-latency-threshold-alert-rule.asciidoc @@ -0,0 +1,162 @@ +[[create-latency-threshold-alert-rule]] += Create a latency threshold rule + +:description: Get alerts when the latency of a specific transaction type in a service exceeds a defined threshold. +:keywords: serverless, observability, how-to, alerting + +++++ +Latency threshold +++++ + +preview:[] + +:role: Editor +:goal: create latency threshold rules +include::../partials/roles.asciidoc[] +:role!: + +:goal!: + +You can create a latency threshold rule to alert you when the latency of a specific transaction type in a service exceeds a defined threshold. Threshold rules can be set at different levels: environment, service, transaction type, and/or transaction name. Add actions to raise alerts via services or third-party integrations e.g. mail, Slack, Jira. + +[role="screenshot"] +image::images/alerts-create-rule-apm-latency-threshold.png[Create rule for APM latency threshold alert] + +[TIP] +==== +These steps show how to use the **Alerts** UI. +You can also create a latency threshold rule directly from any page within **Applications**. Click the **Alerts and rules** button, and select **Create threshold rule** and then **Latency**. When you create a rule this way, the **Name** and **Tags** fields will be prepopulated but you can still change these. +==== + +To create your latency threshold rule:: + +. In your {observability} project, go to **Alerts**. +. Select **Manage Rules** from the **Alerts** page, and select **Create rule**. +. Enter a **Name** for your rule, and any optional **Tags** for more granular reporting (leave blank if unsure). +. Select the **Latency threshold** rule type from the APM use case. +. Select the appropriate **Service**, **Type**, **Environment** and **Name** (or leave **ALL** to include all options). Alternatively, you can select **Use KQL Filter** and enter a KQL expression to limit the scope of your rule. +. Define the threshold and period: ++ +** **When**: Choose between `Average`, `95th percentile`, or `99th percentile`. +** **Is Above**: Enter a time in milliseconds (defaults to 1500ms). +** **For the last**: Define the period to be assessed in (defaults to last 5 minutes). +. Choose how to **Group alerts by**. Every unique value will create an alert. +. Define the interval to check the rule (for example, check every 1 minute). +. (Optional) Set up **Actions**. +. **Save** your rule. + +[discrete] +[[create-latency-threshold-alert-rule-add-actions]] +== Add actions + +You can extend your rules with actions that interact with third-party systems, write to logs or indices, or send user notifications. You can add an action to a rule at any time. You can create rules without adding actions, and you can also define multiple actions for a single rule. + +To add actions to rules, you must first create a connector for that service (for example, an email or external incident management system), which you can then use for different rules, each with their own action frequency. + +.Connector types +[%collapsible] +===== +Connectors provide a central place to store connection information for services and integrations with third party systems. +The following connectors are available when defining actions for alerting rules: + +include::./alerting-connectors.asciidoc[] + +For more information on creating connectors, refer to https://www.elastic.co/docs/current/serverless/action-connectors[Connectors]. +===== + +.Action frequency +[%collapsible] +===== +After you select a connector, you must set the action frequency. You can choose to create a **Summary of alerts** on each check interval or on a custom interval. For example, you can send email notifications that summarize the new, ongoing, and recovered alerts every twelve hours. + +Alternatively, you can set the action frequency to **For each alert** and specify the conditions each alert must meet for the action to run. For example, you can send an email only when the alert status changes to critical. + +[role="screenshot"] +image::images/alert-action-frequency.png[Configure when a rule is triggered] + +With the **Run when** menu you can choose if an action runs when the threshold for an alert is reached, or when the alert is recovered. For example, you can add a corresponding action for each state to ensure you are alerted when the rule is triggered and also when it recovers. + +[role="screenshot"] +image::images/alert-apm-action-frequency-recovered.png[Choose between threshold met or recovered] +===== + +.Action variables +[%collapsible] +===== +Use the default notification message or customize it. +You can add more context to the message by clicking the Add variable icon image:images/icons/indexOpen.svg[Add variable] and selecting from a list of available variables. + +[role="screenshot"] +image::images/action-variables-popup.png[Action variables list] + +The following variables are specific to this rule type. +You can also specify {kibana-ref}/rule-action-variables.html[variables common to all rules]. + +`context.alertDetailsUrl`:: +Link to the alert troubleshooting view for further context and details. This will be an empty string if the `server.publicBaseUrl` is not configured. + +`context.environment`:: +The transaction type the alert is created for. + +`context.interval`:: +The length and unit of time period where the alert conditions were met. + +`context.reason`:: +A concise description of the reason for the alert. + +`context.serviceName`:: +The service the alert is created for. + +`context.threshold`:: +Any trigger value above this value will cause the alert to fire. + +`context.transactionName`:: +The transaction name the alert is created for. + +`context.transactionType`:: +The transaction type the alert is created for. + +`context.triggerValue`:: +The value that breached the threshold and triggered the alert. + +`context.viewInAppUrl`:: +Link to the alert source. + +===== + +[discrete] +[[create-latency-threshold-alert-rule-example]] +== Example + +The latency threshold alert triggers when the latency of a specific transaction type in a service exceeds a defined threshold. + +Before continuing, identify the service name, environment name, and transaction type that you’d like to create a latency threshold rule for. + +This guide will create an alert for an error group ID based on the following criteria: + +* Service: `{your_service.name}` +* Transaction: `{your_transaction.name}` +* Environment: `{your_service.environment}` +* Average latency is above 1500ms for last 5 minutes +* Group alerts by `service.name` and `service.environment` +* Check every 1 minute +* Send the alert via email to the site reliability team + +From any page in **Applications**, select **Alerts and rules** → **Create threshold rule** → **Latency threshold**. Change the name of the alert (if you wish), but do not edit the tags. + +Based on the criteria above, define the following rule details: + +* **Service**: `{your_service.name}` +* **Type**: `{your_transaction.name}` +* **Environment**: `{your_service.environment}` +* **When:** `Average` +* **Is above:** `1500ms` +* **For the last:** `5 minutes` +* **Group alerts by:** `service.name` `service.environment` +* **Check every:** `1 minute` + +Next, select the **Email** connector and click **Create a connector**. Fill out the required details: sender, host, port, etc., and select **Save**. + +A default message is provided as a starting point for your alert. You can use the Mustache template syntax (`{{variable}}`) to pass additional alert values at the time a condition is detected to an action. A list of available variables can be accessed by selecting the add variable button. + +Select **Save**. The alert has been created and is now active! diff --git a/docs/en/serverless/alerting/create-manage-rules.asciidoc b/docs/en/serverless/alerting/create-manage-rules.asciidoc new file mode 100644 index 0000000000..625d0a4269 --- /dev/null +++ b/docs/en/serverless/alerting/create-manage-rules.asciidoc @@ -0,0 +1,142 @@ +[[create-manage-rules]] += Create and manage rules + +:description: Create and manage rules for alerting when conditions are met. +:keywords: serverless, observability, how-to + +preview:[] + +:role: Editor +:goal: create and manage rules for alerting +include::../partials/roles.asciidoc[] +:role!: + +:goal!: + +Alerting enables you to define _rules_, which detect complex conditions within different apps and trigger actions when those conditions are met. Alerting provides a set of built-in connectors and rules for you to use. + +[discrete] +[[create-manage-rules-observability-rules]] +== Observability rules + +Learn more about Observability rules and how to create them: + +|=== +| Rule type | Name | Detects when... + +| AIOps +| <> +| Anomalies match specific conditions. + +| APM +| <> +| The latency, throughput, or failed transaction rate of a service is abnormal. + +| Observability +| <> +| An Observability data type reaches or exceeds a given value. + +| Stack +| <> +| Matches are found during the latest query run. + +| APM +| <> +| The number of errors in a service exceeds a defined threshold. + +| APM +| <> +| The rate of transaction errors in a service exceeds a defined threshold. + +| Metrics +| <> +| The infrastructure inventory exceeds a defined threshold. + +| APM +| <> +| The latency of a specific transaction type in a service exceeds a defined threshold. + +| SLO +| <> +| The burn rate is above a defined threshold. +|=== + +[discrete] +[[create-manage-rules-creating-rules-and-alerts]] +== Creating rules and alerts + +You start by defining the rule and how often it should be evaluated. You can extend these rules by adding an appropriate action (for example, send an email or create an issue) to be triggered when the rule conditions are met. These actions are defined within each rule and implemented by the appropriate connector for that action e.g. Slack, Jira. You can create any rules from scratch using the **Manage Rules** page, or you can create specific rule types from their respective UIs and benefit from some of the details being pre-filled (for example, Name and Tags). + +* For APM alert types, you can select **Alerts and rules** and create rules directly from the **Services**, **Traces**, and **Dependencies** UIs. +* For SLO alert types, from the **SLOs** page open the **More actions** menu image:images/icons/boxesHorizontal.svg[action menu] for an SLO and select **Create new alert rule**. Alternatively, when you create a new SLO, the **Create new SLO burn rate alert rule** checkbox is enabled by default and will prompt you to <> upon saving the SLO. + +//// +/* +Clarify available Logs rule +*/ +//// + +After a rule is created, you can open the **More actions** menu image:images/icons/boxesHorizontal.svg[More actions] and select **Edit rule** to check or change the definition, and/or add or modify actions. + +[role="screenshot"] +image::images/alerts-edit-rule.png[Edit rule (failed transaction rate)] + +From the action menu you can also: + +* Disable or delete rule +* Clone rule +* Snooze rule notifications +* Run rule (without waiting for next scheduled check) +* Update API keys + +[discrete] +[[create-manage-rules-view-rule-details]] +== View rule details + +Click on an individual rule on the **{rules-app}** page to view details including the rule name, status, definition, execution history, related alerts, and more. + +[role="screenshot"] +image::images/alerts-detail-apm-anomaly.png[Rule details (APM anomaly)] + +A rule can have one of the following responses: + +`failed`:: +The rule ran with errors. + +`succeeded`:: +The rule ran without errors. + +`warning`:: +The rule ran with some non-critical errors. + +[discrete] +[[create-manage-rules-snooze-and-disable-rules]] +== Snooze and disable rules + +The rule listing enables you to quickly snooze, disable, enable, or delete individual rules. + +// ![Use the rule status dropdown to enable or disable an individual rule](images/create-and-manage-rules/user-alerting-individual-enable-disable.png) + +When you snooze a rule, the rule checks continue to run on a schedule but the +alert will not trigger any actions. You can snooze for a specified period of +time, indefinitely, or schedule single or recurring downtimes. + +// ![Snooze notifications for a rule](images/create-and-manage-rules/user-alerting-snooze-panel.png) + +When a rule is in a snoozed state, you can cancel or change the duration of +this state. + +preview:[] To temporarily suppress notifications for _all_ rules, create a https://www.elastic.co/docs/current/serverless/maintenance-windows[maintenance window]. + +// Remove tech preview? + +[discrete] +[[create-manage-rules-import-and-export-rules]] +== Import and export rules + +To import and export rules, use https://www.elastic.co/docs/current/serverless/saved-objects[{saved-objects-app}]. + +Rules are disabled on export. +You are prompted to re-enable the rule on successful import. + +// Can you import / export rules? diff --git a/docs/en/serverless/alerting/create-slo-burn-rate-alert-rule.asciidoc b/docs/en/serverless/alerting/create-slo-burn-rate-alert-rule.asciidoc new file mode 100644 index 0000000000..997548cfa5 --- /dev/null +++ b/docs/en/serverless/alerting/create-slo-burn-rate-alert-rule.asciidoc @@ -0,0 +1,139 @@ +[[create-slo-burn-rate-alert-rule]] += Create an SLO burn rate rule + +:description: Get alerts when the SLO failure rate is too high over a defined period of time. +:keywords: serverless, observability, how-to, alerting + +++++ +SLO burn rate +++++ + +preview:[] + +:role: Editor +:goal: create rules for alerting +include::../partials/roles.asciidoc[] +:role!: + +:goal!: + +Create an SLO burn rate rule to get alerts when the burn rate is too high over a defined threshold for two different lookback periods: a long period and a short period that is 1/12th of the long period. For example, if your long lookback period is one hour, your short lookback period is five minutes. + +Choose which SLO to monitor and then define multiple burn rate windows with appropriate severity. For each period, the burn rate is computed as the error rate divided by the error budget. When the burn rates for both periods surpass the threshold, an alert is triggered. Add actions to raise alerts via services or third-party integrations e.g. mail, Slack, Jira. + +[role="screenshot"] +image::images/slo-alerts-create-rule.png[Create rule for failed transaction rate threshold] + +[TIP] +==== +These steps show how to use the **Alerts** UI. You can also create an SLO burn rate rule directly from **Observability** → **SLOs**. +Click the more options icon (image:images/icons/boxesVertical.svg[More options]) to the right of the SLO you want to add a burn rate rule for, and select **image:images/icons/bell.svg[Bell] Create new alert rule** from the menu. + +When you use the UI to create an SLO, a default SLO burn rate alert rule is created automatically. +The burn rate rule will use the default configuration and no connector. +You must configure a connector if you want to receive alerts for SLO breaches. +==== + +To create an SLO burn rate rule: + +. In your {observability} project, go to **Alerts**. +. Select **Manage Rules** from the **Alerts** page, and select **Create rule**. +. Enter a **Name** for your rule, and any optional **Tags** for more granular reporting (leave blank if unsure). +. Select **SLO burn rate** from the **Select rule type** list. +. Select the **SLO** you want to monitor. +. Define multiple burn rate windows for each **Action Group** (defaults to 4 windows but you can edit): ++ +** **Lookback (hours)**: Enter the lookback period for this window. A shorter period equal to 1/12th of this period will be used for faster recovery. +** **Burn rate threshold**: Enter a burn rate for this window. +** **Action Group**: Select a severity for this window. +. Define the interval to check the rule e.g. check every 1 minute. +. (Optional) Set up **Actions**. +. **Save** your rule. + +[discrete] +[[create-slo-burn-rate-alert-rule-add-actions]] +== Add actions + +You can extend your rules with actions that interact with third-party systems, write to logs or indices, or send user notifications. You can add an action to a rule at any time. You can create rules without adding actions, and you can also define multiple actions for a single rule. + +To add actions to rules, you must first create a connector for that service (for example, an email or external incident management system), which you can then use for different rules, each with their own action frequency. + +.Connector types +[%collapsible] +===== +Connectors provide a central place to store connection information for services and integrations with third party systems. +The following connectors are available when defining actions for alerting rules: + +include::./alerting-connectors.asciidoc[] + +For more information on creating connectors, refer to https://www.elastic.co/docs/current/serverless/action-connectors[Connectors]. +===== + +.Action frequency +[%collapsible] +===== +After you select a connector, you must set the action frequency. You can choose to create a **Summary of alerts** on each check interval or on a custom interval. For example, you can send email notifications that summarize the new, ongoing, and recovered alerts every twelve hours. + +Alternatively, you can set the action frequency to **For each alert** and specify the conditions each alert must meet for the action to run. For example, you can send an email only when the alert status changes to critical. + +[role="screenshot"] +image::images/alert-action-frequency.png[Configure when a rule is triggered] + +With the **Run when** menu you can choose if an action runs for a specific severity (critical, high, medium, low), or when the alert is recovered. For example, you can add a corresponding action for each severity you want an alert for, and also for when the alert recovers. + +[role="screenshot"] +image::images/slo-action-frequency.png[Choose between severity or recovered] +===== + +.Action variables +[%collapsible] +===== +Use the default notification message or customize it. +You can add more context to the message by clicking the Add variable icon image:images/icons/indexOpen.svg[Add variable] and selecting from a list of available variables. + +[role="screenshot"] +image::images/action-variables-popup.png[Action variables list] + +The following variables are specific to this rule type. +You can also specify {kibana-ref}/rule-action-variables.html[variables common to all rules]. + +`context.alertDetailsUrl`:: +Link to the alert troubleshooting view for further context and details. This will be an empty string if the `server.publicBaseUrl` is not configured. + +`context.burnRateThreshold`:: +The burn rate threshold value. + +`context.longWindow`:: +The window duration with the associated burn rate value. + +`context.reason`:: +A concise description of the reason for the alert. + +`context.shortWindow`:: +The window duration with the associated burn rate value. + +`context.sloId`:: +The SLO unique identifier. + +`context.sloInstanceId`:: +The SLO instance ID. + +`context.sloName`:: +The SLO name. + +`context.timestamp`:: +A timestamp of when the alert was detected. + +`context.viewInAppUrl`:: +The url to the SLO details page to help with further investigation. + +===== + +[discrete] +[[create-slo-burn-rate-alert-rule-next-steps]] +== Next steps + +Learn how to view alerts and triage SLO burn rate breaches: + +* <> +* <> diff --git a/docs/en/serverless/alerting/rate-aggregation.asciidoc b/docs/en/serverless/alerting/rate-aggregation.asciidoc new file mode 100644 index 0000000000..70028b6347 --- /dev/null +++ b/docs/en/serverless/alerting/rate-aggregation.asciidoc @@ -0,0 +1,53 @@ +[[rateAggregation]] += Rate aggregation + +:description: Analyze the rate at which a specific field changes over time. +:keywords: serverless, observability, reference + +preview:[] + +You can use a rate aggregation to analyze the rate at which a specific field changes over time. +This type of aggregation is useful when you want to analyze fields like counters. + +For example, imagine you have a counter field called restarts that increments each time a service restarts. +You can use rate aggregation to get an alert if the service restarts more than X times within a specific time window (for example, per day). + +[discrete] +[[rateAggregation-how-rates-are-calculated]] +== How rates are calculated + +Rates used in alerting rules are calculated by comparing the maximum value of the field in the previous bucket to the maximum value of the field in the current bucket and then dividing the result by the number of seconds in the selected interval. +For example, if the value of the restarts increases, the rate would be calculated as: + +`(max_value_in_current_bucket - max_value_in_previous_bucket)/interval_in_seconds` + +In this example, let’s assume you have one document per bucket with the following data: + +[source,json] +---- +{ +"timestamp": 0000, +"restarts": 0 +} + +{ +"timestamp": 60000, +"restarts": 1 +} +---- + +Let’s assume the timestamp is a UNIX timestamp in milliseconds, +and we started counting on Thursday, January 1, 1970 12:00:00 AM. +In that case, the rate will be calculated as follows: + +`(max_value_in_current_bucket - max_value_in_previous_bucket)/interval_in_seconds`, where: + +* `max_value_in_current_bucket` [now-1m → now]: 1 +* `max_value_in_previous_bucket` [now-2m → now-1m]: 0 +* `interval_in_seconds`: 60 + +The rate calculation would be: `(1 - 0) / 60 = 0.0166666666667` + +If you want to alert when the rate of restarts is above 1 within a 1-minute window, you would set the threshold above `0.0166666666667`. + +The calculation you need to use depends on the interval that's selected. diff --git a/docs/en/serverless/alerting/triage-slo-burn-rate-breaches.asciidoc b/docs/en/serverless/alerting/triage-slo-burn-rate-breaches.asciidoc new file mode 100644 index 0000000000..10130c34c0 --- /dev/null +++ b/docs/en/serverless/alerting/triage-slo-burn-rate-breaches.asciidoc @@ -0,0 +1,59 @@ +[[triage-slo-burn-rate-breaches]] += Triage SLO burn rate breaches + +:description: Triage SLO burn rate breaches to avoid exhausting your error budget and violating your SLO. +:keywords: serverless, observability, how-to, alerting + +++++ +SLO burn rate breaches +++++ + +preview:[] + +SLO burn rate breaches occur when the percentage of bad events over a specified time period exceeds the threshold set in your <>. +When this happens, you are at risk of exhausting your error budget and violating your SLO. + +To triage issues quickly, go to the alert details page: + +. In your Observability project, go to **Alerts** (or open the SLO and click **Alerts**.) +. From the Alerts table, click the image:images/icons/boxesHorizontal.svg[More actions] +icon next to the alert and select **View alert details**. + +The alert details page shows information about the alert, including when the alert was triggered, +the duration of the alert, the source SLO, and the rule that triggered the alert. +You can follow the links to navigate to the source SLO or rule definition. + +Explore charts on the page to learn more about the SLO breach: + +* **Burn rate chart**. The first chart shows the burn rate during the time range when the alert was active. +The line indicates how close the SLO came to breaching the threshold. ++ +[role="screenshot"] +image::images/slo-burn-rate-breach.png[Alert details for SLO burn rate breach] ++ +[TIP] +==== +The timeline is annotated to show when the threshold was breached. +You can hover over an alert icon to see the timestamp of the alert. +==== +* **Alerts history chart**. The next chart provides information about alerts for the same rule and group over the last 30 days. +It shows the number of those alerts that were triggered per day, the total number of alerts triggered throughout the 30 days, +and the average time it took to recover after a breach. ++ +[role="screenshot"] +image::images/log-threshold-breach-alert-history-chart.png[Alert history chart in alert details for SLO burn rate breach] + +The number, duration, and frequency of these breaches over time gives you an indication of how severely the service is degrading so that you can focus on high severity issues first. + +[NOTE] +==== +The contents of the alert details page may vary depending on the type of SLI that's defined in the SLO. +==== + +After investigating the alert, you may want to: + +* Click **Snooze the rule** to snooze notifications for a specific time period or indefinitely. +* Click the image:images/icons/boxesVertical.svg[Actions] icon and select **Add to case** to add the alert to a new or existing case. To learn more, refer to <>. +* Click the image:images/icons/boxesVertical.svg[Actions] icon and select **Mark as untracked**. +When an alert is marked as untracked, actions are no longer generated. +You can choose to move active alerts to this state when you disable or delete rules. diff --git a/docs/en/serverless/alerting/triage-threshold-breaches.asciidoc b/docs/en/serverless/alerting/triage-threshold-breaches.asciidoc new file mode 100644 index 0000000000..71d0003926 --- /dev/null +++ b/docs/en/serverless/alerting/triage-threshold-breaches.asciidoc @@ -0,0 +1,64 @@ +[[triage-threshold-breaches]] += Triage threshold breaches + +:description: Triage threshold breaches on the alert details page. +:keywords: serverless, observability, how-to, alerting + +++++ +Threshold breaches +++++ + +Threshold breaches occur when an {observability} data type reaches or exceeds the threshold set in your <>. +For example, you might have a custom threshold rule that triggers an alert when the total number of log documents with a log level of `error` reaches 100. + +To triage issues quickly, go to the alert details page: + +. In your Observability project, go to **Alerts**. +. From the Alerts table, click the image:images/icons/boxesHorizontal.svg[More actions] +icon next to the alert and select **View alert details**. + +The alert details page shows information about the alert, including when the alert was triggered, +the duration of the alert, and the last status update. +If there is a "group by" field specified in the rule, the page also includes the source. +You can follow the links to navigate to the rule definition. + +Explore charts on the page to learn more about the threshold breach: + +* **Charts for each condition**. The page includes a chart for each condition specified in the rule. +These charts help you understand when the breach occurred and its severity. ++ +[role="screenshot"] +image::images/log-threshold-breach-condition-chart.png[Chart for a condition in alert details for log threshold breach] ++ +[TIP] +==== +The timeline is annotated to show when the threshold was breached. +You can hover over an alert icon to see the timestamp of the alert. +==== +* **Log rate analysis chart**. If your rule is intended to detect log threshold breaches +(that is, it has a single condition that uses a count aggregation), +you can run a log rate analysis, assuming you have the required license. +Running a log rate analysis is useful for detecting significant dips or spikes in the number of logs. +Notice that you can adjust the baseline and deviation, and then run the analysis again. +For more information about using the log rate analysis feature, +refer to the {kibana-ref}/xpack-ml-aiops.html#log-rate-analysis[AIOps Labs] documentation. ++ +[role="screenshot"] +image::images/log-threshold-breach-log-rate-analysis.png[Log rate analysis chart in alert details for log threshold breach] +* **Alerts history chart**. The next chart provides information about alerts for the same rule and group over the last 30 days. +It shows the number of those alerts that were triggered per day, the total number of alerts triggered throughout the 30 days, +and the average time it took to recover after a breach. ++ +[role="screenshot"] +image::images/log-threshold-breach-alert-history-chart.png[Alert history chart in alert details for SLO burn rate breach] + +Analyze these charts to better understand when the breach started, it's current +state, and how the issue is trending. + +After investigating the alert, you may want to: + +* Click **Snooze the rule** to snooze notifications for a specific time period or indefinitely. +* Click the image:images/icons/boxesVertical.svg[Actions] icon and select **Add to case** to add the alert to a new or existing case. To learn more, refer to <>. +* Click the image:images/icons/boxesVertical.svg[Actions] icon and select **Mark as untracked**. +When an alert is marked as untracked, actions are no longer generated. +You can choose to move active alerts to this state when you disable or delete rules. diff --git a/docs/en/serverless/alerting/view-alerts.asciidoc b/docs/en/serverless/alerting/view-alerts.asciidoc new file mode 100644 index 0000000000..731b5716aa --- /dev/null +++ b/docs/en/serverless/alerting/view-alerts.asciidoc @@ -0,0 +1,142 @@ +[[view-alerts]] += View alerts + +:description: Track and manage alerts for your services and applications. +:keywords: serverless, observability, how-to, alerting + +preview:[] + +:role: Editor +:goal: perform this task +include::../partials/roles.asciidoc[] +:role!: + +:goal!: + +You can track and manage alerts for your applications and SLOs from the **Alerts** page. You can filter this view by alert status or time period, or search for specific alerts using KQL. Manage your alerts by adding them to cases or viewing them within the respective UIs. + +// Is this a page or dashboard? + +[role="screenshot"] +image::images/observability-alerts-view.png[Alerts page] + +[discrete] +[[view-alerts-filter-alerts]] +== Filter alerts + +To help you get started with your analysis faster, use the KQL bar to create structured queries using +{kibana-ref}/kuery-query.html[{kib} Query Language]. + +//// +/* TO-DO: Fix example +For example, `kibana.alert.rule.name : <>`. +*/ +//// + +You can use the time filter to define a specific date and time range. +By default, this filter is set to search for the last 15 minutes. + +You can also filter by alert status using the buttons below the KQL bar. +By default, this filter is set to **Show all** alerts, but you can filter to show only active, recovered or untracked alerts. + +[discrete] +[[view-alerts-view-alert-details]] +== View alert details + +There are a few ways to inspect the details for a specific alert. + +From the **Alerts** table, you can click on a specific alert to open the alert detail flyout to view a summary of the alert without leaving the page. +There you'll see the current status of the alert, its duration, and when it was last updated. +To help you determine what caused the alert, you can view the expected and actual threshold values, and the rule that produced the alert. + +[role="screenshot"] +image::images/alert-details-flyout.png[Alerts detail (APM anomaly)] + +There are three common alert statuses: + +`active`:: +The conditions for the rule are met and actions should be generated according to the notification settings. + +`flapping`:: +The alert is switching repeatedly between active and recovered states. + +`recovered`:: +The conditions for the rule are no longer met and recovery actions should be generated. + +`untracked`:: +The corresponding rule is disabled or you've marked the alert as untracked. To mark the alert as untracked, go to the **Alerts** table, click the image:images/icons/boxesHorizontal.svg[More actions] icon to expand the _More actions_ menu, and click **Mark as untracked**. +When an alert is marked as untracked, actions are no longer generated. +You can choose to move active alerts to this state when you disable or delete rules. + +.Flapping alerts +[NOTE] +==== +The flapping state is possible only if you have enabled alert flapping detection. +Go to the **Alerts** page and click **Manage Rules** to navigate to the {observability} **{rules-app}** page. +Click **Settings** then set the look back window and threshold that are used to determine whether alerts are flapping. +For example, you can specify that the alert must change status at least 6 times in the last 10 runs. +If the rule has actions that run when the alert status changes, those actions are suppressed while the alert is flapping. +==== + +// ![View alert details flyout on the Alerts page](images/view-observability-alerts/-observability-view-alert-details.png) + +To further inspect the rule: + +* From the alert detail flyout, click **View rule details**. +* From the **Alerts** table, click the image:images/icons/boxesHorizontal.svg[More actions] icon and select **View rule details**. + +To view the alert in the app that triggered it: + +* From the alert detail flyout, click **View in app**. +* From the **Alerts** table, click the image:images/icons/eye.svg[View in app] icon. + +[discrete] +[[view-alerts-customize-the-alerts-table]] +== Customize the alerts table + +Use the toolbar buttons in the upper-left of the alerts table to customize the columns you want displayed: + +* **Columns**: Reorder the columns. +* **_x_ fields sorted**: Sort the table by one or more columns. +* **Fields**: Select the fields to display in the table. + +For example, click **Fields** and choose the `Maintenance Windows` field. +If an alert was affected by a maintenance window, its identifier appears in the new column. +For more information about their impact on alert notifications, refer to https://www.elastic.co/docs/current/serverless/maintenance-windows[Maintenance windows]. + +// ![Alerts table with toolbar buttons highlighted](images/view-observability-alerts/-observability-alert-table-toolbar-buttons.png) + +You can also use the toolbar buttons in the upper-right to customize the display options or view the table in full-screen mode. + +[discrete] +[[view-alerts-add-alerts-to-cases]] +== Add alerts to cases + +From the **Alerts** table, you can add one or more alerts to a case. +Click the image:images/icons/boxesHorizontal.svg[More actions] icon to add the alert to a new or existing case. +You can add an unlimited amount of alerts from any rule type. + +[NOTE] +==== +Each case can have a maximum of 1,000 alerts. +==== + +[discrete] +[[view-alerts-add-an-alert-to-a-new-case]] +=== Add an alert to a new case + +To add an alert to a new case: + +. Select **Add to new case**. +. Enter a case name, add relevant tags, and include a case description. +. Under **External incident management system**, select a connector. If you've previously added one, that connector displays as the default selection. Otherwise, the default setting is `No connector selected`. +. After you've completed all of the required fields, click **Create case**. A notification message confirms you successfully created the case. To view the case details, click the notification link or go to the <> page. + +[discrete] +[[view-alerts-add-an-alert-to-an-existing-case]] +=== Add an alert to an existing case + +To add an alert to an existing case: + +. Select **Add to existing case**. +. Select the case where you will attach the alert. A confirmation message displays. diff --git a/docs/en/serverless/alerting/view-alerts.mdx b/docs/en/serverless/alerting/view-alerts.mdx index 1a10210a19..a545e176cb 100644 --- a/docs/en/serverless/alerting/view-alerts.mdx +++ b/docs/en/serverless/alerting/view-alerts.mdx @@ -87,7 +87,7 @@ Use the toolbar buttons in the upper-left of the alerts table to customize the c For example, click **Fields** and choose the `Maintenance Windows` field. If an alert was affected by a maintenance window, its identifier appears in the new column. -For more information about their impact on alert notifications, refer to . +For more information about their impact on alert notifications, refer to Maintenance windows. {/* ![Alerts table with toolbar buttons highlighted](images/view-observability-alerts/-observability-alert-table-toolbar-buttons.png) */} diff --git a/docs/en/serverless/apm-agents/apm-agents-aws-lambda-functions.asciidoc b/docs/en/serverless/apm-agents/apm-agents-aws-lambda-functions.asciidoc new file mode 100644 index 0000000000..fbda6f21bb --- /dev/null +++ b/docs/en/serverless/apm-agents/apm-agents-aws-lambda-functions.asciidoc @@ -0,0 +1,47 @@ +[[apm-agents-aws-lambda-functions]] += AWS Lambda functions + +:description: Use Elastic APM to monitor your AWS Lambda functions. +:keywords: serverless, observability, overview + +preview:[] + +Elastic APM lets you monitor your AWS Lambda functions. +The natural integration of <> into your AWS Lambda functions provides insights into each function's execution and runtime behavior as well as its relationships and dependencies to other services. + +[discrete] +[[aws-lambda-arch]] +== AWS Lambda architecture + +// comes from sandbox.elastic.dev/test-books/apm/lambda/aws-lambda-arch.mdx + +AWS Lambda uses a special execution model to provide a scalable, on-demand compute service for code execution. In particular, AWS freezes the execution environment of a lambda function when no active requests are being processed. This execution model poses additional requirements on APM in the context of AWS Lambda functions: + +. To avoid data loss, APM data collected by APM agents needs to be flushed before the execution environment of a lambda function is frozen. +. Flushing APM data must be fast so as not to impact the response times of lambda function requests. + +To accomplish the above, Elastic APM agents instrument AWS Lambda functions and dispatch APM data via an https://docs.aws.amazon.com/lambda/latest/dg/using-extensions.html[AWS Lambda extension]. + +Normally, during the execution of a Lambda function, there's only a single language process running in the AWS Lambda execution environment. With an AWS Lambda extension, Lambda users run a _second_ process alongside their main service/application process. + +[role="screenshot"] +image::images/apm-agents-aws-lambda-functions-architecture.png[image showing data flow from lambda function, to extension, to the managed intake service] + +By using an AWS Lambda extension, Elastic APM agents can send data to a local Lambda extension process, and that process will forward data on to the managed intake service asynchronously. The Lambda extension ensures that any potential latency between the Lambda function and the managed intake service instance will not cause latency in the request flow of the Lambda function itself. + +[discrete] +[[apm-agents-aws-lambda-functions-setup]] +== Setup + +To get started with monitoring AWS Lambda functions, refer to the APM agent documentation: + +* {apm-node-ref}/lambda.html[Monitor AWS Lambda Node.js functions] +* {apm-py-ref}/lambda-support.html[Monitor AWS Lambda Python functions] +* {apm-java-ref}/aws-lambda.html[Monitor AWS Lambda Java functions] + +[IMPORTANT] +==== +The APM agent documentation states that you can use either an APM secret token or API key to authorize requests to the managed intake service. **However, when sending data to a project, you _must_ use an API key**. + +Read more about API keys in <>. +==== diff --git a/docs/en/serverless/apm-agents/apm-agents-elastic-apm-agents.asciidoc b/docs/en/serverless/apm-agents/apm-agents-elastic-apm-agents.asciidoc new file mode 100644 index 0000000000..98ee3bc81d --- /dev/null +++ b/docs/en/serverless/apm-agents/apm-agents-elastic-apm-agents.asciidoc @@ -0,0 +1,128 @@ +[[apm-agents-elastic-apm-agents]] += Elastic APM agents + +:keywords: serverless, observability, overview + +preview:[] + +:role: Admin +:goal: use APM agents +include::../partials/roles.asciidoc[] +:role!: + +:goal!: + +Elastic APM agents automatically measure application performance and track errors. +They offer built-in support for popular frameworks and technologies, and provide easy-to-use APIs that allow you to instrument any application. + +Elastic APM agents are built and maintained by Elastic. While they are similar, different programming languages have different nuances and requirements. Select your preferred language below to learn more about how each agent works. + +++++ +
+
+ + + + + + + +
+
+++++ +include::../transclusion/apm/guide/about/java.asciidoc[] + +++++ +
+ + + + + + +
+++++ + +[discrete] +[[apm-agents-elastic-apm-agents-minimum-supported-versions]] +== Minimum supported versions + +The following versions of Elastic APM agents are supported: + +|=== +| Agent name| Agent version + +| **APM AWS Lambda extension** +| ≥`1.x` + +| **Go agent** +| ≥`1.x` + +| **Java agent** +| ≥`1.x` + +| **.NET agent** +| ≥`1.x` + +| **Node.js agent** +| ≥`4.x` + +| **PHP agent** +| ≥`1.x` + +| **Python agent** +| ≥`6.x` + +| **Ruby agent** +| ≥`3.x` +|=== + +[NOTE] +==== +Some recently added features may require newer agent versions than those listed above. +In these instances, the required APM agent versions will be documented with the feature. +==== diff --git a/docs/en/serverless/apm-agents/apm-agents-opentelemetry-collect-metrics.asciidoc b/docs/en/serverless/apm-agents/apm-agents-opentelemetry-collect-metrics.asciidoc new file mode 100644 index 0000000000..e919b94ccf --- /dev/null +++ b/docs/en/serverless/apm-agents/apm-agents-opentelemetry-collect-metrics.asciidoc @@ -0,0 +1,59 @@ +[[apm-agents-opentelemetry-collect-metrics]] += Collect metrics + +:keywords: serverless, observability, reference + +preview:[] + +[IMPORTANT] +==== +When collecting metrics, please note that the https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/metrics/DoubleValueRecorder.html[`DoubleValueRecorder`] +and https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-api/latest/io/opentelemetry/api/metrics/LongValueObserver.html[`LongValueRecorder`] metrics are not yet supported. +==== + +Here's an example of how to capture business metrics from a Java application. + +[source,java] +---- +// initialize metric +Meter meter = GlobalMetricsProvider.getMeter("my-frontend"); +DoubleCounter orderValueCounter = meter.doubleCounterBuilder("order_value").build(); + +public void createOrder(HttpServletRequest request) { + + // create order in the database + ... + // increment business metrics for monitoring + orderValueCounter.add(orderPrice); +} +---- + +See the https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/api.md[Open Telemetry Metrics API] +for more information. + +[discrete] +[[open-telemetry-verify-metrics]] +== Verify OpenTelemetry metrics data + +Use **Discover** to validate that metrics are successfully reported to your project. + +. Open your Observability project. +. In your {observability} project, go to **Discover**, and select the **Logs Explorer** tab. +. Click **All logs** → **Data Views** then select **APM**. +. Filter the data to only show documents with metrics: `processor.name :"metric"` +. Narrow your search with a known OpenTelemetry field. For example, if you have an `order_value` field, add `order_value: *` to your search to return +only OpenTelemetry metrics documents. + +[discrete] +[[open-telemetry-visualize]] +== Visualize + +Use **Lens** to create visualizations for OpenTelemetry metrics. Lens enables you to build visualizations by dragging and dropping data fields. It makes smart visualization suggestions for your data, allowing you to switch between visualization types. + +To get started with a new Lens visualization: + +. In your {observability} project, go to **Visualizations**. +. Click **Create new visualization**. +. Select **Lens**. + +For more information on using Lens, refer to the {kibana-ref}/lens.html[Lens documentation]. diff --git a/docs/en/serverless/apm-agents/apm-agents-opentelemetry-limitations.asciidoc b/docs/en/serverless/apm-agents/apm-agents-opentelemetry-limitations.asciidoc new file mode 100644 index 0000000000..c0088bde15 --- /dev/null +++ b/docs/en/serverless/apm-agents/apm-agents-opentelemetry-limitations.asciidoc @@ -0,0 +1,40 @@ +[[apm-agents-opentelemetry-limitations]] += Limitations + +:keywords: serverless, observability, overview + +preview:[] + +[discrete] +[[apm-agents-opentelemetry-limitations-opentelemetry-traces]] +== OpenTelemetry traces + +* Traces of applications using `messaging` semantics might be wrongly displayed as `transactions` in the Applications UI, while they should be considered `spans` (see issue https://github.com/elastic/apm-server/issues/7001[#7001]). +* Inability to see Stack traces in spans. +* Inability in APM views to view the "Time Spent by Span Type" (see issue https://github.com/elastic/apm-server/issues/5747[#5747]). + +[discrete] +[[open-telemetry-logs-intake]] +== OpenTelemetry logs + +* preview:[] The OpenTelemetry logs intake via Elastic is in technical preview. +* The application logs data stream (`app_logs`) has dynamic mapping disabled. This means the automatic detection and mapping of new fields is disabled (see issue https://github.com/elastic/apm-server/issues/9093[#9093]). + +[discrete] +[[open-telemetry-otlp-limitations]] +== OpenTelemetry Line Protocol (OTLP) + +Elastic supports both the +https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/otlp.md#otlpgrpc[(OTLP/gRPC)] and +https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/otlp.md#otlphttp[(OTLP/HTTP)] protocol +with ProtoBuf payload. Elastic does not yet support JSON Encoding for OTLP/HTTP. + +[discrete] +[[open-telemetry-collector-exporter]] +== OpenTelemetry Collector exporter for Elastic + +The https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/exporter/elasticsearchexporter#legacy-opentelemetry-collector-exporter-for-elastic[OpenTelemetry Collector exporter for Elastic] +has been deprecated and replaced by the native support of the OpenTelemetry Line Protocol in Elastic Observability (OTLP). To learn more, see https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/exporter/elasticsearchexporter#migration[migration]. + +The https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/exporter/elasticsearchexporter[OpenTelemetry Collector exporter for Elastic] +(which is different from the legacy exporter mentioned above) is not intended to be used with Elastic APM and Elastic Observability. Use <> instead. diff --git a/docs/en/serverless/apm-agents/apm-agents-opentelemetry-opentelemetry-native-support.asciidoc b/docs/en/serverless/apm-agents/apm-agents-opentelemetry-opentelemetry-native-support.asciidoc new file mode 100644 index 0000000000..aff573c737 --- /dev/null +++ b/docs/en/serverless/apm-agents/apm-agents-opentelemetry-opentelemetry-native-support.asciidoc @@ -0,0 +1,181 @@ +[[apm-agents-opentelemetry-opentelemetry-native-support]] += Upstream OpenTelemetry Collectors and language SDKs + +:keywords: serverless, observability, overview + +preview:[] + +[NOTE] +==== +This is one of several approaches you can use to integrate Elastic with OpenTelemetry. +**To compare approaches and choose the best approach for your use case, refer to <>.** +==== + +Elastic natively supports the OpenTelemetry protocol (OTLP). +This means trace data and metrics collected from your applications and infrastructure can +be sent directly to Elastic. + +* Send data to Elastic from an upstream <> +* Send data to Elastic from an upstream <> + +[discrete] +[[apm-agents-opentelemetry-opentelemetry-native-support-send-data-from-an-upstream-opentelemetry-collector]] +== Send data from an upstream OpenTelemetry Collector + +Connect your OpenTelemetry Collector instances to Elastic {observability} using the OTLP exporter: + +[source,yaml] +---- +receivers: <1> + # ... + otlp: + +processors: <2> + # ... + memory_limiter: + check_interval: 1s + limit_mib: 2000 + batch: + +exporters: + logging: + loglevel: warn <3> + otlp/elastic: <4> + # Elastic https endpoint without the "https://" prefix + endpoint: "${ELASTIC_APM_SERVER_ENDPOINT}" <5> <7> + headers: + # Elastic API key + Authorization: "ApiKey ${ELASTIC_APM_API_KEY}" <6> <7> + +service: + pipelines: + traces: + receivers: [otlp] + processors: [..., memory_limiter, batch] + exporters: [logging, otlp/elastic] + metrics: + receivers: [otlp] + processors: [..., memory_limiter, batch] + exporters: [logging, otlp/elastic] + logs: <8> + receivers: [otlp] + processors: [..., memory_limiter, batch] + exporters: [logging, otlp/elastic] +---- + +<1> The receivers, like the +https://github.com/open-telemetry/opentelemetry-collector/tree/main/receiver/otlpreceiver[OTLP receiver], that forward data emitted by APM agents, or the https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/hostmetricsreceiver[host metrics receiver]. + +<2> We recommend using the https://github.com/open-telemetry/opentelemetry-collector/blob/main/processor/batchprocessor/README.md[Batch processor] and the https://github.com/open-telemetry/opentelemetry-collector/blob/main/processor/memorylimiterprocessor/README.md[memory limiter processor]. For more information, see https://github.com/open-telemetry/opentelemetry-collector/blob/main/processor/README.md#recommended-processors[recommended processors]. + +<3> The https://github.com/open-telemetry/opentelemetry-collector/tree/main/exporter/loggingexporter[logging exporter] is helpful for troubleshooting and supports various logging levels, like `debug`, `info`, `warn`, and `error`. + +<4> Elastic {observability} endpoint configuration. +Elastic supports a ProtoBuf payload via both the OTLP protocol over gRPC transport https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/otlp.md#otlpgrpc[(OTLP/gRPC)] +and the OTLP protocol over HTTP transport https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/otlp.md#otlphttp[(OTLP/HTTP)]. +To learn more about these exporters, see the OpenTelemetry Collector documentation: +https://github.com/open-telemetry/opentelemetry-collector/tree/main/exporter/otlphttpexporter[OTLP/HTTP Exporter] or +https://github.com/open-telemetry/opentelemetry-collector/tree/main/exporter/otlpexporter[OTLP/gRPC exporter]. + +<5> Hostname and port of the Elastic endpoint. For example, `elastic-apm-server:8200`. + +<6> Credential for Elastic APM API key authorization (`Authorization: "ApiKey an_api_key"`). + +<7> Environment-specific configuration parameters can be conveniently passed in as environment variables documented https://opentelemetry.io/docs/collector/configuration/#configuration-environment-variables[here] (e.g. `ELASTIC_APM_SERVER_ENDPOINT` and `ELASTIC_APM_API_KEY`). + +<8> preview:[] To send OpenTelemetry logs to your project, declare a `logs` pipeline. + +You're now ready to export traces and metrics from your services and applications. + +[TIP] +==== +When using the OpenTelemetry Collector, you should always prefer sending data via the https://github.com/open-telemetry/opentelemetry-collector/tree/main/exporter/otlphttpexporter[`OTLP` exporter]. +Using other methods, like the https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/exporter/elasticsearchexporter[`elasticsearch` exporter], will bypass all of the validation and data processing that Elastic performs. +In addition, your data will not be viewable in your Observability project if you use the `elasticsearch` exporter. +==== + +[discrete] +[[apm-agents-opentelemetry-opentelemetry-native-support-send-data-from-an-upstream-opentelemetry-sdk]] +== Send data from an upstream OpenTelemetry SDK + +[NOTE] +==== +This document outlines how to send data directly from an upstream OpenTelemetry SDK to APM Server, which is appropriate when getting started. However, in many cases you should use the OpenTelemetry SDK to send data to an OpenTelemetry Collector that processes and exports data to APM Server. Read more about when and how to use a collector in the https://opentelemetry.io/docs/collector/#when-to-use-a-collector[OpenTelemetry documentation]. +==== + +To export traces and metrics to Elastic, instrument your services and applications +with the OpenTelemetry API, SDK, or both. For example, if you are a Java developer, you need to instrument your Java app with the +https://github.com/open-telemetry/opentelemetry-java-instrumentation[OpenTelemetry agent for Java]. +See the https://opentelemetry.io/docs/instrumentation/[OpenTelemetry Instrumentation guides] to download the +OpenTelemetry agent or SDK for your language. + +Define environment variables to configure the OpenTelemetry agent or SDK and enable communication with Elastic APM. +For example, if you are instrumenting a Java app, define the following environment variables: + +[source,bash] +---- +export OTEL_RESOURCE_ATTRIBUTES=service.name=checkoutService,service.version=1.1,deployment.environment=production +export OTEL_EXPORTER_OTLP_ENDPOINT=https://apm_server_url:8200 +export OTEL_EXPORTER_OTLP_HEADERS="Authorization=ApiKey an_apm_api_key" +export OTEL_METRICS_EXPORTER="otlp" \ +export OTEL_LOGS_EXPORTER="otlp" \ <1> +java -javaagent:/path/to/opentelemetry-javaagent-all.jar \ + -classpath lib/*:classes/ \ + com.mycompany.checkout.CheckoutServiceServer +---- + +<1> preview:[] The OpenTelemetry logs intake via Elastic is currently in technical preview. + +|=== +| | + +| `OTEL_RESOURCE_ATTRIBUTES` +| Fields that describe the service and the environment that the service runs in. See <> for more information. + +| `OTEL_EXPORTER_OTLP_ENDPOINT` +| Elastic URL. The host and port that Elastic listens for APM events on. + +| `OTEL_EXPORTER_OTLP_HEADERS` +a| Authorization header that includes the Elastic APM API key: `"Authorization=ApiKey an_api_key"`. +Note the required space between `ApiKey` and `an_api_key`. + +For information on how to format an API key, refer to <>. + +[NOTE] +==== +If you are using a version of the Python OpenTelemetry agent _before_ 1.27.0, the content of the header _must_ be URL-encoded. You can use the Python standard library's `urllib.parse.quote` function to encode the content of the header. +==== + +| `OTEL_METRICS_EXPORTER` +| Metrics exporter to use. See https://opentelemetry.io/docs/specs/otel/configuration/sdk-environment-variables/#exporter-selection[exporter selection] for more information. + +| `OTEL_LOGS_EXPORTER` +| Logs exporter to use. See https://opentelemetry.io/docs/specs/otel/configuration/sdk-environment-variables/#exporter-selection[exporter selection] for more information. +|=== + +You are now ready to collect traces and <> before <> +and <>. + +[discrete] +[[apm-agents-opentelemetry-opentelemetry-native-support-proxy-requests-to-elastic]] +== Proxy requests to Elastic + +Elastic supports both the https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/otlp.md#otlpgrpc[(OTLP/gRPC)] and https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/otlp.md#otlphttp[(OTLP/HTTP)] protocol on the same port as Elastic APM agent requests. For ease of setup, we recommend using OTLP/HTTP when proxying or load balancing requests to Elastic. + +If you use the OTLP/gRPC protocol, requests to Elastic must use either HTTP/2 over TLS or HTTP/2 Cleartext (H2C). No matter which protocol is used, OTLP/gRPC requests will have the header: `"Content-Type: application/grpc"`. + +When using a layer 7 (L7) proxy like AWS ALB, requests must be proxied in a way that ensures requests to Elastic follow the rules outlined above. For example, with ALB you can create rules to select an alternative backend protocol based on the headers of requests coming into ALB. In this example, you'd select the gRPC protocol when the `"Content-Type: application/grpc"` header exists on a request. + +For more information on how to configure an AWS ALB to support gRPC, see this AWS blog post: +https://aws.amazon.com/blogs/aws/new-application-load-balancer-support-for-end-to-end-http-2-and-grpc/[Application Load Balancer Support for End-to-End HTTP/2 and gRPC]. + +For more information on how Elastic services gRPC requests, see +https://github.com/elastic/apm-server/blob/main/dev_docs/otel.md#muxing-grpc-and-http11[Muxing gRPC and HTTP/1.1]. + +[discrete] +[[apm-agents-opentelemetry-opentelemetry-native-support-next-steps]] +== Next steps + +* <> +* Add <> +* Learn about the <> diff --git a/docs/en/serverless/apm-agents/apm-agents-opentelemetry-resource-attributes.asciidoc b/docs/en/serverless/apm-agents/apm-agents-opentelemetry-resource-attributes.asciidoc new file mode 100644 index 0000000000..4d105ebc19 --- /dev/null +++ b/docs/en/serverless/apm-agents/apm-agents-opentelemetry-resource-attributes.asciidoc @@ -0,0 +1,46 @@ +[[apm-agents-opentelemetry-resource-attributes]] += Resource attributes + +:keywords: serverless, observability, how-to + +preview:[] + +A resource attribute is a key/value pair containing information about the entity producing telemetry. +Resource attributes are mapped to Elastic Common Schema (ECS) fields like `service.*`, `cloud.*`, `process.*`, etc. +These fields describe the service and the environment that the service runs in. + +The examples shown here set the Elastic (ECS) `service.environment` field for the resource, i.e. service, that is producing trace events. +Note that Elastic maps the OpenTelemetry `deployment.environment` field to +the ECS `service.environment` field on ingestion. + +**OpenTelemetry agent** + +Use the `OTEL_RESOURCE_ATTRIBUTES` environment variable to pass resource attributes at process invocation. + +[source,bash] +---- +export OTEL_RESOURCE_ATTRIBUTES=deployment.environment=production +---- + +**OpenTelemetry collector** + +Use the https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/processor/resourceprocessor[resource processor] to set or apply changes to resource attributes. + +[source,yaml] +---- +... +processors: + resource: + attributes: + - key: deployment.environment + action: insert + value: production +... +---- + +[TIP] +==== +Need to add event attributes instead? +Use attributes—not to be confused with resource attributes—to add data to span, log, or metric events. +Attributes can be added as a part of the OpenTelemetry instrumentation process or with the https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/processor/attributesprocessor[attributes processor]. +==== diff --git a/docs/en/serverless/apm-agents/apm-agents-opentelemetry.asciidoc b/docs/en/serverless/apm-agents/apm-agents-opentelemetry.asciidoc new file mode 100644 index 0000000000..6fd79b4c1d --- /dev/null +++ b/docs/en/serverless/apm-agents/apm-agents-opentelemetry.asciidoc @@ -0,0 +1,131 @@ +[[apm-agents-opentelemetry]] += Use OpenTelemetry with APM + +:keywords: serverless, observability, overview + +preview:[] + +[NOTE] +==== +For a complete overview of using OpenTelemetry with Elastic, explore https://github.com/elastic/opentelemetry[Elastic Distributions of OpenTelemetry]. +==== + +https://opentelemetry.io/docs/concepts/what-is-opentelemetry/[OpenTelemetry] is a set of APIs, SDKs, tooling, and integrations that enable the capture and management of telemetry data from your services and applications. + +Elastic integrates with OpenTelemetry, allowing you to reuse your existing instrumentation to easily send observability data to the Elastic Stack. There are several ways to integrate OpenTelemetry with the Elastic Stack: + +* <> +* <> +* <> +* <> + +[discrete] +[[apm-agents-opentelemetry-elastic-distributions-of-opentelemetry-language-sdks]] +== Elastic Distributions of OpenTelemetry language SDKs + +preview::[] + +Elastic offers several distributions of OpenTelemetry language SDKs. A _distribution_ is a customized version of an upstream OpenTelemetry repository. Each Elastic Distribution of OpenTelemetry is a customized version of an https://opentelemetry.io/docs/languages/[OpenTelemetry language SDK]. + +[role="screenshot"] +image::images/apm-otel-distro.png[] + +With an Elastic Distribution of OpenTelemetry language SDK you have access to all the features of the OpenTelemetry SDK that it customizes, plus: + +* You may get access to SDK improvements and bug fixes contributed by the Elastic team _before_ the changes are available upstream in the OpenTelemetry repositories. +* The distribution preconfigures the collection of tracing and metrics signals, applying some opinionated defaults, such as which sources are collected by default. + +// Why you wouldn't choose this method + +// Just that it's still in tech preview? + +// Where to go next + +Get started with an Elastic Distribution of OpenTelemetry language SDK: + +* https://github.com/elastic/elastic-otel-java[**Elastic Distribution of OpenTelemetry Java →**] +* preview:[] https://github.com/elastic/elastic-otel-dotnet[**Elastic Distribution of OpenTelemetry .NET →**] +* preview:[] https://github.com/elastic/elastic-otel-node[**Elastic Distribution of OpenTelemetry Node.js →**] +* preview:[] https://github.com/elastic/elastic-otel-python[**Elastic Distribution of OpenTelemetry Python →**] +* preview:[] https://github.com/elastic/elastic-otel-php[**Elastic Distribution of OpenTelemetry PHP →**] + +[NOTE] +==== +For more details about OpenTelemetry distributions in general, visit the https://opentelemetry.io/docs/concepts/distributions[OpenTelemetry documentation]. +==== + +[discrete] +[[apm-agents-opentelemetry-upstream-opentelemetry-apisdk-elastic-apm-agent]] +== Upstream OpenTelemetry API/SDK + Elastic APM agent + +Use the OpenTelemetry API/SDKs with <> to translate OpenTelemetry API calls to Elastic APM API calls. + +[role="screenshot"] +image::images/apm-otel-api-sdk-elastic-agent.png[] + +// Why you _would_ choose this method + +This allows you to reuse your existing OpenTelemetry instrumentation to create Elastic APM transactions and spans — avoiding vendor lock-in and having to redo manual instrumentation. + +// Why you would _not_ choose this method + +However, not all features of the OpenTelemetry API are supported when using this approach, and not all Elastic APM agents support this approach. + +// Where to go next + +Find more details about how to use an OpenTelemetry API or SDK with an Elastic APM agent and which OpenTelemetry API features are supported in the APM agent documentation: + +* https://www.elastic.co/guide/en/apm/agent/java/current/opentelemetry-bridge.html[**APM Java agent →**] +* https://www.elastic.co/guide/en/apm/agent/dotnet/current/opentelemetry-bridge.html[**APM .NET agent →**] +* https://www.elastic.co/guide/en/apm/agent/nodejs/current/opentelemetry-bridge.html[**APM Node.js agent →**] +* https://www.elastic.co/guide/en/apm/agent/python/current/opentelemetry-bridge.html[**APM Python agent →**] + +[discrete] +[[apm-agents-opentelemetry-upstream-opentelemetry-collector-and-language-sdks]] +== Upstream OpenTelemetry Collector and language SDKs + +The Elastic Stack natively supports the OpenTelemetry protocol (OTLP). This means trace data and metrics collected from your applications and infrastructure by an OpenTelemetry Collector or OpenTelemetry language SDK can be sent to the Elastic Stack. + +You can set up an https://opentelemetry.io/docs/collector/[OpenTelemetry Collector], instrument your application with an https://opentelemetry.io/docs/languages/[OpenTelemetry language SDK] that sends data to the collector, and use the collector to process and export the data to APM Server. + +[role="screenshot"] +image::images/apm-otel-api-sdk-collector.png[] + +[NOTE] +==== +It's also possible to send data directly to APM Server from an upstream OpenTelemetry SDK. You might do this during development or if you're monitoring a small-scale application. Read more about when to use a collector in the https://opentelemetry.io/docs/collector/#when-to-use-a-collector[OpenTelemetry documentation]. +==== + +// Why you _would_ choose this approach + +This approach works well when you need to instrument a technology that Elastic doesn't provide a solution for. For example, if you want to instrument C or C++ you could use the https://github.com/open-telemetry/opentelemetry-cpp[OpenTelemetry C++ client]. + +// Other languages include erlang, lua, perl. + +// Why you would _not_ choose this approach + +However, there are some limitations when using collectors and language SDKs built and maintainedby OpenTelemetry, including: + +* Elastic can't provide implementation support on how to use upstream OpenTelemetry tools. +* You won't have access to Elastic enterprise APM features. +* You may experience problems with performance efficiency. + +For more on the limitations associated with using upstream OpenTelemetry tools, refer to <>. + +// Where to go next + +<> + +[discrete] +[[apm-agents-opentelemetry-aws-lambda-collector-exporter]] +== AWS Lambda collector exporter + +AWS Lambda functions can be instrumented with OpenTelemetry and monitored with Elastic Observability. + +// Do we want to say anything about why you would/wouldn't choose this method to send data to Elastic? + +// Where to go next + +To get started, follow the official AWS Distro for OpenTelemetry Lambda documentation, and configure the OpenTelemetry Collector to output traces and metrics to your Elastic cluster: + +https://aws-otel.github.io/docs/getting-started/lambda[**Get started with the AWS Distro for OpenTelemetry Lambda**^] diff --git a/docs/en/serverless/apm/apm-compress-spans.asciidoc b/docs/en/serverless/apm/apm-compress-spans.asciidoc new file mode 100644 index 0000000000..2ec9eb36f6 --- /dev/null +++ b/docs/en/serverless/apm/apm-compress-spans.asciidoc @@ -0,0 +1,96 @@ +[[apm-compress-spans]] += Compress spans + +:description: Compress similar or identical spans to reduce storage overhead, processing power needed, and clutter in the Applications UI. +:keywords: serverless, observability, how-to + +preview:[] + +In some cases, APM agents may collect large amounts of very similar or identical spans in a transaction. +For example, this can happen if spans are captured inside a loop or in unoptimized SQL queries that use multiple +queries instead of joins to fetch related data. + +In such cases, the upper limit of spans per transaction (by default, 500 spans) can be reached quickly, causing the agent to stop capturing potentially more relevant spans for a given transaction. + +Capturing similar or identical spans often isn't helpful, especially if they are of very short duration. +They can also clutter the UI, and cause processing and storage overhead. + +To address this problem, APM agents can compress similar spans into a single span. +The compressed span retains most of the original span information, including the overall duration and number of spans it represents. + +Regardless of the compression strategy, a span is eligible for compression if: + +* It has not propagated its trace context. +* It is an _exit_ span (such as database query spans). +* Its outcome is not `"failure"`. + +[discrete] +[[apm-compress-spans-compression-strategies]] +== Compression strategies + +The {apm-agent} selects between two strategies to decide if adjacent spans can be compressed. +In both strategies, only one previous span needs to be kept in memory. +This ensures that the agent doesn't require large amounts of memory to enable span compression. + +[discrete] +[[apm-compress-spans-same-kind-strategy]] +=== Same-Kind strategy + +The agent uses the same-kind strategy if two adjacent spans have the same: + +* span type +* span subtype +* `destination.service.resource` (e.g. database name) + +[discrete] +[[apm-compress-spans-exact-match-strategy]] +=== Exact-Match strategy + +The agent uses the exact-match strategy if two adjacent spans have the same: + +* span name +* span type +* span subtype +* `destination.service.resource` (e.g. database name) + +[discrete] +[[apm-compress-spans-settings]] +== Settings + +You can specify the maximum span duration in the agent's configuration settings. +Spans with a duration longer than the specified value will not be compressed. + +For the "Same-Kind" strategy, the default maximum span duration is 0 milliseconds, which means that +the "Same-Kind" strategy is disabled by default. +For the "Exact-Match" strategy, the default limit is 50 milliseconds. + +[discrete] +[[apm-compress-spans-agent-support]] +=== Agent support + +Support for span compression is available in the following agents and can be configured +using the options listed below: + +|=== +| Agent| Same-kind config| Exact-match config + +| **Go agent** +| {apm-go-ref-v}/configuration.html#config-span-compression-same-kind-duration[`ELASTIC_APM_SPAN_COMPRESSION_SAME_KIND_MAX_DURATION`] +| {apm-go-ref-v}/configuration.html#config-span-compression-exact-match-duration[`ELASTIC_APM_SPAN_COMPRESSION_EXACT_MATCH_MAX_DURATION`] + +| **Java agent** +| {apm-java-ref-v}/config-huge-traces.html#config-span-compression-same-kind-max-duration[`span_compression_same_kind_max_duration`] +| {apm-java-ref-v}/config-huge-traces.html#config-span-compression-exact-match-max-duration[`span_compression_exact_match_max_duration`] + +| **.NET agent** +| {apm-dotnet-ref-v}/config-core.html#config-span-compression-same-kind-max-duration[`SpanCompressionSameKindMaxDuration`] +| {apm-dotnet-ref-v}/config-core.html#config-span-compression-exact-match-max-duration[`SpanCompressionExactMatchMaxDuration`] + +| **Node.js agent** +| {apm-node-ref-v}/configuration.html#span-compression-same-kind-max-duration[`spanCompressionSameKindMaxDuration`] +| {apm-node-ref-v}/configuration.html#span-compression-exact-match-max-duration[`spanCompressionExactMatchMaxDuration`] + +| **Python agent** +| {apm-py-ref-v}/configuration.html#config-span-compression-same-kind-max-duration[`span_compression_same_kind_max_duration`] +| {apm-py-ref-v}/configuration.html#config-span-compression-exact-match-max_duration[`span_compression_exact_match_max_duration`] +|=== diff --git a/docs/en/serverless/apm/apm-create-custom-links.asciidoc b/docs/en/serverless/apm/apm-create-custom-links.asciidoc new file mode 100644 index 0000000000..b846eb8d07 --- /dev/null +++ b/docs/en/serverless/apm/apm-create-custom-links.asciidoc @@ -0,0 +1,304 @@ +[[apm-create-custom-links]] += Create custom links + +:keywords: serverless, observability, how-to + +preview:[] + +:role: Editor +:goal: create and manage custom links +include::../partials/roles.asciidoc[] +:role!: + +:goal!: + +Elastic's custom link feature allows you to easily create up to 500 dynamic links +based on your specific APM data. +Custom links can be filtered to only appear for relevant services, +environments, transaction types, or transaction names. + +Ready to dive in? Jump straight to the <>. + +[discrete] +[[apm-create-custom-links-create-a-link]] +== Create a link + +Each custom link consists of a label, URL, and optional filter. +The easiest way to create a custom link is from within the actions dropdown in the transaction detail page. +This method will automatically apply filters, scoping the link to that specific service, +environment, transaction type, and transaction name. + +Alternatively, you can create a custom link by navigating to any page within **Applications** and selecting **Settings** → **Custom Links** → **Create custom link**. + +[discrete] +[[apm-create-custom-links-label]] +=== Label + +The name of your custom link. +The actions context menu displays this text, so keep it as short as possible. + +[TIP] +==== +Custom links are displayed alphabetically in the actions menu. +==== + +[discrete] +[[apm-create-custom-links-url]] +=== URL + +The URL your link points to. +URLs support dynamic field name variables, encapsulated in double curly brackets: `{{field.name}}`. +These variables will be replaced with transaction metadata when the link is clicked. + +Because everyone's data is different, +you'll need to examine your traces to see what metadata is available for use. +To do this, select a trace and click **Metadata** in the **Trace Sample** table. + +[role="screenshot"] +image::images/custom-links/example-metadata.png[Example metadata] + +[discrete] +[[apm-create-custom-links-filters]] +=== Filters + +Filter each link to only appear for specific services or transactions. +You can filter on the following fields: + +* `service.name` +* `service.env` +* `transaction.type` +* `transaction.name` + +Multiple values are allowed when comma-separated. + +[discrete] +[[apm-create-custom-links-custom-link-examples]] +== Custom link examples + +Not sure where to start with custom links? +Take a look at the examples below and customize them to your liking! + +[discrete] +[[apm-create-custom-links-email]] +=== Email + +Email the owner of a service. + +// TODO: If we change these to Docsmobile tables they might look better + +|=== +| | + +| Label +| `Email engineer` + +| Link +| `mailto:@.com` + +| Filters +| `service.name:` +|=== + +**Example** + +This link opens an email addressed to the team or owner of `python-backend`. +It will only appear on services with the name `python-backend`. + +|=== +| | + +| Label +| `Email python-backend engineers` + +| Link +| `mailto:python_team@elastic.co` + +| Filters +| `service.name:python-backend` +|=== + +[discrete] +[[apm-create-custom-links-github-issue]] +=== GitHub issue + +Open a GitHub issue with prepopulated metadata from the selected trace sample. + +|=== +| | + +| Label +| `Open an issue in ` + +| Link +| `https://github.com///issues/new?title=&body=<BODY>` + +| Filters +| `service.name:client` +|=== + +**Example** + +This link opens a new GitHub issue in the apm-agent-rum repository. +It populates the issue body with relevant metadata from the currently active trace. +Clicking this link results in the following issue being created: + +[role="screenshot"] +image::images/custom-links/create-github-issue.png[Example github issue] + +|=== +| | + +| Label +| `Open an issue in apm-rum-js` + +| Link +| `https://github.com/elastic/apm-agent-rum-js/issues/new?title=Investigate+APM+trace&body=Investigate+the+following+APM+trace%3A%0D%0A%0D%0Aservice.name%3A+{{service.name}}%0D%0Atransaction.id%3A+{{transaction.id}}%0D%0Acontainer.id%3A+{{container.id}}%0D%0Aurl.full%3A+{{url.full}}` + +| Filters +| `service.name:client` +|=== + +See the https://help.github.com/en/github/managing-your-work-on-github/about-automation-for-issues-and-pull-requests-with-query-parameters[GitHub automation documentation] for a full list of supported query parameters. + +[discrete] +[[custom-links-examples-jira]] +=== Jira task + +Create a Jira task with prepopulated metadata from the selected trace sample. + +|=== +| | + +| Label +| `Open an issue in Jira` + +| Link +| `https://<JIRA_BASE_URL>/secure/CreateIssueDetails!init.jspa?<ARGUMENTS>` +|=== + +**Example** + +This link creates a new task on the Engineering board in Jira. +It populates the issue body with relevant metadata from the currently active trace. +Clicking this link results in the following task being created in Jira: + +[role="screenshot"] +image::images/custom-links/create-jira-issue.png[Example jira issue] + +|=== +| | + +| Label +| `Open a task in Jira` + +| Link +| `https://test-site-33.atlassian.net/secure/CreateIssueDetails!init.jspa?pid=10000&issuetype=10001&summary=Created+via+APM&description=Investigate+the+following+APM+trace%3A%0D%0A%0D%0Aservice.name%3A+{{service.name}}%0D%0Atransaction.id%3A+{{transaction.id}}%0D%0Acontainer.id%3A+{{container.id}}%0D%0Aurl.full%3A+{{url.full}}` +|=== + +See the https://confluence.atlassian.com/jirakb/how-to-create-issues-using-direct-html-links-in-jira-server-159474.html[Jira application administration knowledge base] +for a full list of supported query parameters. + +[discrete] +[[apm-create-custom-links-dashboards]] +=== Dashboards + +Link to a custom dashboard. + +|=== +| | + +| Label +| `Open transaction in custom visualization` + +| Link +| `https://kibana-instance/app/kibana#/dashboard?_g=query:(language:kuery,query:'transaction.id:{{transaction.id}}'...` +|=== + +**Example** + +This link opens the current `transaction.id` in a custom dashboard. +There are no filters set. + +|=== +| | + +| Label +| `Open transaction in Python drilldown viz` + +| URL +| `https://kibana-instance/app/kibana#/dashboard?_g=(filters:!(),refreshInterval:(pause:!t,value:0),time:(from:now-24h,to:now))&_a=(description:'',filters:!(),fullScreenMode:!f,options:(hidePanelTitles:!f,useMargins:!t),panels:!((embeddableConfig:(),gridData:(h:15,i:cb79c1c0-1af8-472c-aaf7-d158a76946fb,w:24,x:0,y:0),id:c8c74b20-6a30-11ea-92ab-b5d3feff11df,panelIndex:cb79c1c0-1af8-472c-aaf7-d158a76946fb,type:visualization,version:'7.7')),query:(language:kuery,query:'transaction.id:{{transaction.id}}'),timeRestore:!f,title:'',viewMode:edit)` +|=== + +[discrete] +[[apm-create-custom-links-slack-channel]] +=== Slack channel + +Open a specified slack channel. + +|=== +| | + +| Label +| `Open SLACK_CHANNEL` + +| Link +| `https://COMPANY_SLACK.slack.com/archives/SLACK_CHANNEL` + +| Filters +| `service.name` : `SERVICE_NAME` +|=== + +**Example** + +This link opens a company slack channel, #apm-user-support. +It only appears when `transaction.name` is `GET user/login`. + +|=== +| | + +| Label +| `Open #apm-user-support` + +| Link +| `https://COMPANY_SLACK.slack.com/archives/efk52kt23k` + +| Filters +| `transaction.name:GET user/login` +|=== + +[discrete] +[[apm-create-custom-links-website]] +=== Website + +Open an internal or external website. + +|=== +| | + +| Label +| `Open <WEBSITE>` + +| Link +| `https://<COMPANY_SLACK>.slack.com/archives/<SLACK_CHANNEL>` + +| Filters +| `service.name:<SERVICE_NAME>` +|=== + +**Example** + +This link opens more data on a specific `user.email`. +It only appears on front-end transactions. + +|=== +| | + +| Label +| `View user internally` + +| Link +| `https://internal-site.company.com/user/{{user.email}}` + +| Filters +| `service.name:client` +|=== diff --git a/docs/en/serverless/apm/apm-data-types.asciidoc b/docs/en/serverless/apm/apm-data-types.asciidoc new file mode 100644 index 0000000000..1fde31466b --- /dev/null +++ b/docs/en/serverless/apm/apm-data-types.asciidoc @@ -0,0 +1,20 @@ +[[apm-data-types]] += APM data types + +:description: Learn about the various APM data types. +:keywords: serverless, observability, overview + +preview:[] + +Elastic APM agents capture different types of information from within their instrumented applications. +These are known as events, and can be spans, transactions, errors, or metrics: + +* **Spans** contain information about the execution of a specific code path. +They measure from the start to the end of an activity, and they can have a parent/child +relationship with other spans. +* **Transactions** are a special kind of _span_ that have additional attributes associated with them. +They describe an event captured by an Elastic {apm-agent} instrumenting a service. +You can think of transactions as the highest level of work you’re measuring within a service. +* **Errors** contain at least information about the original `exception` that occurred or about +a `log` created when the exception occurred. For simplicity, errors are represented by a unique ID. +* **Metrics** measure the state of a system by gathering information on a regular interval. diff --git a/docs/en/serverless/apm/apm-distributed-tracing.asciidoc b/docs/en/serverless/apm/apm-distributed-tracing.asciidoc new file mode 100644 index 0000000000..5dc0724ce6 --- /dev/null +++ b/docs/en/serverless/apm/apm-distributed-tracing.asciidoc @@ -0,0 +1,136 @@ +[[apm-distributed-tracing]] += Distributed tracing + +:description: Understand how a single request that travels through multiple services impacts your application. +:keywords: serverless, observability, how-to + +preview:[] + +A `trace` is a group of <<apm-data-types,transactions>> and <<apm-data-types,spans>> with a common root. +Each `trace` tracks the entirety of a single request. +When a `trace` travels through multiple services, as is common in a microservice architecture, +it is known as a distributed trace. + +[discrete] +[[apm-distributed-tracing-why-is-distributed-tracing-important]] +== Why is distributed tracing important? + +Distributed tracing enables you to analyze performance throughout your microservice architecture +by tracing the entirety of a request — from the initial web request on your front-end service +all the way to database queries made on your back-end services. + +Tracking requests as they propagate through your services provides an end-to-end picture of +where your application is spending time, where errors are occurring, and where bottlenecks are forming. +Distributed tracing eliminates individual service's data silos and reveals what's happening outside of +service borders. + +For supported technologies, distributed tracing works out-of-the-box, with no additional configuration required. + +[discrete] +[[apm-distributed-tracing-how-distributed-tracing-works]] +== How distributed tracing works + +Distributed tracing works by injecting a custom `traceparent` HTTP header into outgoing requests. +This header includes information, like `trace-id`, which is used to identify the current trace, +and `parent-id`, which is used to identify the parent of the current span on incoming requests +or the current span on an outgoing request. + +When a service is working on a request, it checks for the existence of this HTTP header. +If it's missing, the service starts a new trace. +If it exists, the service ensures the current action is added as a child of the existing trace, +and continues to propagate the trace. + +[discrete] +[[apm-distributed-tracing-trace-propagation-examples]] +=== Trace propagation examples + +In this example, Elastic's Ruby agent communicates with Elastic's Java agent. +Both support the `traceparent` header, and trace data is successfully propagated. + +[role="screenshot"] +image::images/distributed-tracing/dt-trace-ex1.png[How traceparent propagation works] + +In this example, Elastic's Ruby agent communicates with OpenTelemetry's Java agent. +Both support the `traceparent` header, and trace data is successfully propagated. + +[role="screenshot"] +image::images/distributed-tracing/dt-trace-ex2.png[How traceparent propagation works] + +In this example, the trace meets a piece of middleware that doesn't propagate the `traceparent` header. +The distributed trace ends and any further communication will result in a new trace. + +[role="screenshot"] +image::images/distributed-tracing/dt-trace-ex3.png[How traceparent propagation works] + +[discrete] +[[apm-distributed-tracing-w3c-trace-context-specification]] +=== W3C Trace Context specification + +All Elastic agents now support the official W3C Trace Context specification and `traceparent` header. +See the table below for the minimum required agent version: + +|=== +| Agent name| Agent Version + +| **Go Agent** +| ≥`1.6` + +| **Java Agent** +| ≥`1.14` + +| **.NET Agent** +| ≥`1.3` + +| **Node.js Agent** +| ≥`3.4` + +| **PHP Agent** +| ≥`1.0` + +| **Python Agent** +| ≥`5.4` + +| **Ruby Agent** +| ≥`3.5` +|=== + +[NOTE] +==== +Older Elastic agents use a unique `elastic-apm-traceparent` header. +For backward-compatibility purposes, new versions of Elastic agents still support this header. +==== + +[discrete] +[[apm-distributed-tracing-visualize-distributed-tracing]] +== Visualize distributed tracing + +APM's timeline visualization provides a visual deep-dive into each of your application's traces: + +[role="screenshot"] +image::images/spans/apm-distributed-tracing.png[Example view of the distributed tracing in Elastic APM] + +[discrete] +[[apm-distributed-tracing-manual-distributed-tracing]] +== Manual distributed tracing + +Elastic agents automatically propagate distributed tracing context for supported technologies. +If your service communicates over a different, unsupported protocol, +you can manually propagate distributed tracing context from a sending service to a receiving service +with each agent's API. + +[discrete] +[[apm-distributed-tracing-add-the-traceparent-header-to-outgoing-requests]] +=== Add the `traceparent` header to outgoing requests + +Sending services must add the `traceparent` header to outgoing requests. + +include::../transclusion/apm/guide/tab-widgets/distributed-trace-send-widget.asciidoc[] + +[discrete] +[[distributed-tracing-incoming]] +=== Parse the `traceparent` header on incoming requests + +Receiving services must parse the incoming `traceparent` header, +and start a new transaction or span as a child of the received context. + +include::../transclusion/apm/guide/tab-widgets/distributed-trace-receive-widget.asciidoc[] diff --git a/docs/en/serverless/apm/apm-filter-your-data.asciidoc b/docs/en/serverless/apm/apm-filter-your-data.asciidoc new file mode 100644 index 0000000000..da2df13221 --- /dev/null +++ b/docs/en/serverless/apm/apm-filter-your-data.asciidoc @@ -0,0 +1,49 @@ +[[apm-filter-your-data]] += Filter your data + +:keywords: serverless, observability, how-to + +preview:[] + +Global filters are ways you can filter your APM data based on a specific +time range or environment. When viewing a specific service, the filter persists +as you move between tabs. + +[role="screenshot"] +image::images/filters/global-filters.png[Global filters view] + +[NOTE] +==== +If you prefer to use advanced queries on your data to filter on specific pieces +of information, see <<apm-query-your-data,Query your data>>. +==== + +[discrete] +[[apm-filter-your-data-global-time-range]] +== Global time range + +The global time range filter restricts APM data to a specific time period. + +[discrete] +[[apm-filter-your-data-service-environment-filter]] +== Service environment filter + +The environment selector is a global filter for `service.environment`. +It allows you to view only relevant data and is especially useful for separating development from production environments. +By default, all environments are displayed. If there are no environment options, you'll see "not defined". + +Service environments are defined when configuring your APM agents. +It's vital to be consistent when naming environments in your APM agents. +To learn how to configure service environments, see the specific APM agent documentation: + +* **Go:** {apm-go-ref}/configuration.html#config-environment[`ELASTIC_APM_ENVIRONMENT`] +* **Java:** {apm-java-ref}/config-core.html#config-environment[`environment`] +* **.NET:** {apm-dotnet-ref}/config-core.html#config-environment[`Environment`] +* **Node.js:** {apm-node-ref}/configuration.html#environment[`environment`] +* **PHP:** {apm-php-ref}/configuration-reference.html#config-environment[`environment`] +* **Python:** {apm-py-ref}/configuration.html#config-environment[`environment`] +* **Ruby:** {apm-ruby-ref}/configuration.html#config-environment[`environment`] + +// * **iOS agent:** _Not yet supported_ + +// * **Real User Monitoring:** [`environment`]{(apm-rum-ref}/configuration.html#environment) diff --git a/docs/en/serverless/apm/apm-find-transaction-latency-and-failure-correlations.asciidoc b/docs/en/serverless/apm/apm-find-transaction-latency-and-failure-correlations.asciidoc new file mode 100644 index 0000000000..2acf24fa0b --- /dev/null +++ b/docs/en/serverless/apm/apm-find-transaction-latency-and-failure-correlations.asciidoc @@ -0,0 +1,99 @@ +[[apm-find-transaction-latency-and-failure-correlations]] += Find transaction latency and failure correlations + +:keywords: serverless, observability, how-to + +preview:[] + +Correlations surface attributes of your data that are potentially correlated +with high-latency or erroneous transactions. For example, if you are a site +reliability engineer who is responsible for keeping production systems up and +running, you want to understand what is causing slow transactions. Identifying +attributes that are responsible for higher latency transactions can potentially +point you toward the root cause. You may find a correlation with a particular +piece of hardware, like a host or pod. Or, perhaps a set of users, based on IP +address or region, is facing increased latency due to local data center issues. + +To find correlations: + +. In your {observability} project, go to **Applications** → **Services**. +. Select a service. +. Select the **Transactions** tab. +. Select a transaction group in the **Transactions** table. + +[NOTE] +==== +Active queries _are_ applied to correlations. +==== + +[discrete] +[[apm-find-transaction-latency-and-failure-correlations-find-high-transaction-latency-correlations]] +== Find high transaction latency correlations + +The correlations on the **Latency correlations** tab help you discover which +attributes are contributing to increased transaction latency. + +[role="screenshot"] +image::images/transactions/correlations-hover.png[APM latency correlations] + +The progress bar indicates the status of the asynchronous analysis, which +performs statistical searches across a large number of attributes. For large +time ranges and services with high transaction throughput, this might take some +time. To improve performance, reduce the time range. + +The latency distribution chart visualizes the overall latency of the +transactions in the transaction group. If there are attributes that have a +statistically significant correlation with slow response times, they are listed +in a table below the chart. The table is sorted by correlation coefficients that +range from 0 to 1. Attributes with higher correlation values are more likely to +contribute to high latency transactions. By default, the attribute with the +highest correlation value is added to the chart. To see the latency distribution +for other attributes, select their row in the table. + +If a correlated attribute seems noteworthy, use the **Filter** quick links: + +* `+` creates a new query in the Applications UI for filtering transactions containing +the selected value. +* `-` creates a new query in the Applications UI to filter out transactions containing +the selected value. + +You can also click the icon beside the field name to view and filter its most +popular values. + +In this example screenshot, there are transactions that are skewed to the right +with slower response times than the overall latency distribution. If you select +the `+` filter in the appropriate row of the table, it creates a new query in +the Applications UI for transactions with this attribute. With the "noise" now +filtered out, you can begin viewing sample traces to continue your investigation. + +[discrete] +[[correlations-error-rate]] +== Find failed transaction correlations + +The correlations on the **Failed transaction correlations** tab help you discover +which attributes are most influential in distinguishing between transaction +failures and successes. In this context, the success or failure of a transaction +is determined by its {ecs-ref}/ecs-event.html#field-event-outcome[event.outcome] +value. For example, APM agents set the `event.outcome` to `failure` when an HTTP +transaction returns a `5xx` status code. + +The chart highlights the failed transactions in the overall latency distribution +for the transaction group. If there are attributes that have a statistically +significant correlation with failed transactions, they are listed in a table. +The table is sorted by scores, which are mapped to high, medium, or low impact +levels. Attributes with high impact levels are more likely to contribute to +failed transactions. By default, the attribute with the highest score is added +to the chart. To see a different attribute in the chart, select its row in the +table. + +For example, in the screenshot below, there are attributes such as a specific +node and pod name that have medium impact on the failed transactions. + +[role="screenshot"] +image::images/correlations/correlations-failed-transactions.png[Failed transaction correlations] + +Select the `+` filter to create a new query in the Applications UI for transactions +with one or more of these attributes. If you are unfamiliar with a field, click +the icon beside its name to view its most popular values and optionally filter +on those values too. Each time that you add another attribute, it is filtering +out more and more noise and bringing you closer to a diagnosis. diff --git a/docs/en/serverless/apm/apm-get-started.asciidoc b/docs/en/serverless/apm/apm-get-started.asciidoc new file mode 100644 index 0000000000..c4958bb02a --- /dev/null +++ b/docs/en/serverless/apm/apm-get-started.asciidoc @@ -0,0 +1,186 @@ +[[apm-get-started]] += Get started with traces and APM + +:description: Learn how to collect Application Performance Monitoring (APM) data and visualize it in real time. +:keywords: serverless, observability, how-to + +preview:[] + +:role: Admin +:goal: send APM data to Elastic +include::../partials/roles.asciidoc[] +:role!: + +:goal!: + +In this guide you'll learn how to collect and send Application Performance Monitoring (APM) data +to Elastic, then explore and visualize the data in real time. + +[discrete] +[[add-apm-integration-agents]] +== Step 1: Add data + +You'll use APM agents to send APM data from your application to Elastic. Elastic offers APM agents +written in several languages and supports OpenTelemetry. Which agent you'll use depends on the language used in your service. + +To send APM data to Elastic, you must install an APM agent and configure it to send data to +your project: + +. <<create-an-observability-project,Create a new {observability} project>>, or open an existing one. +. To install and configure one or more APM agents, do one of following: ++ +** In your Observability project, go to **Add data** → **Monitor my application performance** → **Elastic APM** and follow the prompts. +** Use the following instructions: ++ +-- +++++ +<div class="tabs" data-tab-group="apm-apm-get-started"> + <div role="tablist" aria-label="apm-apm-get-started"> + <button role="tab" aria-selected="true" aria-controls="apm-apm-get-started-go-panel" id="apm-apm-get-started-go-button"> + Go + </button> + <button role="tab" aria-selected="false" aria-controls="apm-apm-get-started-java-panel" id="apm-apm-get-started-java-button" tabindex="-1"> + Java + </button> + <button role="tab" aria-selected="false" aria-controls="apm-apm-get-started-net-panel" id="apm-apm-get-started-net-button" tabindex="-1"> + .NET + </button> + <button role="tab" aria-selected="false" aria-controls="apm-apm-get-started-nodejs-panel" id="apm-apm-get-started-nodejs-button" tabindex="-1"> + Node.js + </button> + <button role="tab" aria-selected="false" aria-controls="apm-apm-get-started-php-panel" id="apm-apm-get-started-php-button" tabindex="-1"> + PHP + </button> + <button role="tab" aria-selected="false" aria-controls="apm-apm-get-started-python-panel" id="apm-apm-get-started-python-button" tabindex="-1"> + Python + </button> + <button role="tab" aria-selected="false" aria-controls="apm-apm-get-started-ruby-panel" id="apm-apm-get-started-ruby-button" tabindex="-1"> + Ruby + </button> + <button role="tab" aria-selected="false" aria-controls="apm-apm-get-started-opentelemetry-panel" id="apm-apm-get-started-opentelemetry-button" tabindex="-1"> + OpenTelemetry + </button> + </div> + <div tabindex="0" role="tabpanel" id="apm-apm-get-started-go-panel" aria-labelledby="apm-apm-get-started-go-button"> +++++ +include::../transclusion/apm/guide/install-agents/go.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="apm-apm-get-started-java-panel" aria-labelledby="apm-apm-get-started-java-button" hidden=""> +++++ +include::../transclusion/apm/guide/install-agents/java.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="apm-apm-get-started-net-panel" aria-labelledby="apm-apm-get-started-net-button" hidden=""> +++++ +include::../transclusion/apm/guide/install-agents/net.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="apm-apm-get-started-nodejs-panel" aria-labelledby="apm-apm-get-started-nodejs-button" hidden=""> +++++ +include::../transclusion/apm/guide/install-agents/node.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="apm-apm-get-started-php-panel" aria-labelledby="apm-apm-get-started-php-button" hidden=""> +++++ +include::../transclusion/apm/guide/install-agents/php.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="apm-apm-get-started-python-panel" aria-labelledby="apm-apm-get-started-python-button" hidden=""> +++++ +include::../transclusion/apm/guide/install-agents/python.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="apm-apm-get-started-ruby-panel" aria-labelledby="apm-apm-get-started-ruby-button" hidden=""> +++++ +include::../transclusion/apm/guide/install-agents/ruby.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="apm-apm-get-started-opentelemetry-panel" aria-labelledby="apm-apm-get-started-opentelemetry-button" hidden=""> +++++ +include::../transclusion/apm/guide/open-telemetry/otel-get-started.asciidoc[] + +++++ + </div> +</div> +++++ +-- ++ +While there are many configuration options, all APM agents require: ++ +|=== +| Option | Description + +| **Service name** +a| The APM integration maps an instrumented service's name — defined in +each {apm-agent}'s configuration — to the index where its data is stored. +Service names are case-insensitive and must be unique. + +For example, you cannot have a service named `Foo` and another named `foo`. +Special characters will be removed from service names and replaced with underscores (`_`). + +| **Server URL** +a| The host and port that the managed intake service listens for events on. + +To find the URL for your project: + +. Go to the https://cloud.elastic.co/[Cloud console]. +. Next to your project, select **Manage**. +. Next to _Endpoints_, select **View**. +. Copy the _APM endpoint_. + +| **API key** +a| Authentication method for communication between {apm-agent} and the managed intake service. + +You can create and delete API keys in Applications Settings: + +. Go to any page in the _Applications_ section of the main menu. +. Click **Settings** in the top bar. +. Go to the **Agent keys** tab. + +| **Environment** +a| The name of the environment this service is deployed in, for example "production" or "staging". + +Environments allow you to easily filter data on a global level in the UI. +It's important to be consistent when naming environments across agents. +|=== +. If you're using the step-by-step instructions in the UI, after you've installed and configured an agent, +you can click **Check Agent Status** to verify that the agent is sending data. + +To learn more about APM agents, including how to fine-tune how agents send traces to Elastic, +refer to <<apm-send-data-to-elastic>>. + +[discrete] +[[view-apm-integration-data]] +== Step 2: View your data + +After one or more APM agents are installed and successfully sending data, you can view +application performance monitoring data in the UI. + +In the _Applications_ section of the main menu, select **Services**. +This will show a high-level overview of the health and general performance of all your services. + +Learn more about visualizing APM data in <<apm-view-and-analyze-traces>>. + +// TO DO: ADD SCREENSHOT + +[TIP] +==== +Not seeing any data? Find helpful tips in <<apm-troubleshooting,Troubleshooting>>. +==== + +[discrete] +[[apm-get-started-next-steps]] +== Next steps + +Now that data is streaming into your project, take your investigation to a +deeper level. Learn how to use <<apm-view-and-analyze-traces,Elastic's built-in visualizations for APM data>>, +<<alerting,alert on APM data>>, +or <<apm-send-data-to-elastic,fine-tune how agents send traces to Elastic>>. diff --git a/docs/en/serverless/apm/apm-integrate-with-machine-learning.asciidoc b/docs/en/serverless/apm/apm-integrate-with-machine-learning.asciidoc new file mode 100644 index 0000000000..ecfa459dbd --- /dev/null +++ b/docs/en/serverless/apm/apm-integrate-with-machine-learning.asciidoc @@ -0,0 +1,73 @@ +[[apm-integrate-with-machine-learning]] += Integrate with machine learning + +:keywords: serverless, observability, how-to + +preview:[] + +The Machine learning integration initiates a new job predefined to calculate anomaly scores on APM transaction durations. +With this integration, you can quickly pinpoint anomalous transactions and see the health of +any upstream and downstream services. + +Machine learning jobs are created per environment and are based on a service's average response time. +Because jobs are created at the environment level, +you can add new services to your existing environments without the need for additional machine learning jobs. + +Results from machine learning jobs are shown in multiple places throughout the Applications UI: + +* The **Services overview** provides a quick-glance view of the general health of all of your services. ++ +//// +/* TODO: Take this screenshot (no data in oblt now) +![Example view of anomaly scores on response times in the Applications UI](images/machine-learning-integration/apm-service-quick-health.png) */ +//// +* The transaction duration chart will show the expected bounds and add an annotation when the anomaly score is 75 or above. ++ +//// +/* TODO: Take this screenshot (no data in oblt now) +![Example view of anomaly scores on response times in the Applications UI](images/machine-learning-integration/apm-apm-ml-integration.png) */ +//// +* Service Maps will display a color-coded anomaly indicator based on the detected anomaly score. ++ +[role="screenshot"] +image::images/service-maps/service-map-anomaly.png[Example view of anomaly scores on service maps in the Applications UI] + +[discrete] +[[apm-integrate-with-machine-learning-enable-anomaly-detection]] +== Enable anomaly detection + +To enable machine learning anomaly detection: + +. In your {observability} project, go to any **Applications** page. +. Click **Anomaly detection**. +. Click **Create Job**. +. Machine learning jobs are created at the environment level. +Select all of the service environments that you want to enable anomaly detection in. +Anomalies will surface for all services and transaction types within the selected environments. +. Click **Create Jobs**. + +That's it! After a few minutes, the job will begin calculating results; +it might take additional time for results to appear on your service maps. +To manage existing jobs, click **Manage jobs** (or go to **AIOps** → **Anomaly detection**). + +[discrete] +[[apm-integrate-with-machine-learning-anomaly-detection-warning]] +== Anomaly detection warning + +To make machine learning as easy as possible to set up, +Elastic will warn you when filtered to an environment without a machine learning job. + +//// +/* TODO: Take this screenshot (no data in oblt now) +![Example view of anomaly alert in the Applications UI](images/machine-learning-integration/apm-apm-anomaly-alert.png) */ +//// + +[discrete] +[[apm-integrate-with-machine-learning-unknown-service-health]] +== Unknown service health + +After enabling anomaly detection, service health may display as "Unknown". Here are some reasons why this can occur: + +. No machine learning job exists. See <<apm-integrate-with-machine-learning-enable-anomaly-detection,Enable anomaly detection>> to enable anomaly detection and create a machine learning job. +. There is no machine learning data for the job. If you just created the machine learning job you'll need to wait a few minutes for data to be available. Alternatively, if the service or its environment are new, you'll need to wait for more trace data. +. No "request" or "page-load" transaction type exists for this service; service health is only available for these transaction types. diff --git a/docs/en/serverless/apm/apm-keep-data-secure.asciidoc b/docs/en/serverless/apm/apm-keep-data-secure.asciidoc new file mode 100644 index 0000000000..7774add26f --- /dev/null +++ b/docs/en/serverless/apm/apm-keep-data-secure.asciidoc @@ -0,0 +1,101 @@ +[[apm-keep-data-secure]] += Keep APM data secure + +:description: Make sure APM data is sent to Elastic securely and sensitive data is protected. +:keywords: serverless, observability, overview + +preview:[] + +:role: Editor +:goal: create and manage API keys +include::../partials/roles.asciidoc[] +:role!: + +:goal!: + +// TODO: Find out whether Editor or Admin is required to create and manage API keys. + +When setting up Elastic APM, it's essential to ensure that the data collected by +APM agents is sent to Elastic securely and that sensitive data is protected. + +[discrete] +[[apm-keep-data-secure-secure-communication-with-apm-agents]] +== Secure communication with APM agents + +Communication between APM agents and the managed intake service is both encrypted and authenticated. +Requests without a valid API key will be denied. + +[discrete] +[[apm-keep-data-secure-create-a-new-api-key]] +=== Create a new API key + +To create a new API key: + +. In your {observability} project, go to any **Applications** page. +. Click **Settings**. +. Select the **APM agent keys** tab. +. Click **Create APM agent key**. +. Name the key and assign privileges to it. +. Click **Create APM agent key**. +. Copy the key now. You will not be able to see it again. API keys do not expire. + +[discrete] +[[apm-keep-data-secure-delete-an-api-key]] +=== Delete an API key + +To delete an API key: + +. From any of the **Application** pages, click **Settings**. +. Select the **APM agent keys** tab. +. Search for the API key you want to delete. +. Click the trash can icon to delete the selected API key. + +[discrete] +[[apm-keep-data-secure-view-existing-api-keys]] +=== View existing API keys + +To view all API keys for your project: + +. Expand **Project settings**. +. Select **Management**. +. Select **API keys**. + +[discrete] +[[apm-keep-data-secure-data-security]] +== Data security + +When setting up Elastic APM, it's essential to review all captured data carefully to ensure it doesn't contain sensitive information like passwords, credit card numbers, or health data. + +Some APM agents offer a way to manipulate or drop APM events _before_ they leave your services. +Refer to the relevant agent's documentation for more information and examples: + +[discrete] +[[apm-keep-data-secure-java]] +=== Java + +**`include_process_args`**: Remove process arguments from transactions. This option is disabled by default. Read more in the {apm-java-ref-v}/config-reporter.html#config-include-process-args[Java agent configuration docs]. + +[discrete] +[[apm-keep-data-secure-net]] +=== .NET + +**Filter API**: Drop APM events _before_ they are sent to Elastic. Read more in the {apm-dotnet-ref-v}/public-api.html#filter-api[.NET agent Filter API docs]. + +[discrete] +[[apm-keep-data-secure-nodejs]] +=== Node.js + +* **`addFilter()`**: Drop APM events _before_ they are sent to Elastic. Read more in the {apm-node-ref-v}/agent-api.html#apm-add-filter[Node.js agent API docs]. +* **`captureExceptions`**: Remove errors raised by the server-side process by disabling the `captureExceptions` configuration option. Read more in {apm-node-ref-v}/configuration.html#capture-exceptions[the Node.js agent configuration docs]. + +[discrete] +[[apm-keep-data-secure-python]] +=== Python + +**Custom processors**: Drop APM events _before_ they are sent to Elastic. Read more in the {apm-py-ref-v}/sanitizing-data.html[Python agent Custom processors docs]. + +[discrete] +[[apm-keep-data-secure-ruby]] +=== Ruby + +**`add_filter()`**: Drop APM events _before_ they are sent to Elastic. Read more in the {apm-ruby-ref-v}/api.html#api-agent-add-filter[Ruby agent API docs]. diff --git a/docs/en/serverless/apm/apm-kibana-settings.asciidoc b/docs/en/serverless/apm/apm-kibana-settings.asciidoc new file mode 100644 index 0000000000..306748d87c --- /dev/null +++ b/docs/en/serverless/apm/apm-kibana-settings.asciidoc @@ -0,0 +1,105 @@ +[[apm-kibana-settings]] += Settings + +:keywords: serverless, observability, reference + +preview:[] + +:role: Editor +:goal: modify settings +include::../partials/roles.asciidoc[] +:role!: + +:goal!: + +You can adjust Application settings to fine-tune your experience in the Applications UI. + +[discrete] +[[apm-kibana-settings-general-settings]] +== General settings + +To change APM settings, select **Settings** from any **Applications** page. +The following settings are available. + +`observability:apmAgentExplorerView`:: + +beta:[] Enables the Agent explorer view. + +`observability:apmAWSLambdaPriceFactor`:: + +Set the price per Gb-second for your AWS Lambda functions. + +`observability:apmAWSLambdaRequestCostPerMillion`:: + +Set the AWS Lambda cost per million requests. + +`observability:apmEnableContinuousRollups`:: + +beta:[] When continuous rollups are enabled, the UI will select metrics with the appropriate resolution. +On larger time ranges, lower resolution metrics will be used, which will improve loading times. + +`observability:apmEnableServiceMetrics`:: + +beta:[] Enables the usage of service transaction metrics, which are low cardinality metrics that can be used by certain views like the service inventory for faster loading times. + +`observability:apmLabsButton`:: + +Enable or disable the APM Labs button — a quick way to enable and disable technical preview features in APM. + +//// +/* [[observability-apm-critical-path]]`observability:apmEnableCriticalPath` +When enabled, displays the critical path of a trace. */ +//// + +//// +/* [[observability-enable-progressive-loading]]`observability:apmProgressiveLoading` +preview:[] When enabled, uses progressive loading of some APM views. +Data may be requested with a lower sampling rate first, with lower accuracy but faster response times, +while the unsampled data loads in the background. */ +//// + +`observability:apmServiceGroupMaxNumberOfServices`:: + +Limit the number of services in a given service group. + +//// +/* [[observability-apm-optimized-sort]]`observability:apmServiceInventoryOptimizedSorting` +preview:[] Sorts services without anomaly detection rules on the APM Service inventory page by service name. */ +//// + +`observability:apmDefaultServiceEnvironment`:: + +Set the default environment for APM. When left empty, data from all environments will be displayed by default. + +`observability:apmEnableProfilingIntegration`:: + +Enable the Universal Profiling integration in APM. + +//// +/* [[observability-enable-aws-lambda-metrics]]`observability:enableAwsLambdaMetrics` +preview:[] Display Amazon Lambda metrics in the service metrics tab. */ +//// + +`observability:enableComparisonByDefault`:: + +Enable the comparison feature by default. + +`observability:enableInspectEsQueries`:: + +When enabled, allows you to inspect Elasticsearch queries in API responses. + +//// +/* [[observability-apm-trace-explorer-tab]]`observability:apmTraceExplorerTab` +preview:[] Enable the APM Trace Explorer feature, that allows you to search and inspect traces with KQL or EQL. */ +//// + +[discrete] +[[apm-kibana-settings-apm-labs]] +== APM Labs + +**APM Labs** allows you to easily try out new features that are technical preview. + +To enable APM labs, go to **Applications** → **Settings** → **General settings** and toggle **Enable labs button in APM**. +Select **Save changes** and refresh the page. + +After enabling **APM Labs** select **Labs** in the toolbar to see the technical preview features available to try out. diff --git a/docs/en/serverless/apm/apm-observe-lambda-functions.asciidoc b/docs/en/serverless/apm/apm-observe-lambda-functions.asciidoc new file mode 100644 index 0000000000..4127ca151a --- /dev/null +++ b/docs/en/serverless/apm/apm-observe-lambda-functions.asciidoc @@ -0,0 +1,58 @@ +[[apm-observe-lambda-functions]] += Observe Lambda functions + +:keywords: serverless, observability, how-to + +preview:[] + +Elastic APM provides performance and error monitoring for AWS Lambda functions. +See how your Lambda functions relate to and depend on other services, and +get insight into function execution and runtime behavior, like lambda duration, cold start rate, cold start duration, compute usage, memory usage, and more. + +To set up Lambda monitoring, refer to <<apm-agents-aws-lambda-functions>>. + +[role="screenshot"] +image::images/apm-lambda/lambda-overview.png[lambda overview] + +[discrete] +[[apm-observe-lambda-functions-cold-starts]] +== Cold starts + +A cold start occurs when a Lambda function has not been used for a certain period of time. A lambda worker receives a request to run the function and prepares an execution environment. + +Cold starts are an unavoidable byproduct of the serverless world, but visibility into how they impact your services can help you make better decisions about factors like how much memory to allocate to a function, whether to enable provisioned concurrency, or if it's time to consider removing a large dependency. + +[discrete] +[[apm-observe-lambda-functions-cold-start-rate]] +=== Cold start rate + +The cold start rate (i.e. proportion of requests that experience a cold start) is displayed per service and per transaction. + +Cold start is also displayed in the trace waterfall, where you can drill-down into individual traces and see trace metadata like AWS request ID, trigger type, and trigger request ID. + +//// +/* TODO: RETAKE +![lambda cold start trace](images/apm-lambda/lambda-cold-start-trace.png) */ +//// + +[discrete] +[[apm-observe-lambda-functions-latency-distribution-correlation]] +=== Latency distribution correlation + +The <<apm-find-transaction-latency-and-failure-correlations-find-high-transaction-latency-correlations,latency correlations>> feature can be used to visualize the impact of Lambda cold starts on latency—just select the `faas.coldstart` field. + +//// +/* TODO: RETAKE +![lambda correlations example](images/apm-lambda/lambda-correlations.png) */ +//// + +[discrete] +[[apm-observe-lambda-functions-aws-lambda-function-grouping]] +== AWS Lambda function grouping + +The default APM agent configuration results in one APM service per AWS Lambda function, +where the Lambda function name is the service name. + +In some use cases, it makes more sense to logically group multiple lambda functions under a single +APM service. You can achieve this by setting the `ELASTIC_APM_SERVICE_NAME` environment variable +on related Lambda functions to the same value. diff --git a/docs/en/serverless/apm/apm-query-your-data.asciidoc b/docs/en/serverless/apm/apm-query-your-data.asciidoc new file mode 100644 index 0000000000..5d9a46d729 --- /dev/null +++ b/docs/en/serverless/apm/apm-query-your-data.asciidoc @@ -0,0 +1,81 @@ +[[apm-query-your-data]] += Query your data + +:keywords: serverless, observability, how-to + +preview:[] + +Querying your APM data is an essential tool that can make finding bottlenecks in your code even more straightforward. + +Using the query bar, a powerful data query feature, you can pass advanced queries on your data +to filter on specific pieces of information you’re interested in. +APM queries entered into the query bar are added as parameters to the URL, so it’s easy to share a specific query or view with others. + +The query bar comes with a handy autocomplete that helps find the fields and even provides suggestions to the data they include. +You can select the query bar and hit the down arrow on your keyboard to begin scanning recommendations. + +When you type, you can begin to see some of the fields available for filtering: + +[role="screenshot"] +image::images/advanced-queries/apm-query-bar.png[Example of the Kibana Query bar in the Applications UI] + +[TIP] +==== +To learn more about the {kib} query language capabilities, see the {kibana-ref}/kuery-query.html[Kibana Query Language Enhancements] documentation. +==== + +[discrete] +[[apm-query-your-data-apm-queries]] +== APM queries + +APM queries can be handy for removing noise from your data in the <<apm-services,Services>>, <<apm-transactions,Transactions>>, +<<apm-errors,Errors>>, <<apm-metrics,Metrics>>, and <<apm-traces,Traces>> views. + +For example, in the **Services** view, you can quickly view a list of all the instrumented services running on your production +environment: `service.environment : production`. Or filter the list by including the APM agent's name and the host it’s running on: +`service.environment : "production" and agent.name : "java" and host.name : "prod-server1"`. + +On the **Traces** view, you might want to view failed transaction results from any of your running containers: +`transaction.result :"FAILURE" and container.id : *`. + +On the **Transactions** view, you may want to list only the slower transactions than a specified time threshold: `transaction.duration.us > 2000000`. +Or filter the list by including the service version and the Kubernetes pod it's running on: +`transaction.duration.us > 2000000 and service.version : "7.12.0" and kubernetes.pod.name : "pod-5468b47f57-pqk2m"`. + +[discrete] +[[apm-query-your-data-querying-in-discover]] +== Querying in Discover + +Alternatively, you can query your APM documents in {kibana-ref}/discover.html[_Discover_]. +Querying documents in **Discover** works the same way as queries in the Applications UI, +and **Discover** supports all of the example APM queries shown on this page. + +[discrete] +[[apm-query-your-data-discover-queries]] +=== Discover queries + +One example where you may want to make use of **Discover** +is to view _all_ transactions for an endpoint instead of just a sample. + +Use the Applications UI to find a transaction name and time bucket that you're interested in learning more about. +Then, switch to **Discover** and make a search: + +[source,shell] +---- +processor.event: "transaction" AND transaction.name: "<TRANSACTION_NAME_HERE>" and transaction.duration.us > 13000 and transaction.duration.us < 14000 +---- + +In this example, we're interested in viewing all of the `APIRestController#customers` transactions +that took between 13 and 14 milliseconds. Here's what Discover returns: + +[role="screenshot"] +image::images/advanced-queries/advanced-discover.png[View all transactions in bucket] + +You can now explore the data until you find a specific transaction that you're interested in. +Copy that transaction's `transaction.id` and paste it into APM to view the data in the context of the APM: + +[role="screenshot"] +image::images/advanced-queries/specific-transaction-search.png[View specific transaction in the Applications UI] + +[role="screenshot"] +image::images/advanced-queries/specific-transaction.png[View specific transaction in the Applications UI] diff --git a/docs/en/serverless/apm/apm-reduce-your-data-usage.asciidoc b/docs/en/serverless/apm/apm-reduce-your-data-usage.asciidoc new file mode 100644 index 0000000000..c97b5952cb --- /dev/null +++ b/docs/en/serverless/apm/apm-reduce-your-data-usage.asciidoc @@ -0,0 +1,19 @@ +[[apm-reduce-your-data-usage]] += Reduce your data usage + +:description: Implement strategies for reducing your data usage without compromising the ability to analyze APM data. +:keywords: serverless, observability, overview + +preview:[] + +The richness and volume of APM data provides unique insights into your applications, but it can +also mean higher costs and more noise when analyzing data. There are a couple strategies you can +use to reduce your data usage while continuing to get the full value of APM data. Read more about +these strategies: + +* <<apm-transaction-sampling>>: Reduce data storage, costs, and +noise by ingesting only a percentage of all traces that you can extrapolate from in your analysis. +* <<apm-compress-spans>>: Compress similar or identical spans to +reduce storage overhead, processing power needed, and clutter in the Applications UI. +* <<apm-stacktrace-collection>>: Reduce the stacktrace information +collected by your APM agents. diff --git a/docs/en/serverless/apm/apm-reference.asciidoc b/docs/en/serverless/apm/apm-reference.asciidoc new file mode 100644 index 0000000000..d0f5adf69a --- /dev/null +++ b/docs/en/serverless/apm/apm-reference.asciidoc @@ -0,0 +1,15 @@ +[[apm-reference]] += Reference + +:keywords: serverless, observability, reference + +preview:[] + +The following reference documentation is available: + +* <<apm-kibana-settings,Settings reference>> +* https://docs.elastic.co/api-reference/observability/post_api-apm-agent-keys[API reference] + +In addition to the public API above, the APM managed intake service offers an +<<apm-server-api,event intake API>>. +This API is exclusively for APM agent developers. The vast majority of users should have no reason to interact with this API. diff --git a/docs/en/serverless/apm/apm-send-traces-to-elastic.asciidoc b/docs/en/serverless/apm/apm-send-traces-to-elastic.asciidoc new file mode 100644 index 0000000000..db96efbd28 --- /dev/null +++ b/docs/en/serverless/apm/apm-send-traces-to-elastic.asciidoc @@ -0,0 +1,27 @@ +[[apm-send-data-to-elastic]] += Send APM data to Elastic + +:keywords: serverless, observability, overview + +preview:[] + +:role: Admin +:goal: send APM data to Elastic +include::../partials/roles.asciidoc[] +:role!: + +:goal!: + +[NOTE] +==== +image:images/icons/documentation.svg[documentation icon] Want to get started quickly? See <<apm-get-started,Get started with traces and APM>>. +==== + +Send APM data to Elastic with: + +* **<<apm-agents-elastic-apm-agents,Elastic APM agents>>:** Elastic APM agents are lightweight libraries you install in your applications and services. They automatically instrument supported technologies, and offer APIs for custom code instrumentation. +* **<<apm-agents-opentelemetry,OpenTelemetry>>:** OpenTelemetry is a set of APIs, SDKs, tooling, and integrations that enable the capture and management of telemetry data from your services and applications. + +Elastic also supports instrumentation of <<apm-agents-aws-lambda-functions,AWS Lambda functions>>. + +// To do: We should put a diagram here showing how high-level arch diff --git a/docs/en/serverless/apm/apm-server-api.asciidoc b/docs/en/serverless/apm/apm-server-api.asciidoc new file mode 100644 index 0000000000..8af2fa3e0e --- /dev/null +++ b/docs/en/serverless/apm/apm-server-api.asciidoc @@ -0,0 +1,61 @@ +[[apm-server-api]] += Managed intake service event API + +:keywords: serverless, observability, reference + +preview:[] + +[WARNING] +==== +This API is exclusively for APM agent developers. The vast majority of users should have no reason to interact with this API. +==== + +include::./apm-server-api/api.asciidoc[] + +[discrete] +[[apm-server-api-server-information-api]] +== Server information API + +include::./apm-server-api/api-info.asciidoc[] + +[discrete] +[[apm-server-api-events-intake-api]] +== Events intake API + +include::./apm-server-api/api-events.asciidoc[] + +[discrete] +[[apm-server-api-metadata]] +=== Metadata + +include::./apm-server-api/api-metadata.asciidoc[] + +[discrete] +[[apm-server-api-transactions]] +=== Transactions + +include::./apm-server-api/api-transaction.asciidoc[] + +[discrete] +[[apm-server-api-spans]] +=== Spans + +include::./apm-server-api/api-span.asciidoc[] + +[discrete] +[[apm-server-api-errors]] +=== Errors + +include::./apm-server-api/api-error.asciidoc[] + +[discrete] +[[apm-server-api-metrics]] +=== Metrics + +include::./apm-server-api/api-metricset.asciidoc[] + +[discrete] +[[apm-server-api-opentelemetry-api]] +== OpenTelemetry API + +include::./apm-server-api/otel-api.asciidoc[] diff --git a/docs/en/serverless/apm/apm-server-api/api-error.asciidoc b/docs/en/serverless/apm/apm-server-api/api-error.asciidoc new file mode 100644 index 0000000000..e1cff0d070 --- /dev/null +++ b/docs/en/serverless/apm/apm-server-api/api-error.asciidoc @@ -0,0 +1,16 @@ + + +An error or a logged error message captured by an agent occurring in a monitored service. + +[discrete] +[[api-error-schema]] +==== Error Schema + +The managed intake service uses a JSON Schema to validate requests. The specification for errors is defined on +https://github.com/elastic/apm-server/blob/main/docs/spec/v2/error.json[GitHub] and included below. + +.Click to expand the schema +[%collapsible] +===== +include::../../transclusion/apm/guide/spec/v2/error.asciidoc[] +===== diff --git a/docs/en/serverless/apm/apm-server-api/api-events.asciidoc b/docs/en/serverless/apm/apm-server-api/api-events.asciidoc new file mode 100644 index 0000000000..b83dc0faac --- /dev/null +++ b/docs/en/serverless/apm/apm-server-api/api-events.asciidoc @@ -0,0 +1,152 @@ + + +[NOTE] +==== +Most users do not need to interact directly with the events intake API. +==== + +The events intake API is what we call the internal protocol that APM agents use to talk to the managed intake service. +Agents communicate with the Server by sending events — captured pieces of information — in an HTTP request. +Events can be: + +* Transactions +* Spans +* Errors +* Metrics + +Each event is sent as its own line in the HTTP request body. +This is known as https://github.com/ndjson/ndjson-spec[newline delimited JSON (NDJSON)]. + +With NDJSON, agents can open an HTTP POST request and use chunked encoding to stream events to the managed intake service +as soon as they are recorded in the agent. +This makes it simple for agents to serialize each event to a stream of newline delimited JSON. +The managed intake service also treats the HTTP body as a compressed stream and thus reads and handles each event independently. + +Refer to <<apm-data-types>> to learn more about the different types of events. + +[discrete] +[[api-events-endpoint]] +=== Endpoints + +The managed intake service exposes the following endpoints for Elastic APM agent data intake: + +|=== +| Name| Endpoint + +| APM agent event intake +| `/intake/v2/events` +|=== + +//// +/* | RUM event intake (v2) | `/intake/v2/rum/events` | +| RUM event intake (v3) | `/intake/v3/rum/events` | */ +//// + +[discrete] +[[api-events-example]] +=== Request + +Send an `HTTP POST` request to the managed intake service `intake/v2/events` endpoint: + +[source,bash] +---- +https://{hostname}:{port}/intake/v2/events +---- + +The managed intake service supports asynchronous processing of batches. +To request asynchronous processing the `async` query parameter can be set in the POST request +to the `intake/v2/events` endpoint: + +[source,bash] +---- +https://{hostname}:{port}/intake/v2/events?async=true +---- + +[NOTE] +==== +Since asynchronous processing defers some of the event processing to the +background and takes place after the client has closed the request, some errors +can't be communicated back to the client and are logged by the managed intake service. +Furthermore, asynchronous processing requests will only be scheduled if the managed intake service can +service the incoming request, requests that cannot be serviced will receive an internal error +`503` "queue is full" error. +==== + +//// +/* For <DocLink id="enApmGuideApmRum">RUM</DocLink> send an `HTTP POST` request to the managed intake service `intake/v3/rum/events` endpoint instead: + +```bash +http(s)://{hostname}:{port}/intake/v3/rum/events +``` */ +//// + +[discrete] +[[api-events-response]] +=== Response + +On success, the server will respond with a 202 Accepted status code and no body. + +Keep in mind that events can succeed and fail independently of each other. Only if all events succeed does the server respond with a 202. + +[discrete] +[[api-events-errors]] +=== API Errors + +There are two types of errors that the managed intake service may return to an agent: + +* Event related errors (typically validation errors) +* Non-event related errors + +The managed intake service processes events one after the other. +If an error is encountered while processing an event, +the error encountered as well as the document causing the error are added to an internal array. +The managed intake service will only save 5 event related errors. +If it encounters more than 5 event related errors, +the additional errors will not be returned to agent. +Once all events have been processed, +the error response is sent. + +Some errors, not relating to specific events, +may terminate the request immediately. +For example: IP rate limit reached, wrong metadata, etc. +If at any point one of these errors is encountered, +it is added to the internal array and immediately returned. + +An example error response might look something like this: + +[source,json] +---- +{ + "errors": [ + { + "message": "<json-schema-err>", <1> + "document": "<ndjson-obj>" <2> + },{ + "message": "<json-schema-err>", + "document": "<ndjson-obj>" + },{ + "message": "<json-decoding-err>", + "document": "<ndjson-obj>" + },{ + "message": "too many requests" <3> + }, + ], + "accepted": 2320 <4> +} +---- + +<1> An event related error + +<2> The document causing the error + +<3> An immediately returning non-event related error + +<4> The number of accepted events + +If you're developing an agent, these errors can be useful for debugging. + +[discrete] +[[api-events-schema-definition]] +=== Event API Schemas + +The managed intake service uses a collection of JSON Schemas for validating requests to the intake API. diff --git a/docs/en/serverless/apm/apm-server-api/api-info.asciidoc b/docs/en/serverless/apm/apm-server-api/api-info.asciidoc new file mode 100644 index 0000000000..e8cc9df45d --- /dev/null +++ b/docs/en/serverless/apm/apm-server-api/api-info.asciidoc @@ -0,0 +1,38 @@ + + +The managed intake service exposes an API endpoint to query general server information. +This lightweight endpoint is useful as a server up/down health check. + +[discrete] +[[api-info-endpoint]] +=== Server Information endpoint + +Send an `HTTP GET` request to the server information endpoint: + +[source,bash] +---- +https://{hostname}:{port}/ +---- + +This endpoint always returns an HTTP 200. + +Requests to this endpoint must be authenticated. + +[discrete] +[[api-info-examples]] +==== Example + +Example managed intake service information request: + +[source,sh] +---- +curl -X POST http://127.0.0.1:8200/ \ + -H "Authorization: ApiKey api_key" + +{ + "build_date": "2021-12-18T19:59:06Z", + "build_sha": "24fe620eeff5a19e2133c940c7e5ce1ceddb1445", + "publish_ready": true, + "version": "{version}" +} +---- diff --git a/docs/en/serverless/apm/apm-server-api/api-metadata.asciidoc b/docs/en/serverless/apm/apm-server-api/api-metadata.asciidoc new file mode 100644 index 0000000000..a393cc714f --- /dev/null +++ b/docs/en/serverless/apm/apm-server-api/api-metadata.asciidoc @@ -0,0 +1,73 @@ + + +Every new connection to the managed intake service starts with a `metadata` stanza. +This provides general metadata concerning the other objects in the stream. + +Rather than send this metadata information from the agent multiple times, +the managed intake service hangs on to this information and applies it to other objects in the stream as necessary. + +[TIP] +==== +Metadata is stored under `context` when viewing documents in {es}. +==== + +[discrete] +[[metadata-schema]] +==== Metadata Schema + +The managed intake service uses JSON Schema to validate requests. The specification for metadata is defined on +https://github.com/elastic/apm-server/blob/main/docs/spec/v2/metadata.json[GitHub] and included below. + +.Click to expand the schema +[%collapsible] +===== +include::../../transclusion/apm/guide/spec/v2/metadata.asciidoc[] +===== + +[discrete] +[[kubernetes-data]] +==== Kubernetes data + +APM agents automatically read Kubernetes data and send it to the managed intake service. +In most instances, agents are able to read this data from inside the container. +If this is not the case, or if you wish to override this data, you can set environment variables for the agents to read. +These environment variable are set via the Kubernetes https://kubernetes.io/docs/tasks/inject-data-application/environment-variable-expose-pod-information/#use-pod-fields-as-values-for-environment-variables[Downward API]. +Here's how you would add the environment variables to your Kubernetes pod spec: + +[source,yaml] +---- + - name: KUBERNETES_NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName + - name: KUBERNETES_POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: KUBERNETES_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: KUBERNETES_POD_UID + valueFrom: + fieldRef: + fieldPath: metadata.uid +---- + +The table below maps these environment variables to the APM metadata event field: + +|=== +| Environment variable| Metadata field name + +| `KUBERNETES_NODE_NAME` +| system.kubernetes.node.name + +| `KUBERNETES_POD_NAME` +| system.kubernetes.pod.name + +| `KUBERNETES_NAMESPACE` +| system.kubernetes.namespace + +| `KUBERNETES_POD_UID` +| system.kubernetes.pod.uid +|=== diff --git a/docs/en/serverless/apm/apm-server-api/api-metricset.asciidoc b/docs/en/serverless/apm/apm-server-api/api-metricset.asciidoc new file mode 100644 index 0000000000..902605f04a --- /dev/null +++ b/docs/en/serverless/apm/apm-server-api/api-metricset.asciidoc @@ -0,0 +1,16 @@ + + +Metrics contain application metric data captured by an {apm-agent}. + +[discrete] +[[api-metricset-schema]] +==== Metric Schema + +The managed intake service uses JSON Schema to validate requests. The specification for metrics is defined on +https://github.com/elastic/apm-server/blob/main/docs/spec/v2/metricset.json[GitHub] and included below. + +.Click to expand the schema +[%collapsible] +===== +include::../../transclusion/apm/guide/spec/v2/metricset.asciidoc[] +===== diff --git a/docs/en/serverless/apm/apm-server-api/api-span.asciidoc b/docs/en/serverless/apm/apm-server-api/api-span.asciidoc new file mode 100644 index 0000000000..1256625a47 --- /dev/null +++ b/docs/en/serverless/apm/apm-server-api/api-span.asciidoc @@ -0,0 +1,16 @@ + + +Spans are events captured by an agent occurring in a monitored service. + +[discrete] +[[api-span-schema]] +==== Span Schema + +The managed intake service uses JSON Schema to validate requests. The specification for spans is defined on +https://github.com/elastic/apm-server/blob/main/docs/spec/v2/span.json[GitHub] and included below. + +.Click to expand the schema +[%collapsible] +===== +include::../../transclusion/apm/guide/spec/v2/span.asciidoc[] +===== diff --git a/docs/en/serverless/apm/apm-server-api/api-transaction.asciidoc b/docs/en/serverless/apm/apm-server-api/api-transaction.asciidoc new file mode 100644 index 0000000000..5336056770 --- /dev/null +++ b/docs/en/serverless/apm/apm-server-api/api-transaction.asciidoc @@ -0,0 +1,16 @@ + + +Transactions are events corresponding to an incoming request or similar task occurring in a monitored service. + +[discrete] +[[api-transaction-schema]] +==== Transaction Schema + +The managed intake service uses JSON Schema to validate requests. The specification for transactions is defined on +https://github.com/elastic/apm-server/blob/main/docs/spec/v2/transaction.json[GitHub] and included below. + +.Click to expand the schema +[%collapsible] +===== +include::../../transclusion/apm/guide/spec/v2/transaction.asciidoc[] +===== diff --git a/docs/en/serverless/apm/apm-server-api/api.asciidoc b/docs/en/serverless/apm/apm-server-api/api.asciidoc new file mode 100644 index 0000000000..56e9c4444c --- /dev/null +++ b/docs/en/serverless/apm/apm-server-api/api.asciidoc @@ -0,0 +1,7 @@ + + +The managed intake service exposes endpoints for: + +* <<apm-server-api-server-information-api,The managed intake service information API>> +* <<apm-server-api-events-intake-api,Elastic APM events intake API>> +* <<apm-server-api-opentelemetry-api,OpenTelemetry intake API>> diff --git a/docs/en/serverless/apm/apm-server-api/otel-api.asciidoc b/docs/en/serverless/apm/apm-server-api/otel-api.asciidoc new file mode 100644 index 0000000000..b1ace95cfe --- /dev/null +++ b/docs/en/serverless/apm/apm-server-api/otel-api.asciidoc @@ -0,0 +1,47 @@ +Elastic supports receiving traces, metrics, and logs over the +https://opentelemetry.io/docs/specs/otlp/[OpenTelemetry Protocol (OTLP)]. +OTLP is the default transfer protocol for OpenTelemetry and is supported natively by the managed intake service. + +The managed intake service supports two OTLP communication protocols on the same port: + +* OTLP/HTTP (protobuf) +* OTLP/gRPC + +[discrete] +[[otlpgrpc-paths]] +=== OTLP/gRPC paths + +|=== +| Name| Endpoint + +| OTLP metrics intake +| `/opentelemetry.proto.collector.metrics.v1.MetricsService/Export` + +| OTLP trace intake +| `/opentelemetry.proto.collector.trace.v1.TraceService/Export` + +| OTLP logs intake +| `/opentelemetry.proto.collector.logs.v1.LogsService/Export` +|=== + +[discrete] +[[otlphttp-paths]] +=== OTLP/HTTP paths + +|=== +| Name| Endpoint + +| OTLP metrics intake +| `/v1/metrics` + +| OTLP trace intake +| `/v1/traces` + +| OTLP logs intake +| `/v1/logs` +|=== + +[TIP] +==== +See our <<apm-agents-opentelemetry-opentelemetry-native-support,OpenTelemetry docs>> to learn how to send data to the managed intake service from an OpenTelemetry agent OpenTelemetry collector. +==== diff --git a/docs/en/serverless/apm/apm-stacktrace-collection.asciidoc b/docs/en/serverless/apm/apm-stacktrace-collection.asciidoc new file mode 100644 index 0000000000..9c8819bffa --- /dev/null +++ b/docs/en/serverless/apm/apm-stacktrace-collection.asciidoc @@ -0,0 +1,13 @@ +[[apm-stacktrace-collection]] += Stacktrace collection + +:description: Reduce data storage and costs by reducing stacktrace collection +:keywords: serverless, observability, how-to + +preview:[] + +Elastic APM agents collect `stacktrace` information under certain circumstances. This can be very helpful in identifying issues in your code, but it also comes with an overhead at collection time and increases your storage usage. + +Stack trace collection settings are managed in each APM agent. You can enable and disable this feature, or set specific configuration limits, like the maximum number of stacktrace frames to collect, or the minimum duration of a stacktrace to collect. + +See the relevant {apm-agents-ref}/index.html[{apm-agent} documentation] to learn how to customize stacktrace collection. diff --git a/docs/en/serverless/apm/apm-track-deployments-with-annotations.asciidoc b/docs/en/serverless/apm/apm-track-deployments-with-annotations.asciidoc new file mode 100644 index 0000000000..0d08207211 --- /dev/null +++ b/docs/en/serverless/apm/apm-track-deployments-with-annotations.asciidoc @@ -0,0 +1,61 @@ +[[apm-track-deployments-with-annotations]] += Track deployments with annotations + +:keywords: serverless, observability, how-to + +preview:[] + +:role: Admin +:goal: create and manage annotations +include::../partials/roles.asciidoc[] +:role!: + +:goal!: + +[role="screenshot"] +image::images/annotations/apm-transaction-annotation.png[Example view of transactions annotation in the Applications UI] + +For enhanced visibility into your deployments, we offer deployment annotations on all transaction charts. +This feature enables you to easily determine if your deployment has increased response times for an end-user, +or if the memory/CPU footprint of your application has changed. +Being able to quickly identify bad deployments enables you to rollback and fix issues without causing costly outages. + +By default, automatic deployment annotations are enabled. +This means APM will create an annotation on your data when the `service.version` of your application changes. + +Alternatively, you can explicitly create deployment annotations with our annotation API. +The API can integrate into your CI/CD pipeline, +so that each time you deploy, a POST request is sent to the annotation API endpoint: + +// TODO: This is commented out for now, but it might be nice to add a working example? + +//// +/* ```shell +curl -X POST \ +http://localhost:5601/api/apm/services/${SERVICE_NAME}/annotation \ [^1] +-H 'Content-Type: application/json' \ +-H 'kbn-xsrf: true' \ +-H 'Authorization: Basic ${API_KEY}' \ [^2] +-d '{ + "@timestamp": "${DEPLOY_TIME}", [^3] + "service": { + "version": "${SERVICE_VERSION}" [^4] + }, + "message": "${MESSAGE}" [^5] + }' +``` +[^1]: The `service.name` of your application +[^2]: An APM API key with sufficient privileges +[^3]: The time of the deployment +[^4]: The `service.version` to be displayed in the annotation +[^5]: A custom message to be displayed in the annotation */ +//// + +// Todo: Link to API docs + +See the Annotation API reference for more information. + +[NOTE] +==== +If custom annotations have been created for the selected time period, any derived annotations, i.e., those created automatically when `service.version` changes, will not be shown. +==== diff --git a/docs/en/serverless/apm/apm-transaction-sampling.asciidoc b/docs/en/serverless/apm/apm-transaction-sampling.asciidoc new file mode 100644 index 0000000000..5b7a09abf6 --- /dev/null +++ b/docs/en/serverless/apm/apm-transaction-sampling.asciidoc @@ -0,0 +1,153 @@ +[[apm-transaction-sampling]] += Transaction sampling + +:description: Reduce data storage, costs, and noise by ingesting only a percentage of all traces that you can extrapolate from in your analysis. +:keywords: serverless, observability, how-to + +preview:[] + +<<apm-distributed-tracing,Distributed tracing>> can +generate a substantial amount of data. More data can mean higher costs and more noise. +Sampling aims to lower the amount of data ingested and the effort required to analyze that data — +all while still making it easy to find anomalous patterns in your applications, detect outages, track errors, +and lower mean time to recovery (MTTR). + +[discrete] +[[apm-transaction-sampling-head-based-sampling]] +== Head-based sampling + +In head-based sampling, the sampling decision for each trace is made when the trace is initiated. +Each trace has a defined and equal probability of being sampled. + +For example, a sampling value of `.2` indicates a transaction sample rate of `20%`. +This means that only `20%` of traces will send and retain all of their associated information. +The remaining traces will drop contextual information to reduce the transfer and storage size of the trace. + +Head-based sampling is quick and easy to set up. +Its downside is that it's entirely random — interesting +data might be discarded purely due to chance. + +[discrete] +[[apm-transaction-sampling-distributed-tracing]] +=== Distributed tracing + +In a _distributed_ trace, the sampling decision is still made when the trace is initiated. +Each subsequent service respects the initial service's sampling decision, regardless of its configured sample rate; +the result is a sampling percentage that matches the initiating service. + +In the example in _Figure 1_, `Service A` initiates four transactions and has a sample rate of `.5` (`50%`). +The upstream sampling decision is respected, so even if the sample rate is defined and is a different +value in `Service B` and `Service C`, the sample rate will be `.5` (`50%`) for all services. + +**Figure 1. Upstream sampling decision is respected** + +[role="screenshot"] +image::images/apm-dt-sampling-example-1.png[Distributed tracing and head based sampling example one] + +In the example in _Figure 2_, `Service A` initiates four transactions and has a sample rate of `1` (`100%`). +Again, the upstream sampling decision is respected, so the sample rate for all services will +be `1` (`100%`). + +**Figure 2. Upstream sampling decision is respected** + +[role="screenshot"] +image::images/apm-dt-sampling-example-2.png[Distributed tracing and head based sampling example two] + +[discrete] +[[apm-transaction-sampling-trace-continuation-strategies-with-distributed-tracing]] +=== Trace continuation strategies with distributed tracing + +In addition to setting the sample rate, you can also specify which _trace continuation strategy_ to use. +There are three trace continuation strategies: `continue`, `restart`, and `restart_external`. + +The **`continue`** trace continuation strategy is the default and will behave similar to the examples in +the <<apm-transaction-sampling-distributed-tracing,Distributed tracing section>>. + +Use the **`restart_external`** trace continuation strategy on an Elastic-monitored service to start +a new trace if the previous service did not have a `traceparent` header with `es` vendor data. +This can be helpful if a transaction includes an Elastic-monitored service that is receiving requests +from an unmonitored service. + +In the example in _Figure 3_, `Service A` is an Elastic-monitored service that initiates four transactions +with a sample rate of `.25` (`25%`). Because `Service B` is unmonitored, the traces started in +`Service A` will end there. `Service C` is an Elastic-monitored service that initiates four transactions +that start new traces with a new sample rate of `.5` (`50%`). Because `Service D` is also +Elastic-monitored service, the upstream sampling decision defined in `Service C` is respected. +The end result will be three sampled traces. + +**Figure 3. Using the `restart_external` trace continuation strategy** + +[role="screenshot"] +image::images/apm-dt-sampling-continuation-strategy-restart_external.png[Distributed tracing and head based sampling with restart_external continuation strategy] + +Use the **`restart`** trace continuation strategy on an Elastic-monitored service to start +a new trace regardless of whether the previous service had a `traceparent` header. +This can be helpful if an Elastic-monitored service is publicly exposed, and you do not +want tracing data to possibly be spoofed by user requests. + +In the example in _Figure 4_, `Service A` and `Service B` are Elastic-monitored services that use the +default trace continuation strategy. `Service A` has a sample rate of `.25` (`25%`), and that +sampling decision is respected in `Service B`. `Service C` is an Elastic-monitored service that +uses the `restart` trace continuation strategy and has a sample rate of `1` (`100%`). +Because it uses `restart`, the upstream sample rate is _not_ respected in `Service C` and all four +traces will be sampled as new traces in `Service C`. The end result will be five sampled traces. + +**Figure 4. Using the `restart` trace continuation strategy** + +[role="screenshot"] +image::images/apm-dt-sampling-continuation-strategy-restart.png[Distributed tracing and head based sampling with restart continuation strategy] + +[discrete] +[[apm-transaction-sampling-opentelemetry]] +=== OpenTelemetry + +Head-based sampling is implemented directly in the APM agents and SDKs. +The sample rate must be propagated between services and the managed intake service in order to produce accurate metrics. + +OpenTelemetry offers multiple samplers. However, most samplers do not propagate the sample rate. +This results in inaccurate span-based metrics, like APM throughput, latency, and error metrics. + +For accurate span-based metrics when using head-based sampling with OpenTelemetry, you must use +a https://opentelemetry.io/docs/specs/otel/trace/tracestate-probability-sampling/[consistent probability sampler]. +These samplers propagate the sample rate between services and the managed intake service, resulting in accurate metrics. + +[NOTE] +==== +OpenTelemetry does not offer consistent probability samplers in all languages. Refer to the documentation of your favorite OpenTelemetry agent or SDK for more information. +==== + +[discrete] +[[apm-transaction-sampling-sampled-data-and-visualizations]] +== Sampled data and visualizations + +A sampled trace retains all data associated with it. +A non-sampled trace drops all <<apm-data-types,span>> and <<apm-data-types,transaction>> data. +Regardless of the sampling decision, all traces retain <<apm-data-types,error>> data. + +Some visualizations in the Applications UI, like latency, are powered by aggregated transaction and span <<apm-data-types,metrics>>. +Metrics are based on sampled traces and weighted by the inverse sampling rate. +For example, if you sample at 5%, each trace is counted as 20. +As a result, as the variance of latency increases, or the sampling rate decreases, your level of error will increase. + +[discrete] +[[apm-transaction-sampling-sample-rates]] +== Sample rates + +What's the best sampling rate? Unfortunately, there isn't one. +Sampling is dependent on your data, the throughput of your application, data retention policies, and other factors. +A sampling rate from `.1%` to `100%` would all be considered normal. +You'll likely decide on a unique sample rate for different scenarios. +Here are some examples: + +* Services with considerably more traffic than others might be safe to sample at lower rates +* Routes that are more important than others might be sampled at higher rates +* A production service environment might warrant a higher sampling rate than a development environment +* Failed trace outcomes might be more interesting than successful traces — thus requiring a higher sample rate + +Regardless of the above, cost conscious customers are likely to be fine with a lower sample rate. + +[discrete] +[[apm-transaction-sampling-configure-head-based-sampling]] +== Configure head-based sampling + +include::./apm-transaction-sampling/configure-head-based-sampling.asciidoc[] diff --git a/docs/en/serverless/apm/apm-transaction-sampling/configure-head-based-sampling.asciidoc b/docs/en/serverless/apm/apm-transaction-sampling/configure-head-based-sampling.asciidoc new file mode 100644 index 0000000000..e006432123 --- /dev/null +++ b/docs/en/serverless/apm/apm-transaction-sampling/configure-head-based-sampling.asciidoc @@ -0,0 +1,27 @@ +//// +/* There are three ways to adjust the head-based sampling rate of your APM agents: + +### Dynamic configuration + +The transaction sample rate can be changed dynamically (no redeployment necessary) on a per-service and per-environment +basis with [{apm-agent} Configuration]{(kibana-ref}/agent-configuration.html) in {kib}. */ +//// + +//// +/* ### {kib} API configuration + +{apm-agent} configuration exposes an API that can be used to programmatically change +your agents' sampling rate. +An example is provided in the [Agent configuration API reference]{(kibana-ref}/agent-config-api.html). */ +//// + +Each APM agent provides a configuration value used to set the transaction sample rate. +Refer to the relevant agent's documentation for more details: + +* Go: {apm-go-ref-v}/configuration.html#config-transaction-sample-rate[`ELASTIC_APM_TRANSACTION_SAMPLE_RATE`] +* Java: {apm-java-ref-v}/config-core.html#config-transaction-sample-rate[`transaction_sample_rate`] +* .NET: {apm-dotnet-ref-v}/config-core.html#config-transaction-sample-rate[`TransactionSampleRate`] +* Node.js: {apm-node-ref-v}/configuration.html#transaction-sample-rate[`transactionSampleRate`] +* PHP: {apm-php-ref}/configuration-reference.html#config-transaction-sample-rate[`transaction_sample_rate`] +* Python: {apm-py-ref-v}/configuration.html#config-transaction-sample-rate[`transaction_sample_rate`] +* Ruby: {apm-ruby-ref-v}/configuration.html#config-transaction-sample-rate[`transaction_sample_rate`] diff --git a/docs/en/serverless/apm/apm-troubleshooting.asciidoc b/docs/en/serverless/apm/apm-troubleshooting.asciidoc new file mode 100644 index 0000000000..e5f1fe5ee8 --- /dev/null +++ b/docs/en/serverless/apm/apm-troubleshooting.asciidoc @@ -0,0 +1,52 @@ +[[apm-troubleshooting]] += Troubleshooting + +:keywords: serverless, observability, reference + +preview:[] + +This section provides solutions to common questions and problems, +and processing and performance guidance. + +[discrete] +[[apm-troubleshooting-common-problems]] +== Common problems + +include::./apm-troubleshooting/common-problems.asciidoc[] + +[discrete] +[[apm-troubleshooting-common-response-codes]] +== Common response codes + +include::./apm-troubleshooting/common-response-codes.asciidoc[] + +[discrete] +[[apm-troubleshooting-related-troubleshooting-resources]] +== Related troubleshooting resources + +For additional help with other APM components, see the links below. +{agent} and each {apm-agent} has its own troubleshooting guide: + +* {fleet-guide}/troubleshooting-intro.html[{fleet} and {agent} troubleshooting] +* {apm-dotnet-ref}/troubleshooting.html[.NET agent troubleshooting] +* {apm-go-ref}/troubleshooting.html[Go agent troubleshooting] +* {apm-java-ref}/trouble-shooting.html[Java agent troubleshooting] +* {apm-node-ref}/troubleshooting.html[Node.js agent troubleshooting] +* {apm-php-ref}/troubleshooting.html[PHP agent troubleshooting] +* {apm-py-ref}/troubleshooting.html[Python agent troubleshooting] +* {apm-ruby-ref}/debugging.html[Ruby agent troubleshooting] + +[discrete] +[[apm-troubleshooting-elastic-support]] +== Elastic Support + +We offer a support experience unlike any other. +Our team of professionals 'speak human and code' and love making your day. +https://www.elastic.co/subscriptions[Learn more about subscriptions]. + +//// +/* ### Discussion forum + +For additional questions and feature requests, +visit our [discussion forum](https://discuss.elastic.co/c/apm). */ +//// diff --git a/docs/en/serverless/apm/apm-troubleshooting/common-problems.asciidoc b/docs/en/serverless/apm/apm-troubleshooting/common-problems.asciidoc new file mode 100644 index 0000000000..419fa0ebc6 --- /dev/null +++ b/docs/en/serverless/apm/apm-troubleshooting/common-problems.asciidoc @@ -0,0 +1,73 @@ + + +This section describes common problems you might encounter. + +//// +/* * <DocLink slug="/serverless/observability/apm-troubleshooting" section="no-data-is-indexed">No data is indexed</DocLink> +* <DocLink slug="/serverless/observability/apm-troubleshooting">APM Server response codes</DocLink> +* <DocLink slug="/serverless/observability/apm-troubleshooting" section="common-ssl-related-problems">Common SSL-related problems</DocLink> +* <DocLink slug="/serverless/observability/apm-troubleshooting" section="io-timeout">I/O Timeout</DocLink> +* <DocLink slug="/serverless/observability/apm-troubleshooting" section="field-limit-exceeded">Field limit exceeded</DocLink> */ +//// + +[discrete] +[[no-data-is-indexed]] +=== No data is indexed + +If no data shows up, first make sure that your APM components are properly connected. + +include::../../transclusion/apm/guide/tab-widgets/no-data-indexed/fleet-managed.asciidoc[] + +[discrete] +[[data-indexed-no-apm-legacy]] +=== Data is indexed but doesn't appear in the Applications UI + +Elastic APM relies on default index mappings, data streams, and pipelines to query and display data. +If your APM data isn't showing up in the Applications UI, but is elsewhere in Elastic, like Discover, +you've likely made a change that overwrote a default. +If you've manually changed a data stream, index template, or index pipeline, +please verify you are not interfering with the default APM setup. + +//// +/* ### I/O Timeout + +I/O Timeouts can occur when your timeout settings across the stack are not configured correctly, +especially when using a load balancer. + +You may see an error like the one below in the {apm-agent} logs, and/or a similar error on the intake side: + +```logs +[ElasticAPM] APM Server responded with an error: +"read tcp 123.34.22.313:8200->123.34.22.40:41602: i/o timeout" +``` + +To fix this error, ensure timeouts are incrementing from the {apm-agent}, +through your load balancer, to the Elastic APM intake. + +By default, Elastic APM agent timeouts are set at 10 seconds, and the Elastic intake timeout is set at 60 seconds. +Your load balancer should be set somewhere between these numbers. + +For example: + +```txt +APM agent --> Load Balancer --> Elastic APM intake + 10s 15s 60s +``` */ +//// + +[discrete] +[[field-limit-exceeded-legacy]] +=== Field limit exceeded + +When adding too many distinct tag keys on a transaction or span, +you risk creating a {ref}/mapping.html#mapping-limit-settings[mapping explosion]. + +For example, you should avoid that user-specified data, +like URL parameters, is used as a tag key. +Likewise, using the current timestamp or a user ID as a tag key is not a good idea. +However, tag **values** with a high cardinality are not a problem. +Just try to keep the number of distinct tag keys at a minimum. + +The symptom of a mapping explosion is that transactions and spans are not indexed anymore after a certain time. Usually, on the next day, +the spans and transactions will be indexed again because a new index is created each day. +But as soon as the field limit is reached, indexing stops again. diff --git a/docs/en/serverless/apm/apm-troubleshooting/common-response-codes.asciidoc b/docs/en/serverless/apm/apm-troubleshooting/common-response-codes.asciidoc new file mode 100644 index 0000000000..37c951c0d2 --- /dev/null +++ b/docs/en/serverless/apm/apm-troubleshooting/common-response-codes.asciidoc @@ -0,0 +1,20 @@ + + +[discrete] +[[bad-request]] +=== HTTP 400: Data decoding error / Data validation error + +The most likely cause for this error is using an incompatible version of an {apm-agent}. +See <<apm-agents-elastic-apm-agents-minimum-supported-versions,minimum supported APM agent versions>> to verify compatibility. + +[discrete] +[[event-too-large]] +=== HTTP 400: Event too large + +APM agents communicate with the Managed intake service by sending events in an HTTP request. Each event is sent as its own line in the HTTP request body. If events are too large, you can reduce the size of the events that your APM agents send by: <<apm-compress-spans,enabling span compression>> or <<apm-stacktrace-collection,reducing collected stack trace information>>. + +[discrete] +[[unauthorized]] +=== HTTP 401: Invalid token + +The API key is invalid. diff --git a/docs/en/serverless/apm/apm-ui-dependencies.asciidoc b/docs/en/serverless/apm/apm-ui-dependencies.asciidoc new file mode 100644 index 0000000000..04fe4a2a56 --- /dev/null +++ b/docs/en/serverless/apm/apm-ui-dependencies.asciidoc @@ -0,0 +1,53 @@ +[[apm-dependencies]] += Dependencies + +:keywords: serverless, observability, reference + +preview:[] + +APM agents collect details about external calls made from instrumented services. +Sometimes, these external calls resolve into a downstream service that's instrumented — in these cases, +you can utilize <<apm-trace-sample-timeline-distributed-tracing,distributed tracing>> to drill down into problematic downstream services. +Other times, though, it's not possible to instrument a downstream dependency — +like with a database or third-party service. +**Dependencies** gives you a window into these uninstrumented, downstream dependencies. + +[role="screenshot"] +image::images/dependencies/dependencies.png[Dependencies view in the Applications UI] + +Many application issues are caused by slow or unresponsive downstream dependencies. +And because a single, slow dependency can significantly impact the end-user experience, +it's important to be able to quickly identify these problems and determine the root cause. + +Select a dependency to see detailed latency, throughput, and failed transaction rate metrics. + +[role="screenshot"] +image::images/dependencies/dependencies-drilldown.png[Dependencies drilldown view in the Applications UI] + +When viewing a dependency, consider your pattern of usage with that dependency. +If your usage pattern _hasn't_ increased or decreased, +but the experience has been negatively affected—either with an increase in latency or errors—there's +likely a problem with the dependency that needs to be addressed. + +If your usage pattern _has_ changed, the dependency view can quickly show you whether +that pattern change exists in all upstream services, or just a subset of your services. +You might then start digging into traces coming from +impacted services to determine why that pattern change has occurred. + +[discrete] +[[apm-dependencies-operations]] +== Operations + +:feature: Dependency operations +include::../partials/feature-beta.asciidoc[] +:feature!: + +**Dependency operations** provides a granular breakdown of the operations/queries a dependency is executing. + +[role="screenshot"] +image::images/dependencies/operations.png[operations view in the Applications UI] + +Selecting an operation displays the operation's impact and performance trends over time, via key metrics like latency, throughput, and failed transaction rate. In addition, the <<apm-trace-sample-timeline,**Trace sample timeline**>> provides a visual drill-down into an end-to-end trace sample. + +[role="screenshot"] +image::images/dependencies/operations-detail.png[operations detail view in the Applications UI] diff --git a/docs/en/serverless/apm/apm-ui-errors.asciidoc b/docs/en/serverless/apm/apm-ui-errors.asciidoc new file mode 100644 index 0000000000..eb79d56285 --- /dev/null +++ b/docs/en/serverless/apm/apm-ui-errors.asciidoc @@ -0,0 +1,38 @@ +[[apm-errors]] += Errors + +:keywords: serverless, observability, reference + +preview:[] + +_Errors_ are groups of exceptions with a similar exception or log message. +The **Errors** overview provides a high-level view of the exceptions that APM agents catch, +or that users manually report with APM agent APIs. +Like errors are grouped together to make it easy to quickly see which errors are affecting your services, +and to take actions to rectify them. + +A service returning a 5xx code from a request handler, controller, etc., will not create +an exception that an APM agent can catch, and will therefore not show up in this view. + +[role="screenshot"] +image::images/errors/apm-errors-overview.png[APM Errors overview] + +Selecting an error group ID or error message brings you to the **Error group**. + +[role="screenshot"] +image::images/errors/apm-error-group.png[APM Error group] + +The error group details page visualizes the number of error occurrences over time and compared to a recent time range. +This allows you to quickly determine if the error rate is changing or remaining constant. +You'll also see the top 5 affected transactions—enabling you to quickly narrow down which transactions are most impacted +by the selected error. + +Further down, you'll see an Error sample. +The error shown is always the most recent to occur. +The sample includes the exception message, culprit, stack trace where the error occurred, +and additional contextual information to help debug the issue—all of which can be copied with the click of a button. + +In some cases, you might also see a Transaction sample ID. +This feature allows you to make a connection between the errors and transactions, +by linking you to the specific transaction where the error occurred. +This allows you to see the whole trace, including which services the request went through. diff --git a/docs/en/serverless/apm/apm-ui-infrastructure.asciidoc b/docs/en/serverless/apm/apm-ui-infrastructure.asciidoc new file mode 100644 index 0000000000..d4cb2773e5 --- /dev/null +++ b/docs/en/serverless/apm/apm-ui-infrastructure.asciidoc @@ -0,0 +1,20 @@ +[[apm-infrastructure]] += Infrastructure + +:keywords: serverless, observability, reference + +preview:[] + +:feature: Applications UI Infrastructure +include::../partials/feature-beta.asciidoc[] +:feature!: + +The **Infrastructure** tab provides information about the containers, pods, and hosts +that the selected service is linked to. + +[role="screenshot"] +image::images/infrastructure/infra.png[Example view of the Infrastructure tab in the Applications UI] + +IT ops and software reliability engineers (SREs) can use this tab +to quickly find a service's underlying infrastructure resources when debugging a problem. +Knowing what infrastructure is related to a service allows you to remediate issues by restarting, killing hanging instances, changing configuration, rolling back deployments, scaling up, scaling out, and so on. diff --git a/docs/en/serverless/apm/apm-ui-logs.asciidoc b/docs/en/serverless/apm/apm-ui-logs.asciidoc new file mode 100644 index 0000000000..03a4c45726 --- /dev/null +++ b/docs/en/serverless/apm/apm-ui-logs.asciidoc @@ -0,0 +1,18 @@ +[[apm-logs]] += Logs + +:keywords: serverless, observability, reference + +preview:[] + +The **Logs** tab shows contextual logs for the selected service. + +include::../transclusion/kibana/logs/log-overview.asciidoc[] + +[role="screenshot"] +image::images/logs/logs.png[Example view of the Logs tab in the Applications UI] + +[TIP] +==== +Logs displayed on this page are filtered on `service.name` +==== diff --git a/docs/en/serverless/apm/apm-ui-metrics.asciidoc b/docs/en/serverless/apm/apm-ui-metrics.asciidoc new file mode 100644 index 0000000000..954a1942a2 --- /dev/null +++ b/docs/en/serverless/apm/apm-ui-metrics.asciidoc @@ -0,0 +1,27 @@ +[[apm-metrics]] += Metrics + +:keywords: serverless, observability, reference + +preview:[] + +The **Metrics** overview provides APM agent-specific metrics, +which lets you perform more in-depth root cause analysis investigations within the Applications UI. + +If you're experiencing a problem with your service, you can use this page to attempt to find the underlying cause. +For example, you might be able to correlate a high number of errors with a long transaction duration, high CPU usage, or a memory leak. + +[role="screenshot"] +image::images/metrics/apm-metrics.png[Example view of the Metrics overview in the Applications UI] + +If you're using the Java APM agent, you can view metrics for each JVM. + +[role="screenshot"] +image::images/metrics/jvm-metrics-overview.png[Example view of the Metrics overview for the Java Agent] + +Breaking down metrics by JVM makes it much easier to analyze the provided metrics: +CPU usage, memory usage, heap or non-heap memory, +thread count, garbage collection rate, and garbage collection time spent per minute. + +[role="screenshot"] +image::images/metrics/jvm-metrics.png[Example view of the Metrics overview for the Java Agent] diff --git a/docs/en/serverless/apm/apm-ui-overview.asciidoc b/docs/en/serverless/apm/apm-ui-overview.asciidoc new file mode 100644 index 0000000000..13c39b0a95 --- /dev/null +++ b/docs/en/serverless/apm/apm-ui-overview.asciidoc @@ -0,0 +1,25 @@ +[[apm-ui-overview]] += Navigate the Applications UI + +:description: Learn how to navigate the Applications UI. +:keywords: serverless, observability, reference + +preview:[] + +For a quick, high-level overview of the health and performance of your application, +start with: + +* <<apm-services,Services>> +* <<apm-traces,Traces>> +* <<apm-dependencies,Dependencies>> +* <<apm-service-map,Service Map>> + +Notice something awry? Select a service or trace and dive deeper with: + +* <<apm-service-overview,Service overview>> +* <<apm-transactions,Transactions>> +* <<apm-trace-sample-timeline,Trace sample timeline>> +* <<apm-errors,Errors>> +* <<apm-metrics,Metrics>> +* <<apm-infrastructure,Infrastructure>> +* <<apm-logs,Logs>> diff --git a/docs/en/serverless/apm/apm-ui-service-map.asciidoc b/docs/en/serverless/apm/apm-ui-service-map.asciidoc new file mode 100644 index 0000000000..b7ddde5a4d --- /dev/null +++ b/docs/en/serverless/apm/apm-ui-service-map.asciidoc @@ -0,0 +1,120 @@ +[[apm-service-map]] += Service map + +:keywords: serverless, observability, reference + +preview:[] + +A service map is a real-time visual representation of the instrumented services in your application's architecture. +It shows you how these services are connected, along with high-level metrics like average transaction duration, +requests per minute, and errors per minute. +If enabled, service maps also integrate with machine learning—for real-time health indicators based on anomaly detection scores. +All of these features can help you quickly and visually assess your services' status and health. + +We currently surface two types of service maps: + +* **Global**: All services instrumented with APM agents and the connections between them are shown. +* **Service-specific**: Highlight connections for a selected service. + +[discrete] +[[apm-service-map-how-do-service-maps-work]] +== How do service maps work? + +Service Maps rely on distributed traces to draw connections between services. +As {apm-guide-ref}/apm-distributed-tracing.html[distributed tracing] is enabled out-of-the-box for supported technologies, so are service maps. +However, if a service isn't instrumented, +or a `traceparent` header isn't being propagated to it, +distributed tracing will not work, and the connection will not be drawn on the map. + +[discrete] +[[apm-service-map-visualize-your-architecture]] +== Visualize your architecture + +From **Services**, switch to the **Service Map** tab to get started. +By default, all instrumented services and connections are shown. +Whether you're onboarding a new engineer, or just trying to grasp the big picture, +drag things around, zoom in and out, and begin to visualize how your services are connected. + +Customize what the service map displays using either the query bar or the environment selector. +The query bar enables you to use <<apm-query-your-data,advanced queries>> to customize the service map based on your needs. +The environment selector allows you to narrow displayed results to a specific environment. +This can be useful if you have two or more services, in separate environments, but with the same name. +Use the environment drop-down to only see the data you're interested in, like `dev` or `production`. + +If there's a specific service that interests you, select that service to highlight its connections. +Click **Focus map** to refocus the map on the selected service and lock the connection highlighting. +Click the **Transactions** tab to jump to the Transaction overview for the selected service. +You can also use the tabs at the top of the page to easily jump to the **Errors** or **Metrics** overview. + +[role="screenshot"] +image::images/service-maps/service-maps-java.png[Example view of service maps in the Applications UI] + +[discrete] +[[apm-service-map-anomaly-detection-with-machine-learning]] +== Anomaly detection with machine learning + +You can create machine learning jobs to calculate anomaly scores on APM transaction durations within the selected service. +When these jobs are active, service maps will display a color-coded anomaly indicator based on the detected anomaly score: + +|=== +| | + +| image:images/service-maps/green-service.png[APM green service] +| Max anomaly score **≤25**. Service is healthy. + +| image:images/service-maps/yellow-service.png[APM yellow service] +| Max anomaly score **26-74**. Anomalous activity detected. Service may be degraded. + +| image:images/service-maps/red-service.png[APM red service] +| Max anomaly score **≥75**. Anomalous activity detected. Service is unhealthy. +|=== + +[role="screenshot"] +image::images/service-maps/service-map-anomaly.png[Example view of anomaly scores on service maps in the Applications UI] + +If an anomaly has been detected, click **View anomalies** to view the anomaly detection metric viewer. +This time series analysis will display additional details on the severity and time of the detected anomalies. + +To learn how to create a machine learning job, refer to <<apm-integrate-with-machine-learning>>. + +[discrete] +[[apm-service-map-legend]] +== Legend + +Nodes appear on the map in one of two shapes: + +* **Circle**: Instrumented services. Interior icons are based on the language of the APM agent used. +* **Diamond**: Databases, external, and messaging. Interior icons represent the generic type, +with specific icons for known entities, like Elasticsearch. +Type and subtype are based on `span.type`, and `span.subtype`. + +[discrete] +[[apm-service-map-supported-apm-agents]] +== Supported APM agents + +Service Maps are supported for the following APM agent versions: + +|=== +| | + +| Go agent +| ≥ v1.7.0 + +| Java agent +| ≥ v1.13.0 + +| .NET agent +| ≥ v1.3.0 + +| Node.js agent +| ≥ v3.6.0 + +| PHP agent +| ≥ v1.2.0 + +| Python agent +| ≥ v5.5.0 + +| Ruby agent +| ≥ v3.6.0 +|=== diff --git a/docs/en/serverless/apm/apm-ui-service-overview.asciidoc b/docs/en/serverless/apm/apm-ui-service-overview.asciidoc new file mode 100644 index 0000000000..165a2696eb --- /dev/null +++ b/docs/en/serverless/apm/apm-ui-service-overview.asciidoc @@ -0,0 +1,155 @@ +[[apm-service-overview]] += Service Overview + +:keywords: serverless, observability, reference + +preview:[] + +Selecting a <<apm-services,**service**>> brings you to the **Service overview**. +The **Service overview** contains a wide variety of charts and tables that provide +high-level visibility into how a service is performing across your infrastructure: + +* Service details like service version, runtime version, framework, and APM agent name and version +* Container and orchestration information +* Cloud provider, machine type, service name, region, and availability zone +* Serverless function names and event trigger type +* Latency, throughput, and errors over time +* Service dependencies + +[discrete] +[[apm-service-overview-time-series-and-expected-bounds-comparison]] +== Time series and expected bounds comparison + +For insight into the health of your services, you can compare how a service +performs relative to a previous time frame or to the expected bounds from the +corresponding {anomaly-job}. For example, has latency been slowly increasing +over time, did the service experience a sudden spike, is the throughput similar +to what the {ml} job expects — enabling a comparison can provide the answer. + +[role="screenshot"] +image::images/services/time-series-expected-bounds-comparison.png[Time series and expected bounds comparison] + +Select the **Comparison** box to apply a time-based or expected bounds comparison. +The time-based comparison options are based on the selected time filter range: + +|=== +| Time filter| Time comparison options + +| ≤ 24 hours +| One day or one week + +| > 24 hours and ≤ 7 days +| One week + +| > 7 days +| An identical amount of time immediately before the selected time range +|=== + +The expected bounds comparison is powered by <<apm-integrate-with-machine-learning,machine learning>> and requires anomaly detection to be enabled. + +[discrete] +[[apm-service-overview-latency]] +== Latency + +Response times for the service. You can filter the **Latency** chart to display the average, +95th, or 99th percentile latency times for the service. + +[role="screenshot"] +image::images/services/latency.png[Service latency] + +[discrete] +[[apm-service-overview-throughput-and-transactions]] +== Throughput and transactions + +include::../transclusion/kibana/apm/service-overview/throughput-transactions.asciidoc[] + +[discrete] +[[apm-service-overview-failed-transaction-rate-and-errors]] +== Failed transaction rate and errors + +include::../transclusion/kibana/apm/service-overview/ftr.asciidoc[] + +The **Errors** table provides a high-level view of each error message when it first and last occurred, +along with the total number of occurrences. This makes it very easy to quickly see which errors affect +your services and take actions to rectify them. To do so, click **View errors**. + +[role="screenshot"] +image::images/services/error-rate.png[failed transaction rate and errors] + +[discrete] +[[apm-service-overview-span-types-average-duration-and-dependencies]] +== Span types average duration and dependencies + +The **Time spent by span type** chart visualizes each span type's average duration and helps you determine +which spans could be slowing down transactions. The "app" label displayed under the +chart indicates that something was happening within the application. This could signal that the APM +agent does not have auto-instrumentation for whatever was happening during that time or that the time was spent in the +application code and not in database or external requests. + +include::../transclusion/kibana/apm/service-overview/dependencies.asciidoc[] + +[discrete] +[[apm-service-overview-cold-start-rate]] +== Cold start rate + +The cold start rate chart is specific to serverless services, and displays the +percentage of requests that trigger a cold start of a serverless function. +A cold start occurs when a serverless function has not been used for a certain period of time. +Analyzing the cold start rate can be useful for deciding how much memory to allocate to a function, +or when to remove a large dependency. + +The cold start rate chart is currently supported for <<apm-observe-lambda-functions-cold-starts,AWS Lambda>> +functions and Azure functions. + +[discrete] +[[apm-service-overview-instances]] +== Instances + +The **Instances** table displays a list of all the available service instances within the selected time range. +Depending on how the service runs, the instance could be a host or a container. The table displays latency, throughput, +failed transaction, CPU usage, and memory usage for each instance. By default, instances are sorted by _Throughput_. + +[role="screenshot"] +image::images/services/all-instances.png[All instances] + +[discrete] +[[apm-service-overview-service-metadata]] +== Service metadata + +To view metadata relating to the service agent, and if relevant, the container and cloud provider, +click on each icon located at the top of the page beside the service name. + +[role="screenshot"] +image::images/services/metadata-icons.png[Service metadata] + +**Service information** + +* Service version +* Runtime name and version +* Framework name +* APM agent name and version + +**Container information** + +* Operating system +* Containerized (yes or no) +* Total number of instances +* Orchestration + +**Cloud provider information** + +* Cloud provider +* Cloud service name +* Availability zones +* Machine types +* Project ID +* Region + +**Serverless information** + +* Function name(s) +* Event trigger type + +**Alerts** + +* Recently fired alerts diff --git a/docs/en/serverless/apm/apm-ui-services.asciidoc b/docs/en/serverless/apm/apm-ui-services.asciidoc new file mode 100644 index 0000000000..0193d07cf7 --- /dev/null +++ b/docs/en/serverless/apm/apm-ui-services.asciidoc @@ -0,0 +1,65 @@ +[[apm-services]] += Services + +:keywords: serverless, observability, reference + +preview:[] + +The **Services** inventory provides a quick, high-level overview of the health and general +performance of all instrumented services. + +To help surface potential issues, services are sorted by their health status: +**critical** → **warning** → **healthy** → **unknown**. +Health status is powered by <<apm-integrate-with-machine-learning,machine learning>> +and requires anomaly detection to be enabled. + +In addition to health status, active alerts for each service are prominently displayed in the service inventory table. Selecting an active alert badge brings you to the **Alerts** tab where you can learn more about the active alert and take action. + +[role="screenshot"] +image::images/services/apm-services-overview.png[Example view of services table the Applications UI] + +[discrete] +[[apm-services-service-groups]] +== Service groups + +:role: Editor +:goal: create and manage service groups +include::../partials/roles.asciidoc[] +:role!: + +:goal!: + +:feature: Service grouping +include::../partials/feature-beta.asciidoc[] +:feature!: + +Group services together to build meaningful views that remove noise, simplify investigations across services, +and combine related alerts. + +// This screenshot is reused in the alerts docs + +// Ensure it has an active alert showing + +[role="screenshot"] +image::images/services/apm-service-group.png[Example view of service group in the Applications UI] + +To create a service group: + +. In your {observability} project, go to **Applications** → **Services**. +. Switch to **Service groups**. +. Click **Create group**. +. Specify a name, color, and description. +. Click **Select services**. +. Specify a {kibana-ref}/kuery-query.html[Kibana Query Language (KQL)] query to filter services +by one or more of the following dimensions: `agent.name`, `service.name`, `service.language.name`, +`service.environment`, `labels.<xyz>`. Services that match the query within the last 24 hours will +be assigned to the group. + +[discrete] +[[apm-services-examples]] +=== Examples + +Not sure where to get started? Here are some sample queries you can build from: + +* **Group services by environment**: To group "production" services, use `service.environment : "production"`. +* **Group services by name**: To group all services that end in "beat", use `service.name : *beat`. This will match services named "Auditbeat", "Heartbeat", "Filebeat", and so on. diff --git a/docs/en/serverless/apm/apm-ui-trace-sample-timeline.asciidoc b/docs/en/serverless/apm/apm-ui-trace-sample-timeline.asciidoc new file mode 100644 index 0000000000..4aa14c2500 --- /dev/null +++ b/docs/en/serverless/apm/apm-ui-trace-sample-timeline.asciidoc @@ -0,0 +1,82 @@ +[[apm-trace-sample-timeline]] += Trace sample timeline + +:keywords: serverless, observability, reference + +preview:[] + +The trace sample timeline visualization is a high-level view of what your application was doing while it was trying to respond to a request. +This makes it useful for visualizing where a selected transaction spent most of its time. + +[role="screenshot"] +image::images/transactions/apm-transaction-sample.png[Example view of transactions sample] + +View a span in detail by clicking on it in the timeline waterfall. +For example, when you click on an SQL Select database query, +the information displayed includes the actual SQL that was executed, how long it took, +and the percentage of the trace's total time. +You also get a stack trace, which shows the SQL query in your code. +Finally, APM knows which files are your code and which are just modules or libraries that you've installed. +These library frames will be minimized by default in order to show you the most relevant stack trace. + +[TIP] +==== +A {apm-guide-ref}/data-model-spans.html[span] is the duration of a single event. +Spans are automatically captured by APM agents, and you can also define custom spans. +Each span has a type and is defined by a different color in the timeline/waterfall visualization. +==== + +[role="screenshot"] +image::images/spans/apm-span-detail.png[Example view of a span detail in the Applications UI] + +[discrete] +[[apm-trace-sample-timeline-investigate]] +== Investigate + +The trace sample timeline features an **Investigate** button which provides a quick way to jump +to other areas of the Elastic Observability UI while maintaining the context of the currently selected trace sample. +For example, quickly view: + +* logs and metrics for the selected pod +* logs and metrics for the selected host +* trace logs for the selected `trace.id` +* uptime status of the selected domain +* the <<apm-service-map,service map>> filtered by the selected trace +* the selected transaction in **Discover** +* your <<apm-create-custom-links,custom links>> + +[discrete] +[[apm-trace-sample-timeline-distributed-tracing]] +== Distributed tracing + +When a trace travels through multiple services it is known as a _distributed trace_. +In the Applications UI, the colors in a distributed trace represent different services and +are listed in the order they occur. + +[role="screenshot"] +image::images/spans/apm-services-trace.png[Example of distributed trace colors in the Applications UI] + +As application architectures are shifting from monolithic to more distributed, service-based architectures, +distributed tracing has become a crucial feature of modern application performance monitoring. +It allows you to trace requests through your service architecture automatically, and visualize those traces in one single view in the Applications UI. +From initial web requests to your front-end service, to queries made to your back-end services, +this makes finding possible bottlenecks throughout your application much easier and faster. + +[role="screenshot"] +image::images/spans/apm-distributed-tracing.png[Example view of the distributed tracing in the Applications UI] + +Don't forget; by definition, a distributed trace includes more than one transaction. +When viewing distributed traces in the timeline waterfall, +you'll see this icon: image:images/icons/merge.svg[Merge], +which indicates the next transaction in the trace. +For easier problem isolation, transactions can be collapsed in the waterfall by clicking +the icon to the left of the transactions. +Transactions can also be expanded and viewed in detail by clicking on them. + +After exploring these traces, +you can return to the full trace by clicking **View full trace**. + +[TIP] +==== +Distributed tracing is supported by all APM agents, and there's no additional configuration needed. +==== diff --git a/docs/en/serverless/apm/apm-ui-traces.asciidoc b/docs/en/serverless/apm/apm-ui-traces.asciidoc new file mode 100644 index 0000000000..bded6eea7b --- /dev/null +++ b/docs/en/serverless/apm/apm-ui-traces.asciidoc @@ -0,0 +1,42 @@ +[[apm-traces]] += Traces + +:keywords: serverless, observability, reference + +preview:[] + +[TIP] +==== +Traces link together related transactions to show an end-to-end performance of how a request was served +and which services were part of it. +In addition to the Traces overview, you can view your application traces in the <<apm-trace-sample-timeline,trace sample timeline waterfall>>. +==== + +**Traces** displays your application's entry (root) transactions. +Transactions with the same name are grouped together and only shown once in this table. +If you're using <<apm-trace-sample-timeline-distributed-tracing,distributed tracing>>, +this view is key to finding the critical paths within your application. + +By default, transactions are sorted by _Impact_. +Impact helps show the most used and slowest endpoints in your service — in other words, +it's the collective amount of pain a specific endpoint is causing your users. +If there's a particular endpoint you're worried about, select it to view its +<<transaction-details,transaction details>>. + +You can also use queries to filter and search the transactions shown on this page. Note that only properties available on root transactions are searchable. For example, you can't search for `label.tier: 'high'`, as that field is only available on non-root transactions. + +[role="screenshot"] +image::images/traces/apm-traces.png[Example view of the Traces overview in the Applications UI] + +[discrete] +[[apm-traces-trace-explorer]] +== Trace explorer + +// <DocCallOut template="technical preview" /> + +**Trace explorer** is an experimental top-level search tool that allows you to query your traces using {kibana-ref}/kuery-query.html[Kibana Query Language (KQL)] or {ref}/eql.html[Event Query Language (EQL)]. + +Curate your own custom queries, or use the <<apm-service-map>> to find and select edges to automatically generate queries based on your selection: + +[role="screenshot"] +image::images/traces/trace-explorer.png[Trace explorer] diff --git a/docs/en/serverless/apm/apm-ui-transactions.asciidoc b/docs/en/serverless/apm/apm-ui-transactions.asciidoc new file mode 100644 index 0000000000..0f98e50794 --- /dev/null +++ b/docs/en/serverless/apm/apm-ui-transactions.asciidoc @@ -0,0 +1,174 @@ +[[apm-transactions]] += Transactions + +:keywords: serverless, observability, reference + +preview:[] + +A _transaction_ describes an event captured by an Elastic APM agent instrumenting a service. +APM agents automatically collect performance metrics on HTTP requests, database queries, and much more. +The **Transactions** tab shows an overview of all transactions. + +[role="screenshot"] +image::images/transactions/apm-transactions-overview.png[Example view of transactions table in the Applications UI] + +The **Latency**, **Throughput**, **Failed transaction rate**, **Time spent by span type**, and **Cold start rate** +charts display information on all transactions associated with the selected service: + +**Latency**:: +Response times for the service. Options include average, 95th, and 99th percentile. +If there's a weird spike that you'd like to investigate, +you can simply zoom in on the graph — this will adjust the specific time range, +and all of the data on the page will update accordingly. + +**Throughput**:: +Visualize response codes: `2xx`, `3xx`, `4xx`, and so on. +Useful for determining if more responses than usual are being served with a particular response code. +Like in the latency graph, you can zoom in on anomalies to further investigate them. + +**Failed transaction rate**:: +The failed transaction rate represents the percentage of failed transactions from the perspective of the selected service. +It's useful for visualizing unexpected increases, decreases, or irregular patterns in a service's transactions. ++ +[TIP] +==== +HTTP **transactions** from the HTTP server perspective do not consider a `4xx` status code (client error) as a failure +because the failure was caused by the caller, not the HTTP server. Thus, `event.outcome=success` and there will be no increase in failed transaction rate. + +HTTP **spans** from the client perspective however, are considered failures if the HTTP status code is ≥ 400. +These spans will set `event.outcome=failure` and increase the failed transaction rate. + +If there is no HTTP status, both transactions and spans are considered successful unless an error is reported. +==== + +**Time spent by span type**:: +Visualize where your application is spending most of its time. +For example, is your app spending time in external calls, database processing, or application code execution? ++ +The time a transaction took to complete is also recorded and displayed on the chart under the "app" label. +"app" indicates that something was happening within the application, but we're not sure exactly what. +This could be a sign that the APM agent does not have auto-instrumentation for whatever was happening during that time. ++ +It's important to note that if you have asynchronous spans, the sum of all span times may exceed the duration of the transaction. + +**Cold start rate**:: +Only applicable to serverless transactions, this chart displays the percentage of requests that trigger a cold start of a serverless function. +See <<apm-observe-lambda-functions-cold-starts,Cold starts>> for more information. + +[discrete] +[[apm-transactions-transactions-table]] +== Transactions table + +The **Transactions** table displays a list of _transaction groups_ for the selected service. +In other words, this view groups all transactions of the same name together, +and only displays one entry for each group. + +[role="screenshot"] +image::images/transactions/apm-transactions-table.png[Example view of the transactions table in the Applications UI] + +By default, transaction groups are sorted by _Impact_. +Impact helps show the most used and slowest endpoints in your service — in other words, +it's the collective amount of pain a specific endpoint is causing your users. +If there's a particular endpoint you're worried about, you can click on it to view the <<transaction-details,transaction details>>. + +[IMPORTANT] +==== +If you only see one route in the Transactions table, or if you have transactions named "unknown route", +it could be a symptom that the APM agent either wasn't installed correctly or doesn't support your framework. + +For further details, including troubleshooting and custom implementation instructions, +refer to the documentation for each <<apm-agents-elastic-apm-agents,APM Agent>> you've implemented. +==== + +[discrete] +[[transaction-details]] +== Transaction details + +Selecting a transaction group will bring you to the **transaction** details. +This page is visually similar to the transaction overview, but it shows data from all transactions within +the selected transaction group. + +[role="screenshot"] +image::images/transactions/apm-transactions-overview.png[Example view of transactions table in the Applications UI] + +[discrete] +[[transaction-duration-distribution]] +=== Latency distribution + +The latency distribution shows a plot of all transaction durations for the given time period. +The following screenshot shows a typical distribution +and indicates most of our requests were served quickly — awesome! +The requests on the right are taking longer than average; we probably need to focus on them. + +[role="screenshot"] +image::images/transactions/apm-transaction-duration-dist.png[Example view of latency distribution graph] + +Click and drag to select a latency duration _bucket_ to display up to 500 trace samples. + +[discrete] +[[transaction-trace-sample]] +=== Trace samples + +Trace samples are based on the _bucket_ selection in the **Latency distribution** chart; +update the samples by selecting a new _bucket_. +The number of requests per bucket is displayed when hovering over the graph, +and the selected bucket is highlighted to stand out. + +Each bucket presents up to ten trace samples in a **timeline**, trace sample **metadata**, +and any related **logs**. + +**Trace sample timeline** + +Each sample has a trace timeline waterfall that shows how a typical request in that bucket executed. +This waterfall is useful for understanding the parent/child hierarchy of transactions and spans, +and ultimately determining _why_ a request was slow. +For large waterfalls, expand problematic transactions and collapse well-performing ones +for easier problem isolation and troubleshooting. + +[role="screenshot"] +image::images/transactions/apm-transaction-sample.png[Example view of transactions sample] + +[NOTE] +==== +More information on timeline waterfalls is available in <<apm-trace-sample-timeline,spans>>. +==== + +**Trace sample metadata** + +Learn more about a trace sample in the **Metadata** tab: + +* Labels: Custom labels added by APM agents +* HTTP request/response information +* Host information +* Container information +* Service: The service/application runtime, APM agent, name, etc.. +* Process: The process id that served up the request. +* APM agent information +* URL +* User: Requires additional configuration, but allows you to see which user experienced the current transaction. +* FaaS information, like cold start, AWS request ID, trigger type, and trigger request ID + +[TIP] +==== +All of this data is stored in documents in Elasticsearch. +This means you can select "Actions - View transaction in Discover" to see the actual Elasticsearch document under the discover tab. +==== + +**Trace sample logs** + +The **Logs** tab displays logs related to the sampled trace. + +include::../transclusion/kibana/logs/log-overview.asciidoc[] + +[role="screenshot"] +image::images/transactions/apm-logs-tab.png[APM logs tab] + +[discrete] +[[transaction-latency-correlations]] +=== Correlations + +Correlations surface attributes of your data that are potentially correlated with high-latency or erroneous transactions. +To learn more, see <<apm-find-transaction-latency-and-failure-correlations,Find transaction latency and failure correlations>>. + +[role="screenshot"] +image::images/transactions/correlations-hover.png[APM latency correlations] diff --git a/docs/en/serverless/apm/apm-view-and-analyze-traces.asciidoc b/docs/en/serverless/apm/apm-view-and-analyze-traces.asciidoc new file mode 100644 index 0000000000..484c3d92a1 --- /dev/null +++ b/docs/en/serverless/apm/apm-view-and-analyze-traces.asciidoc @@ -0,0 +1,25 @@ +[[apm-view-and-analyze-traces]] += View and analyze traces + +:keywords: serverless, observability, overview + +preview:[] + +APM allows you to monitor your software services and applications in real time; +visualize detailed performance information on your services, +identify and analyze errors, +and monitor host-level and APM agent-specific metrics like JVM and Go runtime metrics. + +[discrete] +[[apm-view-and-analyze-traces-visualizing-application-bottlenecks]] +== Visualizing application bottlenecks + +Having access to application-level insights with just a few clicks can drastically decrease the time you spend +debugging errors, slow response times, and crashes. + +For example, you can see information about response times, requests per minute, and status codes per endpoint. +You can even dive into a specific request sample and get a complete waterfall view of what your application is spending its time on. +You might see that your bottlenecks are in database queries, cache calls, or external requests. +For each incoming request and each application error, +you can also see contextual information such as the request header, user information, +system values, or custom data that you manually attached to the request. diff --git a/docs/en/serverless/apm/apm.asciidoc b/docs/en/serverless/apm/apm.asciidoc new file mode 100644 index 0000000000..577f897004 --- /dev/null +++ b/docs/en/serverless/apm/apm.asciidoc @@ -0,0 +1,26 @@ +[[apm]] += Application performance monitoring (APM) + +:keywords: serverless, observability, overview + +preview:[] + +Elastic APM is an application performance monitoring system. +It allows you to monitor software services and applications in real time, by +collecting detailed performance information on response time for incoming requests, +database queries, calls to caches, external HTTP requests, and more. +This makes it easy to pinpoint and fix performance problems quickly. + +Elastic APM also automatically collects unhandled errors and exceptions. +Errors are grouped based primarily on the stack trace, +so you can identify new errors as they appear and keep an eye on how many times specific errors happen. + +Metrics are another vital source of information when debugging production systems. +Elastic APM agents automatically pick up basic host-level metrics and agent-specific metrics, +like JVM metrics in the Java Agent, and Go runtime metrics in the Go Agent. + +[discrete] +[[apm-give-elastic-apm-a-try]] +== Give Elastic APM a try + +Ready to give Elastic APM a try? See <<apm-get-started,Get started with traces and APM>>. diff --git a/docs/en/serverless/cases/cases.asciidoc b/docs/en/serverless/cases/cases.asciidoc new file mode 100644 index 0000000000..3f380c1d58 --- /dev/null +++ b/docs/en/serverless/cases/cases.asciidoc @@ -0,0 +1,18 @@ +[[cases]] += Cases + +:description: Use cases to track progress toward solving problems detected in Elastic Observability. +:keywords: serverless, observability, overview + +preview:[] + +Collect and share information about observability issues by creating a case. +Cases allow you to track key investigation details, +add assignees and tags to your cases, set their severity and status, and add alerts, +comments, and visualizations. You can also send cases to third-party systems by +<<case-settings,configuring external connectors>>. + +[role="screenshot"] +image::images/cases.png[Cases page] + +// NOTE: This is an autogenerated screenshot. Do not edit it directly. diff --git a/docs/en/serverless/cases/create-manage-cases.asciidoc b/docs/en/serverless/cases/create-manage-cases.asciidoc new file mode 100644 index 0000000000..bda9e181ed --- /dev/null +++ b/docs/en/serverless/cases/create-manage-cases.asciidoc @@ -0,0 +1,133 @@ +[[create-a-new-case]] += Create and manage cases + +:description: Learn how to create a case, add files, and manage the case over time. +:keywords: serverless, observability, how-to + +preview:[] + +:role: Editor +:goal: create and manage cases +include::../partials/roles.asciidoc[] +:role!: + +:goal!: + +Open a new case to keep track of issues and share the details with colleagues. +To create a case in your Observability project: + +. In your {observability} project, go to **Cases**. +. Click **Create case**. +. (Optional) If you defined <<case-settings-templates,templates>>, select one to use its default field values. preview:[] +. Give the case a name, severity, and description. ++ +[TIP] +==== +In the `Description` area, you can use +https://www.markdownguide.org/cheat-sheet[Markdown] syntax to create formatted text. +==== +. (Optional) Add a category, assignees, and tags. ++ +//// +/* To do: Need to verify that a viewer cannot be assigned to a case +(all I know is that they can _view_ the case) */ +//// ++ +You can add users who are assigned the Editor user role (or a more permissive role) for the project. +. If you defined <<case-settings-custom-fields,custom fields>>, they appear in the **Additional fields** section. +. (Optional) Under External incident management system, you can select a connector to send cases to an external system. +If you've created any connectors previously, they will be listed here. +If there are no connectors listed, you can <<case-settings,create one>>. +. After you've completed all of the required fields, click **Create case**. + +[TIP] +==== +You can also create a case from an alert or add an alert to an existing case. From the **Alerts** page, click the **More options** image:images/icons/boxesHorizontal.svg[More actions] icon and choose either **Add to existing case** or **Create new case**, and select or complete the details as required. +==== + +[discrete] +[[create-a-new-case-add-files]] +== Add files + +After you create a case, you can upload and manage files on the **Files** tab: + +[role="screenshot"] +image::images/cases-files-tab.png[A list of files attached to a case] + +// NOTE: This is an autogenerated screenshot. Do not edit it directly. + +To download or delete the file or copy the file hash to your clipboard, open the action menu (…). +The available hash functions are MD5, SHA-1, and SHA-256. + +When you upload a file, a comment is added to the case activity log. +To view an image, click its name in the activity or file list. + +[NOTE] +==== +Uploaded files are also accessible under **Project settings** → **Management** → **Files**. +When you export cases as {kibana-ref}/managing-saved-objects.html[saved objects], the case files are not exported. +==== + +You can add images and text, CSV, JSON, PDF, or ZIP files. +For the complete list, check https://github.com/elastic/kibana/blob/main/x-pack/plugins/cases/common/constants/mime_types.ts[`mime_types.ts`]. + +.File size limits +[NOTE] +==== +There is a 10 MiB size limit for images. For all other MIME types, the limit is 100 MiB. +==== + +//// +/* + +NOTE: Email notifications are not available in Observability projects yet. + +## Add email notifications + +You can configure email notifications that occur when users are assigned to +cases. + +To do this, add the email addresses to the monitoring email allowlist. +Follow the steps in [Send alerts by email]{(cloud}/ec-watcher.html#ec-watcher-allowlist). + +You do not need to configure an email connector or update +user settings, since the preconfigured Elastic-Cloud-SMTP connector is +used by default. + +When you subsequently add assignees to cases, they receive an email. + +*/ +//// + +[discrete] +[[create-a-new-case-send-cases-to-external-incident-management-systems]] +== Send cases to external incident management systems + +To send a case to an external system, click the image:images/icons/importAction.svg[push] button in the _External incident management system_ section of the individual case page. +This information is not sent automatically. +If you make further changes to the shared case fields, you should push the case again. + +For more information about configuring connections to external incident management systems, refer to <<case-settings>>. + +[discrete] +[[create-a-new-case-manage-existing-cases]] +== Manage existing cases + +You can search existing cases and filter them by attributes such as assignees, +categories, severity, status, and tags. You can also select multiple cases and use bulk +actions to delete cases or change their attributes. + +To view a case, click on its name. You can then: + +* Add a new comment. +* Edit existing comments and the description. +* Add or remove assignees. +* Add a connector (if you did not select one while creating the case). +* Send updates to external systems (if external connections are configured). +* Edit the category and tags. +* Change the status. +* Change the severity. +* Remove an alert. +* Refresh the case to retrieve the latest updates. +* Close the case. +* Reopen a closed case. diff --git a/docs/en/serverless/cases/manage-cases-settings.asciidoc b/docs/en/serverless/cases/manage-cases-settings.asciidoc new file mode 100644 index 0000000000..f2f255b1ff --- /dev/null +++ b/docs/en/serverless/cases/manage-cases-settings.asciidoc @@ -0,0 +1,151 @@ +[[case-settings]] += Configure case settings + +:description: Change the default behavior of {observability} cases by adding connectors, custom fields, templates, and closure options. +:keywords: serverless, observability, how-to + +preview:[] + +:role: Editor +:goal: create and edit connectors +include::../partials/roles.asciidoc[] +:role!: + +:goal!: + +To access case settings in an {observability} project, go to **Cases** → **Settings**. + +[role="screenshot"] +image::images/observability-cases-settings.png[View case settings] + +// NOTE: This is an autogenerated screenshot. Do not edit it directly. + +[discrete] +[[case-settings-case-closures]] +== Case closures + +If you close cases in your external incident management system, the cases will remain open in Elastic Observability until you close them manually (the information is only sent in one direction). + +To close cases when they are sent to an external system, select **Automatically close cases when pushing new incident to external system**. + +[discrete] +[[case-settings-external-incident-management-systems]] +== External incident management systems + +If you are using an external incident management system, you can integrate Elastic Observability +cases with this system using connectors. These third-party systems are supported: + +* {ibm-r} +* {jira} (including {jira} Service Desk) +* {sn-itsm} +* {sn-sir} +* {swimlane} +* TheHive +* {webhook-cm} + +You need to create a connector to send cases, which stores the information required to interact +with an external system. For each case, you can send the title, description, and comment when +you choose to push the case — for the **Webhook - Case Management** connector, you can also +send the status and severity fields. + +[IMPORTANT] +==== +// TODO: Verify user roles needed to create connectors... + +To add, modify, or delete a connector, you must have the Admin user role for the project +(or a more permissive role). +==== + +After creating a connector, you can set your cases to +automatically close when they are sent to an external system. + +[discrete] +[[case-settings-create-a-connector]] +=== Create a connector + +. From the **Incident management system** list, select **Add new connector**. +. Select the system to send cases to: **{sn}**, **{jira}**, **{ibm-r}**, +**{swimlane}**, **TheHive**, or **{webhook-cm}**. ++ +[role="screenshot"] +image::images/observability-cases-add-connector.png[Add a connector to send cases to an external source] ++ +// NOTE: This is an autogenerated screenshot. Do not edit it directly. +. Enter your required settings. For connector configuration details, refer to: ++ +** {kibana-ref}/resilient-action-type.html[{ibm-r} connector] +** {kibana-ref}/jira-action-type.html[{jira} connector] +** {kibana-ref}/servicenow-action-type.html[{sn-itsm} connector] +** {kibana-ref}/servicenow-sir-action-type.html[{sn-sir} connector] +** {kibana-ref}/swimlane-action-type.html[{swimlane} connector] +** {kibana-ref}/thehive-action-type.html[TheHive connector] +** {kibana-ref}/cases-webhook-action-type.html[{webhook-cm} connector] +. Click **Save**. + +[discrete] +[[case-settings-edit-a-connector]] +=== Edit a connector + +You can create additional connectors, update existing connectors, and change the connector used to send cases to external systems. + +[TIP] +==== +You can also configure which connector is used for each case individually. Refer to <<create-a-new-case>>. +==== + +To change the default connector used to send cases to external systems: + +. Select the required connector from the **Incident management system** list. + +To update an existing connector: + +. Click **Update <connector name>**. +. Update the connector fields as required. + +[discrete] +[[case-settings-custom-fields]] +== Custom fields + +You can add optional and required fields for customized case collaboration. + +To create a custom field: + +. In the **Custom fields** section, click **Add field**. ++ +[role="screenshot"] +image::images/observability-cases-custom-fields.png[Add a custom field] ++ +// NOTE: This is an autogenerated screenshot. Do not edit it directly. +. You must provide a field label and type (text or toggle). +You can optionally designate it as a required field and provide a default value. + +When you create a custom field, it's added to all new and existing cases. +In existing cases, new custom text fields initially have null values. + +You can subsequently remove or edit custom fields on the **Settings** page. + +[discrete] +[[case-settings-templates]] +== Templates + +preview::[] + +You can make the case creation process faster and more consistent by adding templates. +A template defines values for one or all of the case fields (such as severity, tags, description, and title) as well as any custom fields. + +To create a template: + +. In the **Templates** section, click **Add template**. ++ +[role="screenshot"] +image::images/observability-cases-templates.png[Add a case template] ++ +// NOTE: This is an autogenerated screenshot. Do not edit it directly. +. You must provide a template name and case severity. You can optionally add template tags and a description, values for each case field, and a case connector. + +When users create cases, they can optionally select a template and use its field values or override them. + +[NOTE] +==== +If you update or delete templates, existing cases are unaffected. +==== diff --git a/docs/en/serverless/dashboards/dashboards-and-visualizations.asciidoc b/docs/en/serverless/dashboards/dashboards-and-visualizations.asciidoc new file mode 100644 index 0000000000..edffb0dd32 --- /dev/null +++ b/docs/en/serverless/dashboards/dashboards-and-visualizations.asciidoc @@ -0,0 +1,46 @@ +[[dashboards]] += Dashboards + +:description: Visualize your observability data using pre-built dashboards or create your own. +:keywords: serverless, observability, overview + +preview:[] + +Elastic provides a wide range of pre-built dashboards for visualizing observability data from a variety of sources. +These dashboards are loaded automatically when you install https://docs.elastic.co/integrations[Elastic integrations]. + +You can also create new dashboards and visualizations based on your data views to get a full picture of your data. + +In your Observability project, go to **Dashboards** to see installed dashboards or create your own. +This example shows dashboards loaded by the System integration: + +[role="screenshot"] +image::images/dashboards.png[Screenshot showing list of System dashboards] + +Notice you can filter the list of dashboards: + +* Use the text search field to filter by name or description. +* Use the **Tags** menu to filter by tag. To create a new tag or edit existing tags, click **Manage tags**. +* Click a dashboard's tags to toggle filtering for each tag. + +[discrete] +[[dashboards-create-new-dashboards]] +== Create new dashboards + +To create a new dashboard, click **Create Dashboard** and begin adding visualizations. +You can create charts, graphs, maps, tables, and other types of visualizations from your data, +or you can add visualizations from the library. + +You can also add other types of panels — such as filters, links, and text — and add +controls like time sliders. + +For more information about creating dashboards, +refer to {kibana-ref}/create-a-dashboard-of-panels-with-web-server-data.html[Create your first dashboard]. + +[NOTE] +==== +The tutorial about creating your first dashboard is written for {kib} users, +but the steps for serverless are very similar. +To load the sample data in serverless, go to **Project Settings** → **Integrations** in the navigation pane, +then search for "sample data". +==== diff --git a/docs/en/serverless/elastic-entity-model.asciidoc b/docs/en/serverless/elastic-entity-model.asciidoc new file mode 100644 index 0000000000..b5fbee281e --- /dev/null +++ b/docs/en/serverless/elastic-entity-model.asciidoc @@ -0,0 +1,60 @@ +[[elastic-entity-model]] += Elastic Entity Model + +:description: Learn about the model that empowers entity-centric Elastic solution features and workflows. +:keywords: serverless, observability, overview + +preview:[] + +The Elastic Entity Model consists of: + +* a data model and related entity indices +* an Entity Discovery Framework, which consists of {ref}/transforms.html[transforms] and {ref}/ingest.html[Ingest pipelines] that read from signal indices and write data to entity indices +* a set of management APIs that empower entity-centric Elastic solution features and workflows + +In Elastic Observability, +an _entity_ is an object of interest that can be associated with produced telemetry and identified as unique. +Note that this definition is intentionally closely aligned to the work of the https://github.com/open-telemetry/oteps/blob/main/text/entities/0256-entities-data-model.md#data-model[OpenTelemetry Entities SIG]. +Examples of entities include (but are not limited to) services, hosts, and containers. + +The concept of an entity is important as a means to unify observability signals based on the underlying entity that the signals describe. + +.Notes +[NOTE] +==== +* The Elastic Entity Model currently supports the <<inventory,new inventory experience>> limited to service, host, and container entities. +* During Technical Preview, Entity Discovery Framework components are not enabled by default. +==== + +[discrete] +[[elastic-entity-model-enable-the-elastic-entity-model]] +== Enable the Elastic Entity Model + +:role: Admin +:goal: enable the Elastic Entity Model +include::./partials/roles.asciidoc[] +:role!: + +:goal!: + +You can enable the Elastic Entity Model from the new <<inventory,Inventory>>. If already enabled, you will not be prompted to enable the Elastic Entity Model. + +[discrete] +[[elastic-entity-model-disable-the-elastic-entity-model]] +== Disable the Elastic Entity Model + +:role: Admin +:goal: enable the Elastic Entity Model +include::./partials/roles.asciidoc[] +:role!: + +:goal!: + +From the Dev Console, run the command: `DELETE kbn:/internal/entities/managed/enablement` + +[discrete] +[[elastic-entity-model-limitations]] +== Limitations + +* https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-cross-cluster-search.html[Cross-cluster search (CCS)] is not supported. EEM cannot leverage data stored on a remote cluster. +* Services are only detected from documents where `service.name` is detected in index patterns that match either `logs-*` or `apm-*`. diff --git a/docs/en/serverless/images/icons/addFilter.svg b/docs/en/serverless/images/icons/addFilter.svg new file mode 100644 index 0000000000..5da375f4ec --- /dev/null +++ b/docs/en/serverless/images/icons/addFilter.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" role="img" data-icon-type="addFilter" data-is-loaded="true" aria-hidden="true"><path d="M8 7V3.5a.5.5 0 0 0-1 0V7H3.5a.5.5 0 0 0 0 1H7v3.5a.5.5 0 1 0 1 0V8h3.5a.5.5 0 1 0 0-1H8Zm-.5 8a7.5 7.5 0 1 1 0-15 7.5 7.5 0 0 1 0 15Z"></path></svg> diff --git a/docs/en/serverless/images/icons/ai-assistant-bw.svg b/docs/en/serverless/images/icons/ai-assistant-bw.svg new file mode 100644 index 0000000000..06896113e4 --- /dev/null +++ b/docs/en/serverless/images/icons/ai-assistant-bw.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 64 64" fill="none" class="css-0"><path fill="#000000" d="M36 28h24v36H36V28Z"></path><path fill="#000000" d="M4 46c0-9.941 8.059-18 18-18h6v36h-6c-9.941 0-18-8.059-18-18Z"></path><path fill="#000000" d="M60 12c0 6.627-5.373 12-12 12s-12-5.373-12-12S41.373 0 48 0s12 5.373 12 12Z"></path><path fill="#000000" d="M6 23C6 10.85 15.85 1 28 1v22H6Z"></path></svg> \ No newline at end of file diff --git a/docs/en/serverless/images/icons/ai-assistant.svg b/docs/en/serverless/images/icons/ai-assistant.svg new file mode 100644 index 0000000000..ac51eccb68 --- /dev/null +++ b/docs/en/serverless/images/icons/ai-assistant.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 64 64" fill="none" class="css-0"><path fill="#F04E98" d="M36 28h24v36H36V28Z"></path><path fill="#00BFB3" d="M4 46c0-9.941 8.059-18 18-18h6v36h-6c-9.941 0-18-8.059-18-18Z"></path><path fill="#343741" d="M60 12c0 6.627-5.373 12-12 12s-12-5.373-12-12S41.373 0 48 0s12 5.373 12 12Z"></path><path fill="#FA744E" d="M6 23C6 10.85 15.85 1 28 1v22H6Z"></path></svg> \ No newline at end of file diff --git a/docs/en/serverless/images/icons/apmTrace.svg b/docs/en/serverless/images/icons/apmTrace.svg new file mode 100644 index 0000000000..800b8e51a4 --- /dev/null +++ b/docs/en/serverless/images/icons/apmTrace.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" role="img" data-icon-type="apmTrace" data-is-loaded="true" aria-hidden="true"><path d="M2 0h12a2 2 0 012 2v12a2 2 0 01-2 2H2a2 2 0 01-2-2V2a2 2 0 012-2zm0 1a1 1 0 00-1 1v12a1 1 0 001 1h12a1 1 0 001-1V2a1 1 0 00-1-1H2zm.5 2h10a.5.5 0 110 1h-10a.5.5 0 010-1zm1 3h6a.5.5 0 010 1h-6a.5.5 0 010-1zm2 3h4a.5.5 0 010 1h-4a.5.5 0 010-1zm3 3h5a.5.5 0 110 1h-5a.5.5 0 110-1z"></path></svg> \ No newline at end of file diff --git a/docs/en/serverless/images/icons/apps.svg b/docs/en/serverless/images/icons/apps.svg new file mode 100644 index 0000000000..ad6f7baf1f --- /dev/null +++ b/docs/en/serverless/images/icons/apps.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" role="img" data-icon-type="apps" data-is-loaded="true" aria-hidden="true"><path d="M2 4V2h2v2H2Zm5 0V2h2v2H7Zm5 0V2h2v2h-2ZM2 9V7h2v2H2Zm5 0V7h2v2H7Zm5 0V7h2v2h-2ZM2 14v-2h2v2H2Zm5 0v-2h2v2H7Zm5 0v-2h2v2h-2Z"></path></svg> \ No newline at end of file diff --git a/docs/en/serverless/images/icons/arrowLeft.svg b/docs/en/serverless/images/icons/arrowLeft.svg new file mode 100644 index 0000000000..d5956d01bb --- /dev/null +++ b/docs/en/serverless/images/icons/arrowLeft.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" role="img" data-icon-type="arrowLeft" data-is-loaded="true" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M11.018 14.043a.75.75 0 00.024-1.06l-4.59-4.81a.25.25 0 010-.346l4.59-4.81a.75.75 0 10-1.085-1.035l-4.59 4.81a1.75 1.75 0 000 2.416l4.59 4.81c.286.3.761.31 1.06.024z"></path></svg> \ No newline at end of file diff --git a/docs/en/serverless/images/icons/arrowRight.svg b/docs/en/serverless/images/icons/arrowRight.svg new file mode 100644 index 0000000000..b2d76bddc2 --- /dev/null +++ b/docs/en/serverless/images/icons/arrowRight.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" role="img" data-icon-type="arrowRight" data-is-loaded="true" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M4.982 14.043a.75.75 0 01-.025-1.06l4.591-4.81a.25.25 0 000-.346l-4.59-4.81a.75.75 0 011.085-1.035l4.59 4.81a1.75 1.75 0 010 2.416l-4.59 4.81a.75.75 0 01-1.06.024z"></path></svg> \ No newline at end of file diff --git a/docs/en/serverless/images/icons/beaker.svg b/docs/en/serverless/images/icons/beaker.svg new file mode 100644 index 0000000000..05eb97809c --- /dev/null +++ b/docs/en/serverless/images/icons/beaker.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" role="img" data-icon-type="beaker" data-is-loaded="true" aria-hidden="true"><path d="M5.277 10.088c.02.014.04.03.057.047.582.55 1.134.812 1.666.812.586 0 1.84-.293 3.713-.88L9 6.212V2H7v4.212l-1.723 3.876zm-.438.987L3.539 14h8.922l-1.32-2.969C9.096 11.677 7.733 12 7 12c-.74 0-1.463-.315-2.161-.925zM6 2H5V1h6v1h-1v4l3.375 7.594A1 1 0 0112.461 15H3.54a1 1 0 01-.914-1.406L6 6V2z"></path></svg> \ No newline at end of file diff --git a/docs/en/serverless/images/icons/bell.svg b/docs/en/serverless/images/icons/bell.svg new file mode 100644 index 0000000000..61f2d5493a --- /dev/null +++ b/docs/en/serverless/images/icons/bell.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" class="euiIcon eui-alignMiddle css-61rd3k-euiIcon-m-isLoaded" role="img" data-icon-type="bell" data-is-loaded="true" aria-hidden="true"><path fill-rule="evenodd" d="M2.316 12h10.368c-.188-.704-.28-1.691-.348-3.037-.07-1.382-.103-1.888-.19-2.612-.028-.236-.06-.462-.096-.68-.31-1.892-1.506-2.923-3.708-3.131a1 1 0 1 0-1.684 0c-2.202.208-3.397 1.24-3.708 3.13a16.01 16.01 0 0 0-.096.68c-.087.725-.12 1.23-.19 2.613-.068 1.346-.16 2.333-.348 3.037Zm10.843 1H1.84c-.308.353-.737.5-1.341.5a.5.5 0 1 1 0-1c.786 0 1.024-.783 1.166-3.587.07-1.407.105-1.926.196-2.681.03-.25.063-.49.102-.724.334-2.041 1.546-3.313 3.556-3.792a2 2 0 0 1 3.96 0c2.01.479 3.222 1.75 3.557 3.792a17 17 0 0 1 .102.724c.09.755.125 1.274.196 2.681.14 2.804.379 3.587 1.165 3.587a.5.5 0 1 1 0 1c-.604 0-1.033-.147-1.341-.5ZM5.5 14h4a2 2 0 1 1-4 0Z"></path></svg> \ No newline at end of file diff --git a/docs/en/serverless/images/icons/boxesHorizontal.svg b/docs/en/serverless/images/icons/boxesHorizontal.svg new file mode 100644 index 0000000000..d845a6b9db --- /dev/null +++ b/docs/en/serverless/images/icons/boxesHorizontal.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" role="img" data-icon-type="boxesHorizontal" data-is-loaded="true" aria-hidden="true"><path d="M0 6h4v4H0V6Zm1 1v2h2V7H1Zm5-1h4v4H6V6Zm1 1v2h2V7H7Zm5-1h4v4h-4V6Zm1 3h2V7h-2v2Z"></path></svg> \ No newline at end of file diff --git a/docs/en/serverless/images/icons/boxesVertical.svg b/docs/en/serverless/images/icons/boxesVertical.svg new file mode 100644 index 0000000000..aed10b0d8e --- /dev/null +++ b/docs/en/serverless/images/icons/boxesVertical.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" role="img" data-icon-type="boxesVertical" aria-hidden="true"><path d="M7 1v2h2V1H7ZM6 0h4v4H6V0Zm0 6h4v4H6V6Zm1 1v2h2V7H7Zm-1 5h4v4H6v-4Zm1 1v2h2v-2H7Z"></path></svg> \ No newline at end of file diff --git a/docs/en/serverless/images/icons/calendar.svg b/docs/en/serverless/images/icons/calendar.svg new file mode 100644 index 0000000000..ed311de10c --- /dev/null +++ b/docs/en/serverless/images/icons/calendar.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" role="img" data-icon-type="calendar" data-is-loaded="true" aria-hidden="true"><path d="M14 4v-.994C14 2.45 13.55 2 12.994 2H11v1h-1V2H6v1H5V2H3.006C2.45 2 2 2.45 2 3.006v9.988C2 13.55 2.45 14 3.006 14h9.988C13.55 14 14 13.55 14 12.994V5H2V4h12zm-3-3h1.994C14.102 1 15 1.897 15 3.006v9.988A2.005 2.005 0 0112.994 15H3.006A2.005 2.005 0 011 12.994V3.006C1 1.898 1.897 1 3.006 1H5V0h1v1h4V0h1v1zM4 7h2v1H4V7zm3 0h2v1H7V7zm3 0h2v1h-2V7zM4 9h2v1H4V9zm3 0h2v1H7V9zm3 0h2v1h-2V9zm-6 2h2v1H4v-1zm3 0h2v1H7v-1zm3 0h2v1h-2v-1z" fill-rule="evenodd"></path></svg> \ No newline at end of file diff --git a/docs/en/serverless/images/icons/check.svg b/docs/en/serverless/images/icons/check.svg new file mode 100644 index 0000000000..1145dd301d --- /dev/null +++ b/docs/en/serverless/images/icons/check.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" class="euiIcon eui-alignMiddle css-61rd3k-euiIcon-m-isLoaded" role="img" data-icon-type="check" data-is-loaded="true" aria-hidden="true"><path fill-rule="evenodd" d="M6.5 12a.502.502 0 0 1-.354-.146l-4-4a.502.502 0 0 1 .708-.708L6.5 10.793l6.646-6.647a.502.502 0 0 1 .708.708l-7 7A.502.502 0 0 1 6.5 12"></path></svg> \ No newline at end of file diff --git a/docs/en/serverless/images/icons/cross.svg b/docs/en/serverless/images/icons/cross.svg new file mode 100644 index 0000000000..82df3e03d3 --- /dev/null +++ b/docs/en/serverless/images/icons/cross.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" class="euiIcon eui-alignMiddle css-61rd3k-euiIcon-m-isLoaded" role="img" data-icon-type="cross" data-is-loaded="true" aria-hidden="true"><path d="M7.293 8 3.146 3.854a.5.5 0 1 1 .708-.708L8 7.293l4.146-4.147a.5.5 0 0 1 .708.708L8.707 8l4.147 4.146a.5.5 0 0 1-.708.708L8 8.707l-4.146 4.147a.5.5 0 0 1-.708-.708L7.293 8Z"></path></svg> \ No newline at end of file diff --git a/docs/en/serverless/images/icons/documentation.svg b/docs/en/serverless/images/icons/documentation.svg new file mode 100644 index 0000000000..b519c72f03 --- /dev/null +++ b/docs/en/serverless/images/icons/documentation.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" class="euiIcon eui-alignMiddle css-61rd3k-euiIcon-m-isLoaded" role="img" data-icon-type="documentation" data-is-loaded="true" aria-hidden="true"><path d="M9 3.5a.5.5 0 1 1-1 0 .5.5 0 0 1 1 0zM9 5v3h1v1H8V6H7V5h2z"></path><path d="M13.855 14.147a1.34 1.34 0 0 1-.158-.246A1.998 1.998 0 0 1 13.5 13c0-.414.103-.713.197-.901a1.34 1.34 0 0 1 .158-.246l.003-.005A.5.5 0 0 0 14 11.5V.5a.5.5 0 0 0-.5-.5H3.461l-.083.005a2.957 2.957 0 0 0-1.102.298 2.257 2.257 0 0 0-.88.763C1.148 1.44 1 1.913 1 2.5V13c0 .463.117.843.318 1.145.2.298.462.491.708.615a2.344 2.344 0 0 0 .94.24H3v-1c-.005 0-.015 0-.029-.002a1.344 1.344 0 0 1-.498-.133.817.817 0 0 1-.323-.275C2.07 13.47 2 13.287 2 13s.07-.47.15-.59a.817.817 0 0 1 .324-.275A1.344 1.344 0 0 1 3 12h9.658c-.091.27-.158.605-.158 1s.067.73.158 1H8v1h5.5a.5.5 0 0 0 .359-.848l-.004-.005zm-.001 0 .002.002-.002-.002zM2.724 1.197c.092-.046.186-.082.276-.11C3 2.918 3.001 11 2.999 11h-.033a1.977 1.977 0 0 0-.283.03 2.344 2.344 0 0 0-.657.21L2 11.254V2.5c0-.413.102-.689.229-.879.128-.193.304-.328.495-.424zM4 11V1h9v10H4z"></path><path d="M7 13H4v2.5a.5.5 0 0 0 .854.354l.646-.647.646.647A.5.5 0 0 0 7 15.5V13z"></path></svg> \ No newline at end of file diff --git a/docs/en/serverless/images/icons/expand.svg b/docs/en/serverless/images/icons/expand.svg new file mode 100644 index 0000000000..66b1327a34 --- /dev/null +++ b/docs/en/serverless/images/icons/expand.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" class="euiIcon eui-alignMiddle css-61rd3k-euiIcon-m-isLoaded" role="img" data-icon-type="expand" data-is-loaded="true" aria-hidden="true"><path fill-rule="evenodd" d="m4.354 12.354 8-8a.5.5 0 0 0-.708-.708l-8 8a.5.5 0 0 0 .708.708ZM1 10.5a.5.5 0 1 1 1 0v3a.5.5 0 0 0 .5.5h3a.5.5 0 1 1 0 1h-3A1.5 1.5 0 0 1 1 13.5v-3Zm14-5a.5.5 0 1 1-1 0v-3a.5.5 0 0 0-.5-.5h-3a.5.5 0 1 1 0-1h3A1.5 1.5 0 0 1 15 2.5v3Z"></path></svg> \ No newline at end of file diff --git a/docs/en/serverless/images/icons/eye.svg b/docs/en/serverless/images/icons/eye.svg new file mode 100644 index 0000000000..0e576f21d5 --- /dev/null +++ b/docs/en/serverless/images/icons/eye.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" role="img" data-icon-type="eye" data-is-loaded="true" aria-hidden="true"><path d="M15.98 7.873c.013.03.02.064.02.098v.06a.24.24 0 0 1-.02.097C15.952 8.188 13.291 14 8 14S.047 8.188.02 8.128A.24.24 0 0 1 0 8.03v-.059c0-.034.007-.068.02-.098C.048 7.813 2.709 2 8 2s7.953 5.813 7.98 5.873Zm-1.37-.424a12.097 12.097 0 0 0-1.385-1.862C11.739 3.956 9.999 3 8 3c-2 0-3.74.956-5.225 2.587a12.098 12.098 0 0 0-1.701 2.414 12.095 12.095 0 0 0 1.7 2.413C4.26 12.043 6.002 13 8 13s3.74-.956 5.225-2.587A12.097 12.097 0 0 0 14.926 8c-.08-.15-.189-.343-.315-.551ZM8 4.75A3.253 3.253 0 0 1 11.25 8 3.254 3.254 0 0 1 8 11.25 3.253 3.253 0 0 1 4.75 8 3.252 3.252 0 0 1 8 4.75Zm0 1C6.76 5.75 5.75 6.76 5.75 8S6.76 10.25 8 10.25 10.25 9.24 10.25 8 9.24 5.75 8 5.75Zm0 1.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path></svg> \ No newline at end of file diff --git a/docs/en/serverless/images/icons/filter.svg b/docs/en/serverless/images/icons/filter.svg new file mode 100644 index 0000000000..efebf84ede --- /dev/null +++ b/docs/en/serverless/images/icons/filter.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" class="euiIcon eui-alignMiddle css-61rd3k-euiIcon-m-isLoaded" role="img" data-icon-type="filter" data-is-loaded="true" aria-hidden="true"><path d="M3 5.5a.5.5 0 0 1 .5-.5h9a.5.5 0 0 1 0 1h-9a.5.5 0 0 1-.5-.5Zm2 3a.5.5 0 0 1 .5-.5h5a.5.5 0 0 1 0 1h-5a.5.5 0 0 1-.5-.5ZM7.5 11a.5.5 0 0 0 0 1h1a.5.5 0 0 0 0-1h-1Z"></path></svg> \ No newline at end of file diff --git a/docs/en/serverless/images/icons/help.svg b/docs/en/serverless/images/icons/help.svg new file mode 100644 index 0000000000..ad01598e47 --- /dev/null +++ b/docs/en/serverless/images/icons/help.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" class="euiIcon eui-alignMiddle css-61rd3k-euiIcon-m-isLoaded" role="img" data-icon-type="help" data-is-loaded="true" aria-hidden="true"><path fill-rule="evenodd" d="m13.6 12.186-1.357-1.358c-.025-.025-.058-.034-.084-.056.53-.794.84-1.746.84-2.773a4.977 4.977 0 0 0-.84-2.772c.026-.02.059-.03.084-.056L13.6 3.813a6.96 6.96 0 0 1 0 8.373ZM8 15A6.956 6.956 0 0 1 3.814 13.6l1.358-1.358c.025-.025.034-.057.055-.084C6.02 12.688 6.974 13 8 13a4.978 4.978 0 0 0 2.773-.84c.02.026.03.058.056.083l1.357 1.358A6.956 6.956 0 0 1 8 15Zm-5.601-2.813a6.963 6.963 0 0 1 0-8.373l1.359 1.358c.024.025.057.035.084.056A4.97 4.97 0 0 0 3 8c0 1.027.31 1.98.842 2.773-.027.022-.06.031-.084.056l-1.36 1.358Zm5.6-.187A4 4 0 1 1 8 4a4 4 0 0 1 0 8ZM8 1c1.573 0 3.019.525 4.187 1.4l-1.357 1.358c-.025.025-.035.057-.056.084A4.979 4.979 0 0 0 8 3a4.979 4.979 0 0 0-2.773.842c-.021-.027-.03-.059-.055-.084L3.814 2.4A6.957 6.957 0 0 1 8 1Zm0-1a8.001 8.001 0 1 0 .003 16.002A8.001 8.001 0 0 0 8 0Z"></path></svg> \ No newline at end of file diff --git a/docs/en/serverless/images/icons/importAction.svg b/docs/en/serverless/images/icons/importAction.svg new file mode 100644 index 0000000000..341653e6b1 --- /dev/null +++ b/docs/en/serverless/images/icons/importAction.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" class="euiIcon eui-alignMiddle css-61rd3k-euiIcon-m-isLoaded" role="img" data-icon-type="importAction" data-is-loaded="true" aria-hidden="true"><path d="m9 10.114 1.85-1.943a.52.52 0 0 1 .77 0c.214.228.214.6 0 .829l-1.95 2.05a1.552 1.552 0 0 1-2.31 0L5.41 9a.617.617 0 0 1 0-.829.52.52 0 0 1 .77 0L8 10.082V1.556C8 1.249 8.224 1 8.5 1s.5.249.5.556v8.558ZM4.18 6a.993.993 0 0 0-.972.804l-1.189 6A.995.995 0 0 0 2.991 14h11.018a1 1 0 0 0 .972-1.196l-1.19-6a.993.993 0 0 0-.97-.804H4.18ZM6 5v1h5V5h1.825c.946 0 1.76.673 1.946 1.608l1.19 6A2 2 0 0 1 14.016 15H2.984a1.992 1.992 0 0 1-1.945-2.392l1.19-6C2.414 5.673 3.229 5 4.174 5H6Z"></path></svg> \ No newline at end of file diff --git a/docs/en/serverless/images/icons/indexClose.svg b/docs/en/serverless/images/icons/indexClose.svg new file mode 100644 index 0000000000..cb4d8f2cd2 --- /dev/null +++ b/docs/en/serverless/images/icons/indexClose.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" class="euiIcon eui-alignMiddle css-61rd3k-euiIcon-m-isLoaded" role="img" data-icon-type="indexClose" data-is-loaded="true" aria-hidden="true"><path d="M12 2H2v11h6v1H1V1h12v6h-1V2ZM5 5h5.999V4H5v1ZM3 5V4h1v1H3Zm2 3V7h3v1H5ZM3 8V7h1v1H3Zm2 3v-1h2v1H5Zm5.5-1.207L9.086 8.379l-.707.707L9.793 10.5l-1.414 1.414.707.707 1.414-1.414 1.414 1.414.707-.707-1.414-1.414 1.414-1.414-.707-.707L10.5 9.793ZM3 11v-1h1v1H3Zm7.5-5a4.5 4.5 0 1 1 0 9 4.5 4.5 0 0 1 0-9Z"></path></svg> \ No newline at end of file diff --git a/docs/en/serverless/images/icons/indexOpen.svg b/docs/en/serverless/images/icons/indexOpen.svg new file mode 100644 index 0000000000..09e9d7284b --- /dev/null +++ b/docs/en/serverless/images/icons/indexOpen.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" class="euiIcon eui-alignMiddle css-61rd3k-euiIcon-m-isLoaded" role="img" data-icon-type="indexOpen" data-is-loaded="true" aria-hidden="true"><path d="M12 2H2v11h6v1H1V1h12v6h-1V2ZM5 5h5.999V4H5v1ZM3 5V4h1v1H3Zm2 3V7h3v1H5ZM3 8V7h1v1H3Zm2 3v-1h2v1H5Zm5-1H8v1h2v2h1v-2h2v-1h-2V8h-1v2Zm-7 1v-1h1v1H3Zm7.5-5a4.5 4.5 0 1 1 0 9 4.5 4.5 0 0 1 0-9Z"></path></svg> \ No newline at end of file diff --git a/docs/en/serverless/images/icons/inspect.svg b/docs/en/serverless/images/icons/inspect.svg new file mode 100644 index 0000000000..43374b4aa4 --- /dev/null +++ b/docs/en/serverless/images/icons/inspect.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" role="img" data-icon-type="inspect" data-is-loaded="true" aria-hidden="true"><path d="M15.363 14.658a.5.5 0 11-.713.7l-2.97-3.023a.5.5 0 01.001-.7A3.9 3.9 0 108.9 12.8a.5.5 0 110 .999 4.9 4.9 0 113.821-1.833l2.642 2.691zM3.094 13a.5.5 0 110 1H2.5A2.5 2.5 0 010 11.5v-9A2.5 2.5 0 012.5 0h9A2.5 2.5 0 0114 2.5v.599a.5.5 0 11-1 0V2.5A1.5 1.5 0 0011.5 1h-9A1.5 1.5 0 001 2.5v9A1.5 1.5 0 002.5 13h.594zM2.5 3a.5.5 0 110-1 .5.5 0 010 1zm2 0a.5.5 0 110-1 .5.5 0 010 1zm2 0a.5.5 0 110-1 .5.5 0 010 1zm-4 2a.5.5 0 110-1 .5.5 0 010 1zm2 0a.5.5 0 110-1 .5.5 0 010 1zm-2 1a.5.5 0 110 1 .5.5 0 010-1zm0 3a.5.5 0 110-1 .5.5 0 010 1zm6-6a.5.5 0 110-1 .5.5 0 010 1zm2 0a.5.5 0 110-1 .5.5 0 010 1zm-8 8a.5.5 0 110-1 .5.5 0 010 1z"></path></svg> \ No newline at end of file diff --git a/docs/en/serverless/images/icons/list.svg b/docs/en/serverless/images/icons/list.svg new file mode 100644 index 0000000000..52e8e7acd1 --- /dev/null +++ b/docs/en/serverless/images/icons/list.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" role="img" data-icon-type="list" data-is-loaded="true" aria-hidden="true"><path d="M2 4V3h2v1H2Zm4 0V3h8v1H6Zm0 3V6h8v1H6Zm0 3V9h8v1H6ZM2 7V6h2v1H2Zm0 3V9h2v1H2Zm4 3v-1h8v1H6Zm-4 0v-1h2v1H2Z"></path></svg> \ No newline at end of file diff --git a/docs/en/serverless/images/icons/listAdd.svg b/docs/en/serverless/images/icons/listAdd.svg new file mode 100644 index 0000000000..b59e25bcc4 --- /dev/null +++ b/docs/en/serverless/images/icons/listAdd.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" class="euiIcon eui-alignMiddle css-61rd3k-euiIcon-m-isLoaded" role="img" data-icon-type="listAdd" data-is-loaded="true" aria-hidden="true"><path d="M11 11H9v1h2v2h1v-2h2v-1h-2V9h-1v2ZM7.758 9a4.5 4.5 0 1 1-.502 4H6v-1h1.027a4.548 4.548 0 0 1 .23-2H6V9h1.758ZM2 4V3h2v1H2Zm4 0V3h8v1H6Zm0 3V6h8v1H6ZM2 7V6h2v1H2Zm0 3V9h2v1H2Zm0 3v-1h2v1H2Z"></path></svg> \ No newline at end of file diff --git a/docs/en/serverless/images/icons/merge.svg b/docs/en/serverless/images/icons/merge.svg new file mode 100644 index 0000000000..478d340599 --- /dev/null +++ b/docs/en/serverless/images/icons/merge.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" class="euiIcon eui-alignMiddle css-61rd3k-euiIcon-m-isLoaded" role="img" data-icon-type="merge" data-is-loaded="true" aria-hidden="true"><path d="M7.352 6H2.5a.5.5 0 0 1 0-1h4.852L5.12 2.721c-.18-.183-.155-.46.055-.616a.551.551 0 0 1 .705.048l3 3.062c.16.164.16.405 0 .57l-3 3.062A.532.532 0 0 1 5.5 9a.54.54 0 0 1-.325-.106c-.21-.157-.235-.433-.055-.616L7.352 6Zm1.296 4H13.5a.5.5 0 0 1 0 1H8.648l2.232 2.278c.18.183.155.46-.055.617A.54.54 0 0 1 10.5 14a.532.532 0 0 1-.38-.153l-3-3.063a.397.397 0 0 1 0-.568l3-3.063a.551.551 0 0 1 .705-.047c.21.156.235.433.055.616L8.648 10Z"></path></svg> \ No newline at end of file diff --git a/docs/en/serverless/images/icons/minus.svg b/docs/en/serverless/images/icons/minus.svg new file mode 100644 index 0000000000..763922a916 --- /dev/null +++ b/docs/en/serverless/images/icons/minus.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" role="img" data-icon-type="minus" data-is-loaded="true" aria-hidden="true"><rect width="10" height="1.5" x="3" y="7.25" rx="0.5"></rect></svg> \ No newline at end of file diff --git a/docs/en/serverless/images/icons/minusInCircle.svg b/docs/en/serverless/images/icons/minusInCircle.svg new file mode 100644 index 0000000000..3851640918 --- /dev/null +++ b/docs/en/serverless/images/icons/minusInCircle.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" class="euiIcon eui-alignMiddle css-61rd3k-euiIcon-m-isLoaded" role="img" data-icon-type="minusInCircle" data-is-loaded="true" aria-hidden="true"><path fill-rule="evenodd" d="M7.5 0C11.636 0 15 3.364 15 7.5S11.636 15 7.5 15 0 11.636 0 7.5 3.364 0 7.5 0Zm0 .882a6.618 6.618 0 1 0 0 13.236A6.618 6.618 0 0 0 7.5.882ZM3.5 7h8a.5.5 0 1 1 0 1h-8a.5.5 0 0 1 0-1Z"></path></svg> \ No newline at end of file diff --git a/docs/en/serverless/images/icons/pagesSelect.svg b/docs/en/serverless/images/icons/pagesSelect.svg new file mode 100644 index 0000000000..6238881210 --- /dev/null +++ b/docs/en/serverless/images/icons/pagesSelect.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" class="euiIcon eui-alignMiddle css-61rd3k-euiIcon-m-isLoaded" role="img" data-icon-type="pagesSelect" data-is-loaded="true" aria-hidden="true"><path fill-rule="evenodd" d="M3 1a1 1 0 0 1 1-1h8a1 1 0 0 1 .707.293l2 2A1 1 0 0 1 15 3v5a4.995 4.995 0 0 0-1-.584V4h-2a1 1 0 0 1-1-1V1H4v12h3.1c.07.348.177.682.316 1H4a1 1 0 0 1-1-1V1zm5 14H2V2a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h7a5.029 5.029 0 0 1-1-1zm8-3a4 4 0 1 1-8 0 4 4 0 0 1 8 0zm-1.646-1.354a.5.5 0 0 1 0 .708l-2.5 2.5a.5.5 0 0 1-.708 0l-1-1a.5.5 0 0 1 .708-.708l.646.647 2.146-2.147a.5.5 0 0 1 .708 0z"></path></svg> \ No newline at end of file diff --git a/docs/en/serverless/images/icons/pencil.svg b/docs/en/serverless/images/icons/pencil.svg new file mode 100644 index 0000000000..cb16b5d2f0 --- /dev/null +++ b/docs/en/serverless/images/icons/pencil.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" role="img" data-icon-type="pencil" data-is-loaded="true" aria-hidden="true"><path d="M12.148 3.148L11 2l-9 9v3h3l9-9-1.144-1.144-8.002 7.998a.502.502 0 01-.708 0 .502.502 0 010-.708l8.002-7.998zM11 1c.256 0 .512.098.707.293l3 3a.999.999 0 010 1.414l-9 9A.997.997 0 015 15H2a1 1 0 01-1-1v-3c0-.265.105-.52.293-.707l9-9A.997.997 0 0111 1zM5 14H2v-3l3 3z"></path></svg> \ No newline at end of file diff --git a/docs/en/serverless/images/icons/plusInCircle.svg b/docs/en/serverless/images/icons/plusInCircle.svg new file mode 100644 index 0000000000..2a655e0396 --- /dev/null +++ b/docs/en/serverless/images/icons/plusInCircle.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" class="euiIcon eui-alignMiddle css-61rd3k-euiIcon-m-isLoaded" role="img" data-icon-type="plusInCircle" data-is-loaded="true" aria-hidden="true"><path fill-rule="evenodd" d="M8 7h3.5a.5.5 0 1 1 0 1H8v3.5a.5.5 0 1 1-1 0V8H3.5a.5.5 0 0 1 0-1H7V3.5a.5.5 0 0 1 1 0V7Zm-.5-7C11.636 0 15 3.364 15 7.5S11.636 15 7.5 15 0 11.636 0 7.5 3.364 0 7.5 0Zm0 .882a6.618 6.618 0 1 0 0 13.236A6.618 6.618 0 0 0 7.5.882Z"></path></svg> \ No newline at end of file diff --git a/docs/en/serverless/images/icons/plusInCircleFilled.svg b/docs/en/serverless/images/icons/plusInCircleFilled.svg new file mode 100644 index 0000000000..c2052e4c5f --- /dev/null +++ b/docs/en/serverless/images/icons/plusInCircleFilled.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" class="euiIcon eui-alignMiddle css-61rd3k-euiIcon-m-isLoaded" role="img" data-icon-type="plusInCircleFilled" data-is-loaded="true" aria-hidden="true"><path d="M8 7V3.5a.5.5 0 0 0-1 0V7H3.5a.5.5 0 0 0 0 1H7v3.5a.5.5 0 1 0 1 0V8h3.5a.5.5 0 1 0 0-1H8Zm-.5 8a7.5 7.5 0 1 1 0-15 7.5 7.5 0 0 1 0 15Z"></path></svg> \ No newline at end of file diff --git a/docs/en/serverless/images/icons/popout.svg b/docs/en/serverless/images/icons/popout.svg new file mode 100644 index 0000000000..875bf6662d --- /dev/null +++ b/docs/en/serverless/images/icons/popout.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" role="img" data-icon-type="popout" data-is-loaded="true" aria-hidden="true"><path d="M13 8.5a.5.5 0 111 0V12a2 2 0 01-2 2H4a2 2 0 01-2-2V4a2 2 0 012-2h3.5a.5.5 0 010 1H4a1 1 0 00-1 1v8a1 1 0 001 1h8a1 1 0 001-1V8.5zm-5.12.339a.5.5 0 11-.706-.707L13.305 2H10.5a.5.5 0 110-1H14a1 1 0 011 1v3.5a.5.5 0 11-1 0V2.72L7.88 8.838z"></path></svg> \ No newline at end of file diff --git a/docs/en/serverless/images/icons/questionInCircle.svg b/docs/en/serverless/images/icons/questionInCircle.svg new file mode 100644 index 0000000000..b715f289ad --- /dev/null +++ b/docs/en/serverless/images/icons/questionInCircle.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" class="euiIcon eui-alignMiddle css-61rd3k-euiIcon-m-isLoaded" role="img" data-icon-type="questionInCircle" data-is-loaded="true" aria-hidden="true"><path d="M8 14A6 6 0 1 1 8 2a6 6 0 0 1 0 12Zm0-1A5 5 0 1 0 8 3a5 5 0 0 0 0 10Zm-.186-1.065A.785.785 0 0 1 7 11.12c0-.48.34-.82.814-.82.475 0 .809.34.809.82 0 .475-.334.815-.809.815ZM5.9 6.317C5.96 5.168 6.755 4.4 8.048 4.4c1.218 0 2.091.759 2.091 1.8 0 .736-.36 1.304-1.03 1.707-.56.33-.717.56-.717 1.022v.305l-.1.1H7.47l-.1-.1v-.431c-.005-.646.302-1.104.987-1.514.527-.322.708-.59.708-1.047 0-.536-.416-.91-1.05-.91-.652 0-1.064.374-1.112.998l-.1.092H6l-.1-.105Z"></path></svg> \ No newline at end of file diff --git a/docs/en/serverless/images/icons/refresh.svg b/docs/en/serverless/images/icons/refresh.svg new file mode 100644 index 0000000000..58662be4af --- /dev/null +++ b/docs/en/serverless/images/icons/refresh.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" role="img" data-icon-type="refresh" data-is-loaded="true" aria-hidden="true"><path d="M11.228 2.942a.5.5 0 1 1-.538.842A5 5 0 1 0 13 8a.5.5 0 1 1 1 0 6 6 0 1 1-2.772-5.058ZM14 1.5v3A1.5 1.5 0 0 1 12.5 6h-3a.5.5 0 0 1 0-1h3a.5.5 0 0 0 .5-.5v-3a.5.5 0 1 1 1 0Z"></path></svg> \ No newline at end of file diff --git a/docs/en/serverless/images/icons/sortDown.svg b/docs/en/serverless/images/icons/sortDown.svg new file mode 100644 index 0000000000..7efa30e917 --- /dev/null +++ b/docs/en/serverless/images/icons/sortDown.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" role="img" data-icon-type="sortDown" data-is-loaded="true" aria-hidden="true"><path d="M7 11.692V3.556C7 3.249 7.224 3 7.5 3s.5.249.5.556v8.136l4.096-4.096a.5.5 0 01.707.707l-4.242 4.243a1.494 1.494 0 01-.925.433.454.454 0 01-.272 0 1.494 1.494 0 01-.925-.433L2.197 8.303a.5.5 0 11.707-.707L7 11.692z"></path></svg> \ No newline at end of file diff --git a/docs/en/serverless/images/icons/sortUp.svg b/docs/en/serverless/images/icons/sortUp.svg new file mode 100644 index 0000000000..c5d0f004ad --- /dev/null +++ b/docs/en/serverless/images/icons/sortUp.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" role="img" data-icon-type="sortUp" data-is-loaded="true" aria-hidden="true"><path d="M8 4.207v8.237c0 .307-.224.556-.5.556s-.5-.249-.5-.556V4.207L2.904 8.303a.5.5 0 01-.707-.707l4.242-4.242a1.5 1.5 0 012.122 0l4.242 4.242a.5.5 0 11-.707.707L8 4.207z"></path></svg> \ No newline at end of file diff --git a/docs/en/serverless/images/icons/tableDensityCompact.svg b/docs/en/serverless/images/icons/tableDensityCompact.svg new file mode 100644 index 0000000000..9eabb5fe83 --- /dev/null +++ b/docs/en/serverless/images/icons/tableDensityCompact.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" role="img" data-icon-type="tableDensityCompact" data-is-loaded="true" aria-hidden="true"><path d="M16 3v11a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V2a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v1Zm-1 0V2a1 1 0 0 0-1-1H2a1 1 0 0 0-1 1v1h14Zm0 1H1v10a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V4ZM4.496 7a.5.5 0 0 1 0 1H2.495a.5.5 0 0 1 0-1h2.001Zm5.218 0c.158 0 .286.224.286.5s-.128.5-.286.5H6.286C6.128 8 6 7.776 6 7.5s.128-.5.286-.5h3.428ZM4.496 5a.5.5 0 0 1 0 1H2.495a.5.5 0 0 1 0-1h2.001Zm5.218 0c.158 0 .286.224.286.5s-.128.5-.286.5H6.286C6.128 6 6 5.776 6 5.5s.128-.5.286-.5h3.428ZM4.496 9a.5.5 0 0 1 0 1H2.495a.5.5 0 0 1 0-1h2.001Zm5.218 0c.158 0 .286.224.286.5s-.128.5-.286.5H6.286C6.128 10 6 9.776 6 9.5s.128-.5.286-.5h3.428Zm-5.218 2a.5.5 0 0 1 0 1H2.495a.5.5 0 0 1 0-1h2.001Zm5.218 0c.158 0 .286.224.286.5s-.128.5-.286.5H6.286C6.128 12 6 11.776 6 11.5s.128-.5.286-.5h3.428Zm-5.218 2a.5.5 0 0 1 0 1H2.495a.5.5 0 0 1 0-1h2.001Zm9-6a.5.5 0 0 1 0 1h-2.001a.5.5 0 0 1 0-1h2.001Zm0-2a.5.5 0 0 1 0 1h-2.001a.5.5 0 0 1 0-1h2.001Zm0 4a.5.5 0 0 1 0 1h-2.001a.5.5 0 0 1 0-1h2.001Zm0 2a.5.5 0 0 1 0 1h-2.001a.5.5 0 0 1 0-1h2.001Zm0 2a.5.5 0 0 1 0 1h-2.001a.5.5 0 0 1 0-1h2.001Zm-3.782 0c.158 0 .286.224.286.5s-.128.5-.286.5H6.286C6.128 14 6 13.776 6 13.5s.128-.5.286-.5h3.428Z"></path></svg> \ No newline at end of file diff --git a/docs/en/serverless/index.asciidoc b/docs/en/serverless/index.asciidoc new file mode 100644 index 0000000000..4b7177f447 --- /dev/null +++ b/docs/en/serverless/index.asciidoc @@ -0,0 +1,152 @@ +:doctype: book + +include::{docs-root}/shared/versions/stack/{source_branch}.asciidoc[] +include::{docs-root}/shared/attributes.asciidoc[] + += Elastic Observability + +include::./observability-overview.asciidoc[leveloffset=+1] + +include::./quickstarts/overview.asciidoc[leveloffset=+1] +include::./quickstarts/monitor-hosts-with-elastic-agent.asciidoc[leveloffset=+2] +include::./quickstarts/k8s-logs-metrics.asciidoc[leveloffset=+2] + +include::./projects/billing.asciidoc[leveloffset=+1] + +include::./projects/create-an-observability-project.asciidoc[leveloffset=+1] + +include::./logging/log-monitoring.asciidoc[leveloffset=+1] +include::./logging/get-started-with-logs.asciidoc[leveloffset=+2] +include::./logging/stream-log-files.asciidoc[leveloffset=+2] +include::./logging/correlate-application-logs.asciidoc[leveloffset=+2] +include::./logging/plaintext-application-logs.asciidoc[leveloffset=+3] +include::./logging/ecs-application-logs.asciidoc[leveloffset=+3] +include::./logging/send-application-logs.asciidoc[leveloffset=+3] +include::./logging/parse-log-data.asciidoc[leveloffset=+2] +include::./logging/filter-and-aggregate-logs.asciidoc[leveloffset=+2] +include::./logging/view-and-monitor-logs.asciidoc[leveloffset=+2] +include::./logging/add-logs-service-name.asciidoc[leveloffset=+2] +include::./logging/run-log-pattern-analysis.asciidoc[leveloffset=+2] +include::./logging/troubleshoot-logs.asciidoc[leveloffset=+2] + +include::./inventory.asciidoc[leveloffset=+1] + +include::./apm/apm.asciidoc[leveloffset=+1] +include::./apm/apm-get-started.asciidoc[leveloffset=+2] +include::./apm/apm-send-traces-to-elastic.asciidoc[leveloffset=+2] +include::./apm-agents/apm-agents-elastic-apm-agents.asciidoc[leveloffset=+3] +include::./apm-agents/apm-agents-opentelemetry.asciidoc[leveloffset=+3] +include::./apm-agents/apm-agents-opentelemetry-opentelemetry-native-support.asciidoc[leveloffset=+4] +include::./apm-agents/apm-agents-opentelemetry-collect-metrics.asciidoc[leveloffset=+4] +include::./apm-agents/apm-agents-opentelemetry-limitations.asciidoc[leveloffset=+4] +include::./apm-agents/apm-agents-opentelemetry-resource-attributes.asciidoc[leveloffset=+4] +include::./apm-agents/apm-agents-aws-lambda-functions.asciidoc[leveloffset=+3] +include::./apm/apm-view-and-analyze-traces.asciidoc[leveloffset=+2] +include::./apm/apm-find-transaction-latency-and-failure-correlations.asciidoc[leveloffset=+3] +include::./apm/apm-integrate-with-machine-learning.asciidoc[leveloffset=+3] +include::./apm/apm-create-custom-links.asciidoc[leveloffset=+3] +include::./apm/apm-track-deployments-with-annotations.asciidoc[leveloffset=+3] +include::./apm/apm-query-your-data.asciidoc[leveloffset=+3] +include::./apm/apm-filter-your-data.asciidoc[leveloffset=+3] +include::./apm/apm-observe-lambda-functions.asciidoc[leveloffset=+3] +include::./apm/apm-ui-overview.asciidoc[leveloffset=+3] +include::./apm/apm-ui-services.asciidoc[leveloffset=+4] +include::./apm/apm-ui-traces.asciidoc[leveloffset=+4] +include::./apm/apm-ui-dependencies.asciidoc[leveloffset=+4] +include::./apm/apm-ui-service-map.asciidoc[leveloffset=+4] +include::./apm/apm-ui-service-overview.asciidoc[leveloffset=+4] +include::./apm/apm-ui-transactions.asciidoc[leveloffset=+4] +include::./apm/apm-ui-trace-sample-timeline.asciidoc[leveloffset=+4] +include::./apm/apm-ui-errors.asciidoc[leveloffset=+4] +include::./apm/apm-ui-metrics.asciidoc[leveloffset=+4] +include::./apm/apm-ui-infrastructure.asciidoc[leveloffset=+4] +include::./apm/apm-ui-logs.asciidoc[leveloffset=+4] +include::./apm/apm-data-types.asciidoc[leveloffset=+2] +include::./apm/apm-distributed-tracing.asciidoc[leveloffset=+2] +include::./apm/apm-reduce-your-data-usage.asciidoc[leveloffset=+2] +include::./apm/apm-transaction-sampling.asciidoc[leveloffset=+3] +include::./apm/apm-compress-spans.asciidoc[leveloffset=+3] +include::./apm/apm-stacktrace-collection.asciidoc[leveloffset=+3] +include::./apm/apm-keep-data-secure.asciidoc[leveloffset=+2] +include::./apm/apm-troubleshooting.asciidoc[leveloffset=+2] +include::./apm/apm-reference.asciidoc[leveloffset=+2] +include::./apm/apm-kibana-settings.asciidoc[leveloffset=+3] +include::./apm/apm-server-api.asciidoc[leveloffset=+3] + +include::./infra-monitoring/infra-monitoring.asciidoc[leveloffset=+1] +include::./infra-monitoring/get-started-with-metrics.asciidoc[leveloffset=+2] +include::./infra-monitoring/view-infrastructure-metrics.asciidoc[leveloffset=+2] +include::./infra-monitoring/analyze-hosts.asciidoc[leveloffset=+2] +include::./infra-monitoring/detect-metric-anomalies.asciidoc[leveloffset=+2] +include::./infra-monitoring/configure-infra-settings.asciidoc[leveloffset=+2] +include::./infra-monitoring/troubleshooting-infra.asciidoc[leveloffset=+2] +include::./infra-monitoring/handle-no-results-found-message.asciidoc[leveloffset=+3] +include::./infra-monitoring/metrics-reference.asciidoc[leveloffset=+2] +include::./infra-monitoring/host-metrics.asciidoc[leveloffset=+3] +include::./infra-monitoring/container-metrics.asciidoc[leveloffset=+3] +include::./infra-monitoring/kubernetes-pod-metrics.asciidoc[leveloffset=+3] +include::./infra-monitoring/aws-metrics.asciidoc[leveloffset=+3] +include::./infra-monitoring/metrics-app-fields.asciidoc[leveloffset=+2] + +include::./synthetics/synthetics-intro.asciidoc[leveloffset=+1] +include::./synthetics/synthetics-get-started.asciidoc[leveloffset=+2] +include::./synthetics/synthetics-get-started-project.asciidoc[leveloffset=+3] +include::./synthetics/synthetics-get-started-ui.asciidoc[leveloffset=+3] +include::./synthetics/synthetics-journeys.asciidoc[leveloffset=+2] +include::./synthetics/synthetics-create-test.asciidoc[leveloffset=+3] +include::./synthetics/synthetics-monitor-use.asciidoc[leveloffset=+3] +include::./synthetics/synthetics-recorder.asciidoc[leveloffset=+3] +include::./synthetics/synthetics-lightweight.asciidoc[leveloffset=+2] +include::./synthetics/synthetics-manage-monitors.asciidoc[leveloffset=+2] +include::./synthetics/synthetics-params-secrets.asciidoc[leveloffset=+2] +include::./synthetics/synthetics-analyze.asciidoc[leveloffset=+2] +include::./synthetics/synthetics-private-location.asciidoc[leveloffset=+2] +include::./synthetics/synthetics-command-reference.asciidoc[leveloffset=+2] +include::./synthetics/synthetics-configuration.asciidoc[leveloffset=+2] +include::./synthetics/synthetics-settings.asciidoc[leveloffset=+2] +include::./synthetics/synthetics-feature-roles.asciidoc[leveloffset=+2] +include::./synthetics/synthetics-manage-retention.asciidoc[leveloffset=+2] +include::./synthetics/synthetics-scale-and-architect.asciidoc[leveloffset=+2] +include::./synthetics/synthetics-security-encryption.asciidoc[leveloffset=+2] +include::./synthetics/synthetics-troubleshooting.asciidoc[leveloffset=+2] + +include::./dashboards/dashboards-and-visualizations.asciidoc[leveloffset=+1] + +include::./alerting/alerting.asciidoc[leveloffset=+1] +include::./alerting/create-manage-rules.asciidoc[leveloffset=+2] +include::./alerting/aiops-generate-anomaly-alerts.asciidoc[leveloffset=+3] +include::./alerting/create-anomaly-alert-rule.asciidoc[leveloffset=+3] +include::./alerting/create-custom-threshold-alert-rule.asciidoc[leveloffset=+3] +include::./alerting/create-elasticsearch-query-alert-rule.asciidoc[leveloffset=+3] +include::./alerting/create-error-count-threshold-alert-rule.asciidoc[leveloffset=+3] +include::./alerting/create-failed-transaction-rate-threshold-alert-rule.asciidoc[leveloffset=+3] +include::./alerting/create-inventory-threshold-alert-rule.asciidoc[leveloffset=+3] +include::./alerting/create-latency-threshold-alert-rule.asciidoc[leveloffset=+3] +include::./alerting/create-slo-burn-rate-alert-rule.asciidoc[leveloffset=+3] +include::./alerting/aggregation-options.asciidoc[leveloffset=+2] +include::./alerting/rate-aggregation.asciidoc[leveloffset=+3] +include::./alerting/view-alerts.asciidoc[leveloffset=+2] +include::./alerting/triage-slo-burn-rate-breaches.asciidoc[leveloffset=+3] +include::./alerting/triage-threshold-breaches.asciidoc[leveloffset=+3] + +include::./slos/slos.asciidoc[leveloffset=+1] +include::./slos/create-an-slo.asciidoc[leveloffset=+2] + +include::./cases/cases.asciidoc[leveloffset=+1] +include::./cases/create-manage-cases.asciidoc[leveloffset=+2] +include::./cases/manage-cases-settings.asciidoc[leveloffset=+2] + +include::./aiops/aiops.asciidoc[leveloffset=+1] +include::./aiops/aiops-detect-anomalies.asciidoc[leveloffset=+2] +include::./aiops/aiops-tune-anomaly-detection-job.asciidoc[leveloffset=+3] +include::./aiops/aiops-forecast-anomaly.asciidoc[leveloffset=+3] +include::./aiops/aiops-analyze-spikes.asciidoc[leveloffset=+2] +include::./aiops/aiops-detect-change-points.asciidoc[leveloffset=+2] + +include::./monitor-datasets.asciidoc[leveloffset=+1] + +include::./ai-assistant/ai-assistant.asciidoc[leveloffset=+1] + +include::./elastic-entity-model.asciidoc[leveloffset=+1] + +include::./technical-preview-limitations.asciidoc[leveloffset=+1] diff --git a/docs/en/serverless/infra-monitoring/analyze-hosts.asciidoc b/docs/en/serverless/infra-monitoring/analyze-hosts.asciidoc new file mode 100644 index 0000000000..0dc004ca58 --- /dev/null +++ b/docs/en/serverless/infra-monitoring/analyze-hosts.asciidoc @@ -0,0 +1,320 @@ +[[analyze-hosts]] += Analyze and compare hosts + +:description: Get a metrics-driven view of your hosts backed by an easy-to-use interface called Lens. +:keywords: serverless, observability, how to + +preview:[] + +We'd love to get your feedback! +https://docs.google.com/forms/d/e/1FAIpQLScRHG8TIVb1Oq8ZhD4aks3P1TmgiM58TY123QpDCcBz83YC6w/viewform[Tell us what you think!] + +The **Hosts** page provides a metrics-driven view of your infrastructure backed +by an easy-to-use interface called Lens. On the **Hosts** page, you can view +health and performance metrics to help you quickly: + +* Analyze and compare hosts without having to build new dashboards. +* Identify which hosts trigger the most alerts. +* Troubleshoot and resolve issues quickly. +* View historical data to rule out false alerts and identify root causes. +* Filter and search the data to focus on the hosts you care about the most. + +To access the **Hosts** page, in your {observability} project, go to +**Infrastructure** → **Hosts**. + +[role="screenshot"] +image::images/hosts.png[Screenshot of the Hosts page] + +To learn more about the metrics shown on this page, refer to the <<metrics-reference>> documentation. + +.Don't see any metrics? +[NOTE] +==== +If you haven't added data yet, click **Add data** to search for and install an Elastic integration. + +Need help getting started? Follow the steps in +<<get-started-with-metrics,Get started with system metrics>>. +==== + +The **Hosts** page provides several ways to view host metrics: + +* Overview tiles show the number of hosts returned by your search plus +averages of key metrics, including CPU usage, normalized load, and memory usage. +Max disk usage is also shown. +* The Host limit controls the maximum number of hosts shown on the page. The +default is 50, which means the page shows data for the top 50 hosts based on the +most recent timestamps. You can increase the host limit to see data for more +hosts, but doing so may impact query performance. +* The Hosts table shows a breakdown of metrics for each host along with an alert count +for any hosts with active alerts. You may need to page through the list +or change the number of rows displayed on each page to see all of your hosts. +* Each host name is an active link to a <<view-host-details,host details>> page, +where you can explore enhanced metrics and other observability data related to the selected host. +* Table columns are sortable, but note that the sorting behavior is applied to +the already returned data set. +* The tabs at the bottom of the page show an overview of the metrics, logs, +and alerts for all hosts returned by your search. + +[TIP] +==== +For more information about creating and viewing alerts, refer to <<alerting>>. +==== + +[discrete] +[[analyze-hosts-filter-view]] +== Filter the Hosts view + +The **Hosts** page provides several mechanisms for filtering the data on the +page: + +* Enter a search query using {kibana-ref}/kuery-query.html[{kib} Query Language] to show metrics that match your search criteria. For example, +to see metrics for hosts running on linux, enter `host.os.type : "linux"`. +Otherwise you’ll see metrics for all your monitored hosts (up to the number of +hosts specified by the host limit). +* Select additional criteria to filter the view: ++ +** In the **Operating System** list, select one or more operating systems +to include (or exclude) metrics for hosts running the selected operating systems. +** In the **Cloud Provider** list, select one or more cloud providers to +include (or exclude) metrics for hosts running on the selected cloud providers. +** In the **Service Name** list, select one or more service names to +include (or exclude) metrics for the hosts running the selected services. +Services must be instrumented by APM to be filterable. +This filter is useful for comparing different hosts to determine whether a problem lies +with a service or the host that it is running on. ++ +[TIP] +==== +Filtered results are sorted by _document count_. +Document count is the number of events received by Elastic for the hosts that match your filter criteria. +==== +* Change the date range in the time filter, or click and drag on a +visualization to change the date range. +* Within a visualization, click a point on a line and apply filters to set other +visualizations on the page to the same time and/or host. + +[discrete] +[[analyze-hosts-inspect-data]] +== View metrics + +On the **Metrics** tab, view metrics trending over time, including CPU usage, +normalized load, memory usage, disk usage, and other metrics related to disk IOPs and throughput. +Place your cursor over a line to view metrics at a specific +point in time. From within each visualization, you can choose to open the visualization in Lens. + +To see metrics for a specific host, refer to <<view-host-details,View host details>>. + +//// +/* TODO: Uncomment this section if/when the inspect option feature is added back in. +<div id="inspect-metrics"></div> + +### Inspect and download metrics + +You can access a text-based view of the data underlying +your metrics visualizations and optionally download the data to a +comma-separated (CSV) file. + +Hover your cursor over a visualization, then in the upper-right corner, click +the ellipsis icon to inspect the data. + +![Screenshot showing option to inspect data](../images/hosts-inspect.png) + +In the flyout, click **Download CSV** to download formatted or raw data to a CSV +file. + +Click **View: Data** and notice that you can change the view to **Requests** to explore the request +used to fetch the data and the response returned from {es}. On the **Request** tab, click links +to further inspect and analyze the request in the Dev Console or Search Profiler. */ +//// + +[discrete] +[[analyze-hosts-open-in-lens]] +=== Open in Lens + +Metrics visualizations are powered by Lens, meaning you can continue your +analysis in Lens if you require more flexibility. Hover your cursor over a +visualization, then click the ellipsis icon in the upper-right corner to open +the visualization in Lens. + +[role="screenshot"] +image::images/hosts-open-in-lens.png[Screenshot showing option to open in Lens] + +In Lens, you can examine all the fields and formulas used to create the +visualization, make modifications to the visualization, and save your changes. + +For more information about using Lens, refer to the +{kibana-ref}/lens.html[{kib} documentation about Lens]. + +[discrete] +[[analyze-hosts-view-logs]] +== View logs + +On the **Logs** tab of the **Hosts** page, view logs for the systems you are monitoring and search +for specific log entries. This view shows logs for all of the hosts returned by +the current query. + +[role="screenshot"] +image::images/hosts-logs.png[Screenshot showing Logs view] + +To see logs for a specific host, refer to <<view-host-details,View host details>>. + +[discrete] +[[analyze-hosts-view-alerts]] +== View alerts + +On the **Alerts** tab of the **Hosts** page, view active alerts to pinpoint problems. Use this view +to figure out which hosts triggered alerts and identify root causes. This view +shows alerts for all of the hosts returned by the current query. + +From the **Actions** menu, you can choose to: + +* Add the alert to a new or existing case. +* View rule details. +* View alert details. + +[role="screenshot"] +image::images/hosts-view-alerts.png[Screenshot showing Alerts view] + +To see alerts for a specific host, refer to <<view-host-details,View host details>>. + +.Why are alerts missing from the Hosts page? +[NOTE] +==== +If your rules are triggering alerts that don't appear on the **Hosts** page, +edit the rules and make sure they are correctly configured to associate the host name with the alert: + +* For Metric threshold or Custom threshold rules, select `host.name` in the **Group alerts by** field. +* For Inventory rules, select **Host** for the node type under **Conditions**. + +To learn more about creating and managing rules, refer to <<alerting>>. +==== + +[discrete] +[[view-host-details]] +== View host details + +Without leaving the **Hosts** page, you can view enhanced metrics relating to +each host running in your infrastructure. In the list of hosts, find the host +you want to monitor, then click the **Toggle dialog with details** +icon image:images/expand-icon.png[] to display the host details overlay. + +[TIP] +==== +To expand the overlay and view more detail, click **Open as page** in the upper-right corner. +==== + +The host details overlay contains the following tabs: + +include::../transclusion/host-details.asciidoc[] + +[NOTE] +==== +The metrics shown on the **Hosts** page are also available when viewing hosts on the **Inventory** page. +==== + +[discrete] +[[analyze-hosts-why-dashed-lines]] +== Why am I seeing dashed lines in charts? + +There are a few reasons why you may see dashed lines in your charts. + +* <<dashed-interval,The chart interval is too short>> +* <<dashed-missing,Data is missing>> +* <<analyze-hosts-the-chart-interval-is-too-short-and-data-is-missing,The chart interval is too short and data is missing>> + +[discrete] +[[dashed-interval]] +=== The chart interval is too short + +In this example, the data emission rate is lower than the Lens chart interval. +A dashed line connects the known data points to make it easier to visualize trends in the data. + +[role="screenshot"] +image::images/hosts-dashed.png[Screenshot showing dashed chart] + +The chart interval is automatically set depending on the selected time duration. +To fix this problem, change the selected time range at the top of the page. + +[TIP] +==== +Want to dig in further while maintaining the selected time duration? +Hover over the chart you're interested in and select **Options** → **Open in Lens**. +Once in Lens, you can adjust the chart interval temporarily. +Note that this change is not persisted in the **Hosts** view. +==== + +[discrete] +[[dashed-missing]] +=== Data is missing + +A solid line indicates that the chart interval is set appropriately for the data transmission rate. +In this example, a solid line turns into a dashed line—indicating missing data. +You may want to investigate this time period to determine if there is an outage or issue. + +[role="screenshot"] +image::images/hosts-missing-data.png[Screenshot showing missing data] + +[discrete] +[[analyze-hosts-the-chart-interval-is-too-short-and-data-is-missing]] +=== The chart interval is too short and data is missing + +In the example shown in the screenshot, +the data emission rate is lower than the Lens chart interval **and** there is missing data. + +This missing data can be hard to spot at first glance. +The green boxes outline regular data emissions, while the missing data is outlined in pink. +Similar to the above scenario, you may want to investigate the time period with the missing data +to determine if there is an outage or issue. + +[role="screenshot"] +image::images/hosts-dashed-and-missing.png[Screenshot showing dashed lines and missing data] + +[discrete] +[[analyze-hosts-troubleshooting]] +== Troubleshooting + +//// +/* +Troubleshooting topic template: +Title: Brief description of what the user sees/experiences +Content: +1. What the user sees/experiences (error message, UI, behavior, etc) +2. Why it happens +3. How to fix it +*/ +//// + +[discrete] +[[analyze-hosts-what-does-mean]] +=== What does _this host has been detected by APM_ mean? + +// What the user sees/experiences (error message, UI, behavior, etc) + +In the Hosts view, you might see a question mark icon (image:images/icons/questionInCircle.svg[Question mark icon]) +before a host name with a tooltip note stating that the host has been detected by APM. + +// Why it happens + +When a host is detected by APM, but is not collecting full metrics +(for example, through the https://www.elastic.co/docs/current/integrations/system[system integration]), +it will be listed as a host with the partial metrics collected by APM. + +// How to fix it + +// N/A? + +// What the user sees/experiences (error message, UI, behavior, etc) + +[discrete] +[[analyze-hosts-i-dont-recognize-a-host-name-and-i-see-a-question-mark-icon-next-to-it]] +=== I don't recognize a host name and I see a question mark icon next to it + +// Why it happens + +This could mean that the APM agent has not been configured to use the correct host name. +Instead, the host name might be the container name or the Kubernetes pod name. + +// How to fix it + +To get the correct host name, you need to set some additional configuration options, +specifically `system.kubernetes.node.name` as described in <<apm-server-api,Kubernetes data>>. diff --git a/docs/en/serverless/infra-monitoring/aws-metrics.asciidoc b/docs/en/serverless/infra-monitoring/aws-metrics.asciidoc new file mode 100644 index 0000000000..d1d6346131 --- /dev/null +++ b/docs/en/serverless/infra-monitoring/aws-metrics.asciidoc @@ -0,0 +1,123 @@ +[[aws-metrics]] += AWS metrics + +:description: Learn about key metrics used for AWS monitoring. +:keywords: serverless, observability, reference + +preview:[] + +[IMPORTANT] +==== +Additional AWS charges for GetMetricData API requests are generated using this module. +==== + +[discrete] +[[monitor-ec2-instances]] +== Monitor EC2 instances + +To analyze EC2 instance metrics, +you can select view filters based on the following predefined metrics, +or you can add <<custom-metrics,custom metrics>>. + +|=== +| | + +| **CPU Usage** +| Average of `aws.ec2.cpu.total.pct`. + +| **Inbound Traffic** +| Average of `aws.ec2.network.in.bytes_per_sec`. + +| **Outbound Traffic** +| Average of `aws.ec2.network.out.bytes_per_sec`. + +| **Disk Reads (Bytes)** +| Average of `aws.ec2.diskio.read.bytes_per_sec`. + +| **Disk Writes (Bytes)** +| Average of `aws.ec2.diskio.write.bytes_per_sec`. +|=== + +[discrete] +[[monitor-s3-buckets]] +== Monitor S3 buckets + +To analyze S3 bucket metrics, +you can select view filters based on the following predefined metrics, +or you can add <<custom-metrics,custom metrics>>. + +|=== +| | + +| **Bucket Size** +| Average of `aws.s3_daily_storage.bucket.size.bytes`. + +| **Total Requests** +| Average of `aws.s3_request.requests.total`. + +| **Number of Objects** +| Average of `aws.s3_daily_storage.number_of_objects`. + +| **Downloads (Bytes)** +| Average of `aws.s3_request.downloaded.bytes`. + +| **Uploads (Bytes)** +| Average of `aws.s3_request.uploaded.bytes`. +|=== + +[discrete] +[[monitor-sqs-queues]] +== Monitor SQS queues + +To analyze SQS queue metrics, +you can select view filters based on the following predefined metrics, +or you can add <<custom-metrics,custom metrics>>. + +|=== +| | + +| **Messages Available** +| Max of `aws.sqs.messages.visible`. + +| **Messages Delayed** +| Max of `aws.sqs.messages.delayed`. + +| **Messages Added** +| Max of `aws.sqs.messages.sent`. + +| **Messages Returned Empty** +| Max of `aws.sqs.messages.not_visible`. + +| **Oldest Message** +| Max of `aws.sqs.oldest_message_age.sec`. +|=== + +[discrete] +[[monitor-rds-databases]] +== Monitor RDS databases + +To analyze RDS database metrics, +you can select view filters based on the following predefined metrics, +or you can add <<custom-metrics,custom metrics>>. + +|=== +| | + +| **CPU Usage** +| Average of `aws.rds.cpu.total.pct`. + +| **Connections** +| Average of `aws.rds.database_connections`. + +| **Queries Executed** +| Average of `aws.rds.queries`. + +| **Active Transactions** +| Average of `aws.rds.transactions.active`. + +| **Latency** +| Average of `aws.rds.latency.dml`. +|=== + +For information about the fields used by the Infrastructure UI to display AWS services metrics, see the +<<infrastructure-monitoring-required-fields>>. diff --git a/docs/en/serverless/infra-monitoring/configure-infra-settings.asciidoc b/docs/en/serverless/infra-monitoring/configure-infra-settings.asciidoc new file mode 100644 index 0000000000..e1676472d9 --- /dev/null +++ b/docs/en/serverless/infra-monitoring/configure-infra-settings.asciidoc @@ -0,0 +1,38 @@ +[[configure-intra-settings]] += Configure settings + +:description: Learn how to configure infrastructure UI settings. +:keywords: serverless, observability, how to + +preview:[] + +:role: Editor +:goal: configure settings +include::../partials/roles.asciidoc[] +:role!: + +:goal!: + +From the main {observability} menu, go to **Infrastructure** → **Inventory** or **Hosts**, +and click the **Settings** link at the top of the page. +The following settings are available: + +|=== +| Setting | Description + +| **Name** +| Name of the source configuration. + +| **Indices** +| {ipm-cap} or patterns used to match {es} indices that contain metrics. The default patterns are `metrics-*,metricbeat-*`. + +| **Machine Learning** +| The minimum severity score required to display anomalies in the Infrastructure UI. The default is 50. + +| **Features** +| Turn new features on and off. +|=== + +Click **Apply** to save your changes. + +If the fields are grayed out and cannot be edited, you may not have sufficient privileges to change the source configuration. diff --git a/docs/en/serverless/infra-monitoring/container-metrics.asciidoc b/docs/en/serverless/infra-monitoring/container-metrics.asciidoc new file mode 100644 index 0000000000..27f8a38d53 --- /dev/null +++ b/docs/en/serverless/infra-monitoring/container-metrics.asciidoc @@ -0,0 +1,112 @@ +[[container-metrics]] += Container metrics + +:description: Learn about key container metrics used for container monitoring. +:keywords: serverless, observability, reference + +preview:[] + +Learn about key container metrics displayed in the Infrastructure UI: + +* <<key-metrics-docker,Docker>> +* <<key-metrics-kubernetes,Kubernetes>> + +[discrete] +[[key-metrics-docker]] +== Docker container metrics + +These are the key metrics displayed for Docker containers. + +[discrete] +[[key-metrics-docker-cpu]] +=== CPU usage metrics + +|=== +| Metric | Description + +| **CPU Usage (%)** +a| Average CPU for the container. + +**Field Calculation:** `average(docker.cpu.total.pct)` +|=== + +[discrete] +[[key-metrics-docker-memory]] +=== Memory metrics + +|=== +| Metric | Description + +| **Memory Usage (%)** +a| Average memory usage for the container. + +**Field Calculation:** `average(docker.memory.usage.pct)` +|=== + +[discrete] +[[key-metrics-docker-network]] +=== Network metrics + +|=== +| Metric | Description + +| **Inbound Traffic (RX)** +a| Derivative of the maximum of `docker.network.in.bytes` scaled to a 1 second rate. + +**Field Calculation:** `average(docker.network.inbound.bytes) * 8 / (max(metricset.period, kql='docker.network.inbound.bytes: *') / 1000)` + +| **Outbound Traffic (TX)** +a| Derivative of the maximum of `docker.network.out.bytes` scaled to a 1 second rate. + +**Field Calculation:** `average(docker.network.outbound.bytes) * 8 / (max(metricset.period, kql='docker.network.outbound.bytes: *') / 1000)` +|=== + +[discrete] +[[container-metrics-disk-metrics]] +=== Disk metrics + +|=== +| Metric | Description + +| **Disk Read IOPS** +a| Average count of read operations from the device per second. + +**Field Calculation:** `counter_rate(max(docker.diskio.read.ops), kql='docker.diskio.read.ops: *')` + +| **Disk Write IOPS** +a| Average count of write operations from the device per second. + +**Field Calculation:** `counter_rate(max(docker.diskio.write.ops), kql='docker.diskio.write.ops: *')` +|=== + +[discrete] +[[key-metrics-kubernetes]] +== Kubernetes container metrics + +These are the key metrics displayed for Kubernetes (containerd) containers. + +[discrete] +[[key-metrics-kubernetes-cpu]] +=== CPU usage metrics + +|=== +| Metric | Description + +| **CPU Usage (%)** +a| Average CPU for the container. + +**Field Calculation:** `average(kubernetes.container.cpu.usage.limit.pct)` +|=== + +[discrete] +[[key-metrics-kubernetes-memory]] +=== Memory metrics + +|=== +| Metric | Description + +| **Memory Usage (%)** +a| Average memory usage for the container. + +**Field Calculation:** `average(kubernetes.container.memory.usage.limit.pct)` +|=== diff --git a/docs/en/serverless/infra-monitoring/detect-metric-anomalies.asciidoc b/docs/en/serverless/infra-monitoring/detect-metric-anomalies.asciidoc new file mode 100644 index 0000000000..cc39434aa9 --- /dev/null +++ b/docs/en/serverless/infra-monitoring/detect-metric-anomalies.asciidoc @@ -0,0 +1,79 @@ +[[detect-metric-anomalies]] += Detect metric anomalies + +:description: Detect and inspect memory usage and network traffic anomalies for hosts and Kubernetes pods. +:keywords: serverless, observability, how to + +preview:[] + +:role: Editor +:goal: create {ml} jobs +include::../partials/roles.asciidoc[] +:role!: + +:goal!: + +You can create {ml} jobs to detect and inspect memory usage and network traffic anomalies for hosts and Kubernetes pods. + +You can model system memory usage, along with inbound and outbound network traffic across hosts or pods. +You can detect unusual increases in memory usage and unusually high inbound or outbound traffic across hosts or pods. + +[discrete] +[[ml-jobs-hosts]] +== Enable {ml} jobs for hosts or Kubernetes pods + +Create a {ml} job to detect anomalous memory usage and network traffic automatically. + +After creating {ml} jobs, you cannot change the settings. +You can recreate these jobs later. +However, you will remove any previously detected anomalies. + +// lint ignore anomaly-detection observability + +. In your {observability} project, go to **Infrastructure** → **Inventory** +and click the **Anomaly detection** link at the top of the page. +. Under **Hosts** or **Kubernetes Pods**, click **Enable** to create a {ml} job. +. Choose a start date for the {ml} analysis. {ml-cap} jobs analyze the last four weeks of data and continue to run indefinitely. +. Select a partition field. +Partitions allow you to create independent models for different groups of data that share similar behavior. +For example, you may want to build separate models for machine type or cloud availability zone so that anomalies are not weighted equally across groups. +. By default, {ml} jobs analyze all of your metric data. +You can filter this list to view only the jobs or metrics that you are interested in. +For example, you can filter by job name and node name to view specific {anomaly-detect} jobs for that host. +. Click **Enable jobs**. +. You're now ready to explore your metric anomalies. Click **Anomalies**. + +[role="screenshot"] +image::images/metrics-ml-jobs.png[Infrastructure {ml-app} anomalies] + +The **Anomalies** table displays a list of each single metric {anomaly-detect} job for the specific host or Kubernetes pod. +By default, anomaly jobs are sorted by time to show the most recent job. + +Along with each anomaly job and the node name, +detected anomalies with a severity score equal to 50 or higher are listed. +These scores represent a severity of "warning" or higher in the selected time period. +The **summary** value represents the increase between the actual value and the expected ("typical") value of the metric in the anomaly record result. + +To drill down and analyze the metric anomaly, +select **Actions → Open in Anomaly Explorer** to view the Anomaly Explorer. +You can also select **Actions** → **Show in Inventory** to view the host or Kubernetes pods Inventory page, +filtered by the specific metric. + +[NOTE] +==== +These predefined {anomaly-jobs} use {ml-docs}/ml-rules.html[custom rules]. +To update the rules in the Anomaly Explorer, select **Actions** → **Configure rules**. +The changes only take effect for new results. +If you want to apply the changes to existing results, clone and rerun the job. +==== + +[discrete] +[[history-chart]] +== History chart + +On the **Inventory** page, click **Show history** to view the metric values within the selected time frame. +Detected anomalies with an anomaly score equal to 50 or higher are highlighted in red. +To examine the detected anomalies, use the Anomaly Explorer. + +[role="screenshot"] +image::images/metrics-history-chart.png[History] diff --git a/docs/en/serverless/infra-monitoring/get-started-with-metrics.asciidoc b/docs/en/serverless/infra-monitoring/get-started-with-metrics.asciidoc new file mode 100644 index 0000000000..97b88592db --- /dev/null +++ b/docs/en/serverless/infra-monitoring/get-started-with-metrics.asciidoc @@ -0,0 +1,63 @@ +[[get-started-with-metrics]] += Get started with system metrics + +:description: Learn how to onboard your system metrics data quickly. +:keywords: serverless, observability, how-to + +preview:[] + +:role: Admin +:goal: onboard system metrics data +include::../partials/roles.asciidoc[] +:role!: + +:goal!: + +In this guide you'll learn how to onboard system metrics data from a machine or server, +then observe the data in Elastic {observability}. + +To onboard system metrics data: + +. <<create-an-observability-project,Create a new {observability} project>>, or open an existing one. +. In your {observability} project, go to **Project Settings** → **Integrations**. +. Type **System** in the search bar, then select the integration to see more details about it. +. Click **Add System**. +. Follow the in-product steps to install the System integration and deploy an {agent}. +The sequence of steps varies depending on whether you have already installed an integration. ++ +** When configuring the System integration, make sure that **Collect metrics from System instances** is turned on. +** Expand each configuration section to verify that the settings are correct for your host. +For example, you may want to turn on **System core metrics** to get a complete view of your infrastructure. + +Notice that you can also configure the integration to collect logs. + +.What if {agent} is already running on my host? +[NOTE] +==== +Do not try to deploy a second {agent} to the same system. +You have a couple options: + +* **Use the System integration to collect system logs and metrics.** To do this, +uninstall the standalone agent you deployed previously, +then follow the in-product steps to install the System integration and deploy an {agent}. +* **Configure your existing standalone agent to collect metrics.** To do this, +edit the deployed {agent}'s YAML file and add metric inputs to the configuration manually. +Manual configuration is a time-consuming process. +To save time, you can follow the in-product steps that describe how to deploy a standalone {agent}, +and use the generated configuration as source for the input configurations that you need to add to your standalone config file. +==== + +After the agent is installed and successfully streaming metrics data, +go to **Infrastructure** → **Inventory** or **Hosts** to see a metrics-driven view of your infrastructure. +To learn more, refer to <<view-infrastructure-metrics>> or <<analyze-hosts>>. + +[discrete] +[[get-started-with-metrics-next-steps]] +== Next steps + +Now that you've added metrics and explored your data, +learn how to onboard other types of data: + +* <<get-started-with-logs>> +* <<stream-log-files>> +* <<apm-get-started>> diff --git a/docs/en/serverless/infra-monitoring/handle-no-results-found-message.asciidoc b/docs/en/serverless/infra-monitoring/handle-no-results-found-message.asciidoc new file mode 100644 index 0000000000..79a553a07e --- /dev/null +++ b/docs/en/serverless/infra-monitoring/handle-no-results-found-message.asciidoc @@ -0,0 +1,48 @@ +[[handle-no-results-found-message]] += Understanding "no results found" message + +:description: Learn about the reasons for "no results found" messages and how to fix them. +:keywords: serverless, observability, how to + +preview:[] + +To correctly render visualizations in the {observability} UI, +all metrics used by the UI must be present in the collected data. +For a description of these metrics, +refer to <<metrics-reference>>. + +There are several reasons why metrics might be missing from the collected data: + +**The visualization requires a metric that's not relevant to your monitored hosts** + +For example, if you're only observing Windows hosts, the 'load' metric is not collected because 'load' is not a Windows concept. +In this situation, you can ignore the "no results found" message. + +**You may not be collecting all the required metrics** + +This could be for any of these reasons: + +* The integration that collects the missing metrics is not installed. +For example, to collect metrics from your host system, you can use the {integrations-docs}/system[System integration]. +To fix the problem, install the integration and configure it to send the missing metrics. ++ +[TIP] +==== +Follow one of our quickstarts under **Observability** → **Add data** → **Collect and analyze logs** to make sure the correct integrations are installed and all required metrics are collected. +==== +* You are not using the Elastic Distribution of the OpenTelemetry Collector, which automatically maps data to the Elastic Common Schema (ECS) fields expected by the visualization. ++ +[TIP] +==== +Follow our OpenTelemetry quickstart under **Observability** → **Add data** → **Monitor infrastructure** to make sure OpenTelemetry data is correctly mapped to ECS-compliant fields. +==== + +// TODO: Make quickstart an active link after the docs are merged. + +* You have explicitly chosen not to send these metrics. +You may choose to limit the metrics sent to Elastic to save on space and improve cluster performance. +For example, the System integration has options to choose which metrics you want to send. +You can {fleet-guide}/edit-or-delete-integration-policy.html[edit the integration policy] to begin collecting the missing metrics. For example: ++ +[role="screenshot"] +image::images/turn-on-system-metrics.png[Screenshot showing system cpu and diskio metrics selected for collection] diff --git a/docs/en/serverless/infra-monitoring/host-metrics.asciidoc b/docs/en/serverless/infra-monitoring/host-metrics.asciidoc new file mode 100644 index 0000000000..a75b09c81c --- /dev/null +++ b/docs/en/serverless/infra-monitoring/host-metrics.asciidoc @@ -0,0 +1,263 @@ +[[host-metrics]] += Host metrics + +:description: Learn about key host metrics used for host monitoring. +:keywords: serverless, observability, reference + +preview:[] + +Learn about key host metrics displayed in the Infrastructure UI: + +* <<key-metrics-hosts,Hosts>> +* <<key-metrics-cpu,CPU usage>> +* <<key-metrics-memory,Memory>> +* <<key-metrics-log,Log>> +* <<key-metrics-network,Network>> +* <<key-metrics-network,Disk>> +* <<legacy-metrics,Legacy>> + +[discrete] +[[key-metrics-hosts]] +== Hosts metrics + +|=== +| Metric | Description + +| **Hosts** +a| Number of hosts returned by your search criteria. + +**Field Calculation**: `count(system.cpu.cores)` +|=== + +[discrete] +[[key-metrics-cpu]] +== CPU usage metrics + +|=== +| Metric | Description + +| **CPU Usage (%)** +a| Average of percentage of CPU time spent in states other than Idle and IOWait, normalized by the number of CPU cores. Includes both time spent on user space and kernel space. 100% means all CPUs of the host are busy. + +**Field Calculation**: `average(system.cpu.total.norm.pct)` + +For legacy metric calculations, refer to <<legacy-metrics,Legacy metrics>>. + +| **CPU Usage - iowait (%)** +a| The percentage of CPU time spent in wait (on disk). + +**Field Calculation**: `average(system.cpu.iowait.pct) / max(system.cpu.cores)` + +| **CPU Usage - irq (%)** +a| The percentage of CPU time spent servicing and handling hardware interrupts. + +**Field Calculation**: `average(system.cpu.irq.pct) / max(system.cpu.cores)` + +| **CPU Usage - nice (%)** +a| The percentage of CPU time spent on low-priority processes. + +**Field Calculation**: `average(system.cpu.nice.pct) / max(system.cpu.cores)` + +| **CPU Usage - softirq (%)** +a| The percentage of CPU time spent servicing and handling software interrupts. + +**Field Calculation**: `average(system.cpu.softirq.pct) / max(system.cpu.cores)` + +| **CPU Usage - steal (%)** +a| The percentage of CPU time spent in involuntary wait by the virtual CPU while the hypervisor was servicing another processor. Available only on Unix. + +**Field Calculation**: `average(system.cpu.steal.pct) / max(system.cpu.cores)` + +| **CPU Usage - system (%)** +a| The percentage of CPU time spent in kernel space. + +**Field Calculation**: `average(system.cpu.system.pct) / max(system.cpu.cores)` + +| **CPU Usage - user (%)** +a| The percentage of CPU time spent in user space. On multi-core systems, you can have percentages that are greater than 100%. For example, if 3 cores are at 60% use, then the system.cpu.user.pct will be 180%. + +**Field Calculation**: `average(system.cpu.user.pct) / max(system.cpu.cores)` + +| **Load (1m)** +a| 1 minute load average. + +Load average gives an indication of the number of threads that are runnable (either busy running on CPU, waiting to run, or waiting for a blocking IO operation to complete). + +**Field Calculation**: `average(system.load.1)` + +| **Load (5m)** +a| 5 minute load average. + +Load average gives an indication of the number of threads that are runnable (either busy running on CPU, waiting to run, or waiting for a blocking IO operation to complete). + +**Field Calculation**: `average(system.load.5)` + +| **Load (15m)** +a| 15 minute load average. + +Load average gives an indication of the number of threads that are runnable (either busy running on CPU, waiting to run, or waiting for a blocking IO operation to complete). + +**Field Calculation**: `average(system.load.15)` + +| **Normalized Load** +a| 1 minute load average normalized by the number of CPU cores. + +Load average gives an indication of the number of threads that are runnable (either busy running on CPU, waiting to run, or waiting for a blocking IO operation to complete). + +100% means the 1 minute load average is equal to the number of CPU cores of the host. + +Taking the example of a 32 CPU cores host, if the 1 minute load average is 32, the value reported here is 100%. If the 1 minute load average is 48, the value reported here is 150%. + +**Field Calculation**: `average(system.load.1) / max(system.load.cores)` +|=== + +[discrete] +[[key-metrics-memory]] +== Memory metrics + +|=== +| Metric | Description + +| **Memory Cache** +a| Memory (page) cache. + +**Field Calculation**: `average(system.memory.used.bytes ) - average(system.memory.actual.used.bytes)` + +| **Memory Free** +a| Total available memory. + +**Field Calculation**: `max(system.memory.total) - average(system.memory.actual.used.bytes)` + +| **Memory Free (excluding cache)** +a| Total available memory excluding the page cache. + +**Field Calculation**: `system.memory.free` + +| **Memory Total** +a| Total memory capacity. + +**Field Calculation**: `avg(system.memory.total)` + +| **Memory Usage (%)** +a| Percentage of main memory usage excluding page cache. + +This includes resident memory for all processes plus memory used by the kernel structures and code apart from the page cache. + +A high level indicates a situation of memory saturation for the host. For example, 100% means the main memory is entirely filled with memory that can't be reclaimed, except by swapping out. + +**Field Calculation**: `average(system.memory.actual.used.pct)` + +| **Memory Used** +a| Main memory usage excluding page cache. + +**Field Calculation**: `average(system.memory.actual.used.bytes)` +|=== + +[discrete] +[[key-metrics-log]] +== Log metrics + +|=== +| Metric | Description + +| **Log Rate** +a| Derivative of the cumulative sum of the document count scaled to a 1 second rate. This metric relies on the same indices as the logs. + +**Field Calculation**: `cumulative_sum(doc_count)` +|=== + +[discrete] +[[key-metrics-network]] +== Network metrics + +|=== +| Metric | Description + +| **Network Inbound (RX)** +a| Number of bytes that have been received per second on the public interfaces of the hosts. + +**Field Calculation**: `sum(host.network.ingress.bytes) * 8 / 1000` + +For legacy metric calculations, refer to <<legacy-metrics,Legacy metrics>>. + +| **Network Outbound (TX)** +a| Number of bytes that have been sent per second on the public interfaces of the hosts. + +**Field Calculation**: `sum(host.network.egress.bytes) * 8 / 1000` + +For legacy metric calculations, refer to <<legacy-metrics,Legacy metrics>>. +|=== + +[discrete] +[[host-metrics-disk-metrics]] +== Disk metrics + +|=== +| Metric | Description + +| **Disk Latency** +a| Time spent to service disk requests. + +**Field Calculation**: `average(system.diskio.read.time + system.diskio.write.time) / (system.diskio.read.count + system.diskio.write.count)` + +| **Disk Read IOPS** +a| Average count of read operations from the device per second. + +**Field Calculation**: `counter_rate(max(system.diskio.read.count), kql='system.diskio.read.count: *')` + +| **Disk Read Throughput** +a| Average number of bytes read from the device per second. + +**Field Calculation**: `counter_rate(max(system.diskio.read.bytes), kql='system.diskio.read.bytes: *')` + +| **Disk Usage - Available (%)** +a| Percentage of disk space available. + +**Field Calculation**: `1-average(system.filesystem.used.pct)` + +| **Disk Usage - Max (%)** +a| Percentage of disk space used. A high percentage indicates that a partition on a disk is running out of space. + +**Field Calculation**: `max(system.filesystem.used.pct)` + +| **Disk Write IOPS** +a| Average count of write operations from the device per second. + +**Field Calculation**: `counter_rate(max(system.diskio.write.count), kql='system.diskio.write.count: *')` + +| **Disk Write Throughput** +a| Average number of bytes written from the device per second. + +**Field Calculation**: `counter_rate(max(system.diskio.write.bytes), kql='system.diskio.write.bytes: *')` +|=== + +[discrete] +[[legacy-metrics]] +== Legacy metrics + +Over time, we may change the formula used to calculate a specific metric. +To avoid affecting your existing rules, instead of changing the actual metric definition, +we create a new metric and refer to the old one as "legacy." + +The UI and any new rules you create will use the new metric definition. +However, any alerts that use the old definition will refer to the metric as "legacy." + +|=== +| Metric | Description + +| **CPU Usage (legacy)** +a| Percentage of CPU time spent in states other than Idle and IOWait, normalized by the number of CPU cores. This includes both time spent on user space and kernel space. +100% means all CPUs of the host are busy. + +**Field Calculation**: `(average(system.cpu.user.pct) + average(system.cpu.system.pct)) / max(system.cpu.cores)` + +| **Network Inbound (RX) (legacy)** +a| Number of bytes that have been received per second on the public interfaces of the hosts. + +**Field Calculation**: `average(host.network.ingress.bytes) * 8 / (max(metricset.period, kql='host.network.ingress.bytes: *') / 1000)` + +| **Network Outbound (TX) (legacy)** +a| Number of bytes that have been sent per second on the public interfaces of the hosts. + +**Field Calculation**: `average(host.network.egress.bytes) * 8 / (max(metricset.period, kql='host.network.egress.bytes: *') / 1000)` +|=== diff --git a/docs/en/serverless/infra-monitoring/infra-monitoring.asciidoc b/docs/en/serverless/infra-monitoring/infra-monitoring.asciidoc new file mode 100644 index 0000000000..880d15951d --- /dev/null +++ b/docs/en/serverless/infra-monitoring/infra-monitoring.asciidoc @@ -0,0 +1,32 @@ +[[infrastructure-monitoring]] += Infrastructure monitoring + +:description: Monitor metrics from your servers, Docker, Kubernetes, Prometheus, and other services and applications. +:keywords: serverless, observability, overview + +preview:[] + +Elastic {observability} allows you to visualize infrastructure metrics to help diagnose problematic spikes, +identify high resource utilization, automatically discover and track pods, +and unify your metrics with logs and APM data. + +Using {agent} integrations, you can ingest and analyze metrics from servers, +Docker containers, Kubernetes orchestrations, explore and analyze application +telemetry, and more. + +For more information, refer to the following links: + +* <<get-started-with-metrics>>: +Learn how to onboard your system metrics data quickly. +* <<view-infrastructure-metrics>>: +Use the **Inventory page** to get a metrics-driven view of your infrastructure grouped by resource type. +* <<analyze-hosts>>: +Use the **Hosts** page to get a metrics-driven view of your infrastructure backed by an easy-to-use interface called Lens. +* <<detect-metric-anomalies>>: Detect and inspect memory usage and network traffic anomalies for hosts and Kubernetes pods. +* <<configure-intra-settings>>: Learn how to configure infrastructure UI settings. +* <<metrics-reference>>: Learn about key metrics used for infrastructure monitoring. +* <<infrastructure-monitoring-required-fields>>: Learn about the fields required to display data in the Infrastructure UI. + +By default, the Infrastructure UI displays metrics from {es} indices that +match the `metrics-*` and `metricbeat-*` index patterns. To learn how to change +this behavior, refer to <<configure-intra-settings,Configure settings>>. diff --git a/docs/en/serverless/infra-monitoring/kubernetes-pod-metrics.asciidoc b/docs/en/serverless/infra-monitoring/kubernetes-pod-metrics.asciidoc new file mode 100644 index 0000000000..aa4034ecad --- /dev/null +++ b/docs/en/serverless/infra-monitoring/kubernetes-pod-metrics.asciidoc @@ -0,0 +1,30 @@ +[[kubernetes-pod-metrics]] += Kubernetes pod metrics + +:description: Learn about key metrics used for Kubernetes monitoring. +:keywords: serverless, observability, reference + +preview:[] + +To analyze Kubernetes pod metrics, +you can select view filters based on the following predefined metrics, +or you can add <<custom-metrics,custom metrics>>. + +|=== +| | + +| **CPU Usage** +| Average of `kubernetes.pod.cpu.usage.node.pct`. + +| **Memory Usage** +| Average of `kubernetes.pod.memory.usage.node.pct`. + +| **Inbound Traffic** +| Derivative of the maximum of `kubernetes.pod.network.rx.bytes` scaled to a 1 second rate. + +| **Outbound Traffic** +| Derivative of the maximum of `kubernetes.pod.network.tx.bytes` scaled to a 1 second rate. +|=== + +For information about the fields used by the Infrastructure UI to display Kubernetes pod metrics, see the +<<infrastructure-monitoring-required-fields>>. diff --git a/docs/en/serverless/infra-monitoring/metrics-app-fields.asciidoc b/docs/en/serverless/infra-monitoring/metrics-app-fields.asciidoc new file mode 100644 index 0000000000..9a1cce3fca --- /dev/null +++ b/docs/en/serverless/infra-monitoring/metrics-app-fields.asciidoc @@ -0,0 +1,297 @@ +[[infrastructure-monitoring-required-fields]] += Required fields + +:description: Learn about the fields required to display data in the Infrastructure UI. +:keywords: serverless, observability, reference + +preview:[] + +This section lists the fields the Infrastructure UI uses to display data. +Please note that some of the fields listed here are not {ecs-ref}/ecs-reference.html#_what_is_ecs[ECS fields]. + +[discrete] +[[infrastructure-monitoring-required-fields-additional-field-details]] +== Additional field details + +The `event.dataset` field is required to display data properly in some views. This field +is a combination of `metricset.module`, which is the {metricbeat} module name, and `metricset.name`, +which is the metricset name. + +To determine each metric's optimal time interval, all charts use `metricset.period`. +If `metricset.period` is not available, then it falls back to 1 minute intervals. + +[discrete] +[[base-fields]] +== Base fields + +The `base` field set contains all fields which are on the top level. These fields are common across all types of events. + +|=== +| Field | Description | Type + +| `@timestamp` +a| Date/time when the event originated. + +This is the date/time extracted from the event, typically representing when the source generated the event. +If the event source has no original timestamp, this value is typically populated by the first time the pipeline received the event. +Required field for all events. + +Example: `May 27, 2020 @ 15:22:27.982` +| date + +| `message` +a| For log events the message field contains the log message, optimized for viewing in a log viewer. + +For structured logs without an original message field, other fields can be concatenated to form a human-readable summary of the event. + +If multiple messages exist, they can be combined into one message. + +Example: `Hello World` +| text +|=== + +[discrete] +[[host-fields]] +== Hosts fields + +These fields must be mapped to display host data in the {infrastructure-app}. + +|=== +| Field | Description | Type + +| `host.name` +a| Name of the host. + +It can contain what `hostname` returns on Unix systems, the fully qualified domain name, or a name specified by the user. The sender decides which value to use. + +Example: `MacBook-Elastic.local` +| keyword + +| `host.ip` +| IP of the host that records the event. +| ip +|=== + +[discrete] +[[docker-fields]] +== Docker container fields + +These fields must be mapped to display Docker container data in the {infrastructure-app}. + +|=== +| Field | Description | Type + +| `container.id` +a| Unique container id. + +Example: `data` +| keyword + +| `container.name` +| Container name. +| keyword + +| `container.ip_address` +a| IP of the container. + +_Not an ECS field_ +| ip +|=== + +[discrete] +[[kubernetes-fields]] +== Kubernetes pod fields + +These fields must be mapped to display Kubernetes pod data in the {infrastructure-app}. + +|=== +| Field | Description | Type + +| `kubernetes.pod.uid` +a| Kubernetes Pod UID. + +Example: `8454328b-673d-11ea-7d80-21010a840123` + +_Not an ECS field_ +| keyword + +| `kubernetes.pod.name` +a| Kubernetes pod name. + +Example: `nginx-demo` + +_Not an ECS field_ +| keyword + +| `kubernetes.pod.ip` +a| IP of the Kubernetes pod. + +_Not an ECS field_ +| keyword +|=== + +[discrete] +[[aws-ec2-fields]] +== AWS EC2 instance fields + +These fields must be mapped to display EC2 instance data in the {infrastructure-app}. + +|=== +| Field | Description | Type + +| `cloud.instance.id` +a| Instance ID of the host machine. + +Example: `i-1234567890abcdef0` +| keyword + +| `cloud.instance.name` +| Instance name of the host machine. +| keyword + +| `aws.ec2.instance.public.ip` +a| Instance public IP of the host machine. + +_Not an ECS field_ +| keyword +|=== + +[discrete] +[[aws-s3-fields]] +== AWS S3 bucket fields + +These fields must be mapped to display S3 bucket data in the {infrastructure-app}. + +|=== +| Field | Description | Type + +| `aws.s3.bucket.name` +a| The name or ID of the AWS S3 bucket. + +_Not an ECS field_ +| keyword +|=== + +[discrete] +[[aws-sqs-fields]] +== AWS SQS queue fields + +These fields must be mapped to display SQS queue data in the {infrastructure-app}. + +|=== +| Field | Description | Type + +| `aws.sqs.queue.name` +a| The name or ID of the AWS SQS queue. + +_Not an ECS field_ +| keyword +|=== + +[discrete] +[[aws-rds-fields]] +== AWS RDS database fields + +These fields must be mapped to display RDS database data in the {infrastructure-app}. + +|=== +| Field | Description | Type + +| `aws.rds.db_instance.arn` +a| Amazon Resource Name (ARN) for each RDS. + +_Not an ECS field_ +| keyword + +| `aws.rds.db_instance.identifier` +a| Contains a user-supplied database identifier. This identifier is the unique key that identifies a DB instance. + +_Not an ECS field_ +| keyword +|=== + +[discrete] +[[group-inventory-fields]] +== Additional grouping fields + +Depending on which entity you select in the **Inventory** view, these additional fields can be mapped to group entities by. + +|=== +| Field | Description | Type + +| `cloud.availability_zone` +a| Availability zone in which this host is running. + +Example: `us-east-1c` +| keyword + +| `cloud.machine.type` +a| Machine type of the host machine. + +Example: `t2.medium` +| keyword + +| `cloud.region` +a| Region in which this host is running. + +Example: `us-east-1` +| keyword + +| `cloud.instance.id` +a| Instance ID of the host machine. + +Example: `i-1234567890abcdef0` +| keyword + +| `cloud.provider` +a| Name of the cloud provider. Example values are `aws`, `azure`, `gcp`, or `digitalocean`. + +Example: `aws` +| keyword + +| `cloud.instance.name` +| Instance name of the host machine. +| keyword + +| `cloud.project.id` +a| Name of the project in Google Cloud. + +_Not an ECS field_ +| keyword + +| `service.type` +a| The type of service data is collected from. + +The type can be used to group and correlate logs and metrics from one service type. + +For example, the service type for metrics collected from {es} is `elasticsearch`. + +Example: `elasticsearch` + +_Not an ECS field_ +| keyword + +| `host.hostname` +a| Name of the host. This field is required if you want to use {ml-features} + +It normally contains what the `hostname` command returns on the host machine. + +Example: `Elastic.local` +| keyword + +| `host.os.name` +a| Operating system name, without the version. + +Multi-fields: + +os.name.text (type: text) + +Example: `Mac OS X` +| keyword + +| `host.os.kernel` +a| Operating system kernel version as a raw string. + +Example: `4.4.0-112-generic` +| keyword +|=== diff --git a/docs/en/serverless/infra-monitoring/metrics-reference.asciidoc b/docs/en/serverless/infra-monitoring/metrics-reference.asciidoc new file mode 100644 index 0000000000..bd35f532f9 --- /dev/null +++ b/docs/en/serverless/infra-monitoring/metrics-reference.asciidoc @@ -0,0 +1,15 @@ +[[metrics-reference]] += Metrics reference + +:description: Learn about key metrics used for infrastructure monitoring. +:keywords: serverless, observability, reference + +preview:[] + +Learn about the key metrics displayed in the Infrastructure UI and how they +are calculated. + +* <<host-metrics,Host metrics>> +* <<kubernetes-pod-metrics,Kubernetes pod metrics>> +* <<container-metrics,Container metrics>> +* <<aws-metrics,AWS metrics>> diff --git a/docs/en/serverless/infra-monitoring/troubleshooting-infra.asciidoc b/docs/en/serverless/infra-monitoring/troubleshooting-infra.asciidoc new file mode 100644 index 0000000000..a278c44b49 --- /dev/null +++ b/docs/en/serverless/infra-monitoring/troubleshooting-infra.asciidoc @@ -0,0 +1,26 @@ +[[troubleshooting-infrastructure-monitoring]] += Troubleshooting + +:description: Learn how to troubleshoot issues with infrastructure monitoring. +:keywords: serverless, observability, how to + +preview:[] + +Learn how to troubleshoot common issues on your own or ask for help. + +* <<handle-no-results-found-message>> + +[discrete] +[[troubleshooting-infrastructure-monitoring-elastic-support]] +== Elastic Support + +We offer a support experience unlike any other. +Our team of professionals 'speak human and code' and love making your day. +https://www.elastic.co/subscriptions[Learn more about subscriptions]. + +[discrete] +[[troubleshooting-infrastructure-monitoring-discussion-forum]] +== Discussion forum + +For other questions and feature requests, +visit our https://discuss.elastic.co/c/observability[discussion forum]. diff --git a/docs/en/serverless/infra-monitoring/view-infrastructure-metrics.asciidoc b/docs/en/serverless/infra-monitoring/view-infrastructure-metrics.asciidoc new file mode 100644 index 0000000000..84e9f4e47e --- /dev/null +++ b/docs/en/serverless/infra-monitoring/view-infrastructure-metrics.asciidoc @@ -0,0 +1,150 @@ +[[view-infrastructure-metrics]] += View infrastructure metrics by resource type + +:description: Get a metrics-driven view of your infrastructure grouped by resource type. +:keywords: serverless, observability, how to + +preview:[] + +The **Inventory** page provides a metrics-driven view of your entire infrastructure grouped by +the resources you are monitoring. All monitored resources emitting +a core set of infrastructure metrics are displayed to give you a quick view of the overall health +of your infrastructure. + +To access the **Inventory** page, in your {observability} project, +go to **Infrastructure** → **Inventory**. + +[role="screenshot"] +image::images/metrics-app.png[Infrastructure UI in {kib}] + +To learn more about the metrics shown on this page, refer to the <<metrics-reference>>. + +.Don't see any metrics? +[NOTE] +==== +If you haven't added data yet, click **Add data** to search for and install an Elastic integration. + +Need help getting started? Follow the steps in +<<get-started-with-metrics,Get started with system metrics>>. +==== + +[discrete] +[[filter-resources]] +== Filter the Inventory view + +To get started with your analysis, select the type of resources you want to show +in the high-level view. From the **Show** menu, select one of the following: + +* **Hosts** — the default +* **Kubernetes Pods** +* **Docker Containers** — shows _all_ containers, not just Docker +* **AWS** — includes EC2 instances, S3 buckets, RDS databases, and SQS queues + +When you hover over each resource in the waffle map, the metrics specific to +that resource are displayed. + +You can sort by resource, group the resource by specific fields related to it, and sort by +either name or metric value. For example, you can filter the view to display the memory usage +of your Kubernetes pods, grouped by namespace, and sorted by the memory usage value. + +[role="screenshot"] +image::images/kubernetes-filter.png[Kubernetes pod filtering] + +You can also use the search bar to create structured queries using {kibana-ref}/kuery-query.html[{kib} Query Language]. +For example, enter `host.hostname : "host1"` to view only the information for `host1`. + +To examine the metrics for a specific time, use the time filter to select the date and time. + +[discrete] +[[analyze-hosts-inventory]] +== View host metrics + +By default the **Inventory** page displays a waffle map that shows the hosts you +are monitoring and the current CPU usage for each host. +Alternatively, you can click the **Table view** icon image:images/table-view-icon.png[Table view icon] +to switch to a table view. + +Without leaving the **Inventory** page, you can view enhanced metrics relating to each host +running in your infrastructure. On the waffle map, select a host to display the host details +overlay. + +[TIP] +==== +To expand the overlay and view more detail, click **Open as page** in the upper-right corner. +==== + +The host details overlay contains the following tabs: + +include::../transclusion/host-details.asciidoc[] + +[NOTE] +==== +These metrics are also available when viewing hosts on the **Hosts** +page. +==== + +[discrete] +[[analyze-containers-inventory]] +== View container metrics + +When you select **Docker containers**, the **Inventory** page displays a waffle map that shows the containers you +are monitoring and the current CPU usage for each container. +Alternatively, you can click the **Table view** icon image:images/table-view-icon.png[Table view icon] +to switch to a table view. + +Without leaving the **Inventory** page, you can view enhanced metrics relating to each container +running in your infrastructure. + +.Why do some containers report 0% or null (-) values in the waffle map? +[NOTE] +==== +The waffle map shows _all_ monitored containers, including containerd, +provided that the data collected from the container has the `container.id` field. +However, the waffle map currently only displays metrics for Docker fields. +This display problem will be resolved in a future release. +==== + +On the waffle map, select a container to display the container details +overlay. + +[TIP] +==== +To expand the overlay and view more detail, click **Open as page** in the upper-right corner. +==== + +The container details overlay contains the following tabs: + +include::../transclusion/container-details.asciidoc[] + +[discrete] +[[analyze-resource-metrics]] +== View metrics for other resources + +When you have searched and filtered for a specific resource, you can drill down to analyze the +metrics relating to it. For example, when viewing Kubernetes Pods in the high-level view, +click the Pod you want to analyze and select **Kubernetes Pod metrics** to see detailed metrics: + +[role="screenshot"] +image::images/pod-metrics.png[Kubernetes pod metrics] + +[discrete] +[[custom-metrics]] +== Add custom metrics + +If the predefined metrics displayed on the Inventory page for each resource are not +sufficient for your specific use case, you can add and define custom metrics. + +Select your resource, and from the **Metric** filter menu, click **Add metric**. + +[role="screenshot"] +image::images/add-custom-metric.png[Add custom metrics] + +[discrete] +[[apm-uptime-integration]] +== Integrate with Logs and APM + +Depending on the features you have installed and configured, you can view logs or traces relating to a specific resource. +For example, in the high-level view, when you click a Kubernetes Pod resource, you can choose: + +* **Kubernetes Pod logs** to <<log-monitoring,view corresponding logs>> in the {logs-app}. +* **Kubernetes Pod APM traces** to <<apm,view corresponding APM traces>> in the {apm-app}. diff --git a/docs/en/serverless/inventory.asciidoc b/docs/en/serverless/inventory.asciidoc new file mode 100644 index 0000000000..fc0098c1ee --- /dev/null +++ b/docs/en/serverless/inventory.asciidoc @@ -0,0 +1,99 @@ +[[inventory]] += Inventory + +:description: Learn about the new Inventory experience that enables you to monitor all your entities from one single place. +:keywords: serverless, observability, inventory + +preview:[] + +Inventory provides a single place to observe the status of your entire ecosystem of hosts, containers, and services at a glance, even just from logs. From there, you can monitor and understand the health of your entities, check what needs attention, and start your investigations. + +[NOTE] +==== +The new Inventory requires the Elastic Entity Model (EEM). To learn more, refer to <<elastic-entity-model>>. +==== + +[role="screenshot"] +image::images/inventory-catalog.png[Inventory catalog] + +Inventory is currently available for hosts, containers, and services, but it will scale to support all of your entities. + +The EEM currently supports the inventory experience (as identified by `host.name`, `service.name`, and `container.id`) located in data identified by the following index patterns: + +**Hosts** + +Where `host.name` is set in `metrics-*`, `logs-*`, `filebeat-*`, and `metricbeat-*` + +**Services** + +Where `service.name` is set in `filebeat*`, `logs-*`, `metrics-apm.service_transaction.1m*`, and `metrics-apm.service_summary.1m*` + +**Containers** + +Where `container.id` is set in `metrics-*`, `logs-*`, `filebeat-*`, and `metricbeat-*` + +Inventory allows you to: + +* Filter for your entities to provide a high-level view of what you have leveraging your own tags and labels +* Drill down into any host, container, or service to help you understand performance +* Debug resource bottlenecks with your service caused by their containers and the hosts they run on. +* Easily discover all entities related to the host, container or service you are viewing by leveraging your tags and labels + +[discrete] +[[inventory-explore-your-entities]] +== Explore your entities + +. In your {observability} project, go to **Inventory** to view all of your entities. ++ +When you open the Inventory for the first time, you'll be asked to enable the EEM. Once enabled, the Inventory will be accessible to anyone with the appropriate privileges. ++ +[NOTE] +==== +The Inventory feature can be completely disabled using the `observability:entityCentricExperience` flag in **Stack Management**. +==== +. In the search bar, search for your entities by name or type, for example `entity.type:service`. + +For each entity, you can click the entity name and get a detailed view. For example, for an entity of type `service`, you get the following details: + +* Overview +* Transactions +* Dependencies +* Errors +* Metrics +* Infrastructure +* Service Map +* Logs +* Alerts +* Dashboards + +[role="screenshot"] +image::images/entity-detailed-view.png[Entity detailed view] + +If you open an entity of type `host` or `container` that does not have infrastructure data, some of the visualizations will be blank and some features on the page will not be fully populated. + +[discrete] +[[inventory-add-entities-to-the-inventory]] +== Add entities to the Inventory + +Entities are added to the Inventory through one of the following approaches: **Add data** or **Associate existing service logs**. + +[discrete] +[[inventory-add-data]] +=== Add data + +To add entities, select **Add data** from the left-hand navigation and choose one of the following onboarding journeys: + +Auto-detect logs and metrics:: +Detects hosts (with metrics and logs) + +Kubernetes:: +Detects hosts, containers, and services + +Elastic APM / OpenTelemetry / Synthetic Monitor:: +Detects services + +[discrete] +[[inventory-associate-existing-service-logs]] +=== Associate existing service logs + +To learn how, refer to <<add-logs-service-name>>. diff --git a/docs/en/serverless/inventory.mdx b/docs/en/serverless/inventory.mdx index bdea5869b7..a4859a4a44 100644 --- a/docs/en/serverless/inventory.mdx +++ b/docs/en/serverless/inventory.mdx @@ -9,7 +9,7 @@ import Roles from './partials/roles.mdx' <p><DocBadge template="technical preview" /></p> -Inventory provides a single place to observe the status of your entire ecosystem of hosts, containers, and services at a glance, even just from logs. From there, you can monitor and understand the health of your entities, check what needs attention, and start your investigations. +Inventory provides a single place to observe the status of your entire ecosystem of hosts, containers, and services at a glance, even just from logs. From there, you can monitor and understand the health of your entities, check what needs attention, and start your investigations. <DocCallOut title="Note"> The new Inventory requires the Elastic Entity Model (EEM). To learn more, refer to <DocLink slug="/serverless/observability/elastic-entity-model" />. @@ -28,7 +28,7 @@ Where `host.name` is set in `metrics-*`, `logs-*`, `filebeat-*`, and `metricbeat **Services** Where `service.name` is set in `filebeat*`, `logs-*`, `metrics-apm.service_transaction.1m*`, and `metrics-apm.service_summary.1m*` - + **Containers** Where `container.id` is set in `metrics-*`, `logs-*`, `filebeat-*`, and `metricbeat-*` @@ -47,9 +47,9 @@ Inventory allows you to: When you open the Inventory for the first time, you'll be asked to enable the EEM. Once enabled, the Inventory will be accessible to anyone with the appropriate privileges. <DocCallOut title="Note"> - The Inventory feature can be completely disabled using the `observability:entityCentricExperience` flag in **Stack Management**. + The Inventory feature can be completely disabled using the `observability:entityCentricExperience` flag in **Stack Management**. </DocCallOut> - + 1. In the search bar, search for your entities by name or type, for example `entity.type:service`. @@ -77,21 +77,23 @@ Entities are added to the Inventory through one of the following approaches: **A ### Add data To add entities, select **Add data** from the left-hand navigation and choose one of the following onboarding journeys: -<DocDefTerm>- Auto-detect logs and metrics</DocDefTerm> +<DocDefList> +<DocDefTerm>Auto-detect logs and metrics</DocDefTerm> <DocDefDescription> - Detects hosts (with metrics and logs) + Detects hosts (with metrics and logs) </DocDefDescription> -<DocDefTerm>- Kubernetes</DocDefTerm> +<DocDefTerm>Kubernetes</DocDefTerm> <DocDefDescription> - Detects hosts, containers, and services + Detects hosts, containers, and services </DocDefDescription> -<DocDefTerm>- Elastic APM / OpenTelemetry / Synthetic Monitor</DocDefTerm> +<DocDefTerm>Elastic APM / OpenTelemetry / Synthetic Monitor</DocDefTerm> <DocDefDescription> - Detects services -</DocDefDescription> + Detects services +</DocDefDescription> +</DocDefList> ### Associate existing service logs diff --git a/docs/en/serverless/logging/add-logs-service-name.asciidoc b/docs/en/serverless/logging/add-logs-service-name.asciidoc new file mode 100644 index 0000000000..cefa5337a1 --- /dev/null +++ b/docs/en/serverless/logging/add-logs-service-name.asciidoc @@ -0,0 +1,64 @@ +[[add-logs-service-name]] += Add a service name to logs + +:description: Learn how to add a service name field to your logs. +:keywords: serverless, observability, overview + +Adding the `service.name` field to your logs associates them with the services that generate them. +You can use this field to view and manage logs for distributed services located on multiple hosts. + +To add a service name to your logs, either: + +* Use the `add_fields` processor through an integration, {agent} configuration, or {filebeat} configuration. +* Map an existing field from your data stream to the `service.name` field. + +[discrete] +[[add-logs-service-name-use-the-add-fields-processor-to-add-a-service-name]] +== Use the add fields processor to add a service name + +For log data without a service name, use the {fleet-guide}/add_fields-processor.html[`add_fields` processor] to add the `service.name` field. +You can add the processor in an integration's settings or in the {agent} or {filebeat} configuration. + +For example, adding the `add_fields` processor to the inputs section of a standalone {agent} or {filebeat} configuration would add `your_service_name` as the `service.name` field: + +[source,console] +---- +processors: + - add_fields: + target: service + fields: + name: your_service_name +---- + +Adding the `add_fields` processor to an integration's settings would add `your_service_name` as the `service.name` field: + +[role="screenshot"] +image::images/add-field-processor.png[Add the add_fields processor to an integration] + +For more on defining processors, refer to {fleet-guide}/elastic-agent-processor-configuration.html[define processors]. + +[discrete] +[[add-logs-service-name-map-an-existing-field-to-the-service-name-field]] +== Map an existing field to the service name field + +For logs that with an existing field being used to represent the service name, map that field to the `service.name` field using the {ref}/field-alias.html[alias field type]. +Follow these steps to update your mapping: + +. Go to **Management** → **Index Management** → **Index Templates**. +. Search for the index template you want to update. +. From the **Actions** menu for that template, select **edit**. +. Go to **Mappings**, and select **Add field**. +. Under **Field type**, select **Alias** and add `service.name` to the **Field name**. +. Under **Field path**, select the existing field you want to map to the service name. +. Select **Add field**. + +For more ways to add a field to your mapping, refer to {ref}/explicit-mapping.html#add-field-mapping.html[add a field to an existing mapping]. + +[discrete] +[[add-logs-service-name-additional-ways-to-process-data]] +== Additional ways to process data + +The {stack} provides additional ways to process your data: + +* **{ref}/ingest.html[Ingest pipelines]:** convert data to ECS, normalize field data, or enrich incoming data. +* **{logstash-ref}/introduction.html[Logstash]:** enrich your data using input, output, and filter plugins. diff --git a/docs/en/serverless/logging/correlate-application-logs.asciidoc b/docs/en/serverless/logging/correlate-application-logs.asciidoc new file mode 100644 index 0000000000..a18e855afe --- /dev/null +++ b/docs/en/serverless/logging/correlate-application-logs.asciidoc @@ -0,0 +1,104 @@ +[[correlate-application-logs]] += Stream application logs + +:description: Learn about application logs and options for ingesting them. +:keywords: serverless, observability, overview + +preview:[] + +Application logs provide valuable insight into events that have occurred within your services and applications. + +The format of your logs (structured or plaintext) influences your log ingestion strategy. + +[discrete] +[[correlate-application-logs-plaintext-logs-vs-structured-elastic-common-schema-ecs-logs]] +== Plaintext logs vs. structured Elastic Common Schema (ECS) logs + +Logs are typically produced as either plaintext or structured. +Plaintext logs contain only text and have no special formatting, for example: + +[source,log] +---- +2019-08-06T12:09:12.375Z INFO:spring-petclinic: Tomcat started on port(s): 8080 (http) with context path, org.springframework.boot.web.embedded.tomcat.TomcatWebServer +2019-08-06T12:09:12.379Z INFO:spring-petclinic: Started PetClinicApplication in 7.095 seconds (JVM running for 9.082), org.springframework.samples.petclinic.PetClinicApplication +2019-08-06T14:08:40.199Z DEBUG:spring-petclinic: init find form, org.springframework.samples.petclinic.owner.OwnerController +---- + +Structured logs follow a predefined, repeatable pattern or structure. +This structure is applied at write time — preventing the need for parsing at ingest time. +The Elastic Common Schema (ECS) defines a common set of fields to use when structuring logs. +This structure allows logs to be easily ingested, +and provides the ability to correlate, search, and aggregate on individual fields within your logs. + +For example, the previous example logs might look like this when structured with ECS-compatible JSON: + +[source,json] +---- +{"@timestamp":"2019-08-06T12:09:12.375Z", "log.level": "INFO", "message":"Tomcat started on port(s): 8080 (http) with context path ''", "service.name":"spring-petclinic","process.thread.name":"restartedMain","log.logger":"org.springframework.boot.web.embedded.tomcat.TomcatWebServer"} +{"@timestamp":"2019-08-06T12:09:12.379Z", "log.level": "INFO", "message":"Started PetClinicApplication in 7.095 seconds (JVM running for 9.082)", "service.name":"spring-petclinic","process.thread.name":"restartedMain","log.logger":"org.springframework.samples.petclinic.PetClinicApplication"} +{"@timestamp":"2019-08-06T14:08:40.199Z", "log.level":"DEBUG", "message":"init find form", "service.name":"spring-petclinic","process.thread.name":"http-nio-8080-exec-8","log.logger":"org.springframework.samples.petclinic.owner.OwnerController","transaction.id":"28b7fb8d5aba51f1","trace.id":"2869b25b5469590610fea49ac04af7da"} +---- + +[discrete] +[[correlate-application-logs-ingesting-logs]] +== Ingesting logs + +There are several ways to ingest application logs into your project. +Your specific situation helps determine the method that's right for you. + +[discrete] +[[correlate-application-logs-plaintext-logs]] +=== Plaintext logs + +With {filebeat} or {agent}, you can ingest plaintext logs, including existing logs, from any programming language or framework without modifying your application or its configuration. + +For plaintext logs to be useful, you need to use {filebeat} or {agent} to parse the log data. + +**image:images/icons/documentation.svg[documentation icon] Learn more in <<plaintext-application-logs,Plaintext logs>>** + +[discrete] +[[correlate-application-logs-ecs-formatted-logs]] +=== ECS formatted logs + +Logs formatted in ECS don't require manual parsing and the configuration can be reused across applications. They also include log correlation. You can format your logs in ECS by using ECS logging plugins or {apm-agent} ECS reformatting. + +[discrete] +[[correlate-application-logs-ecs-logging-plugins]] +==== ECS logging plugins + +Add ECS logging plugins to your logging libraries to format your logs into ECS-compatible JSON that doesn't require parsing. + +To use ECS logging, you need to modify your application and its log configuration. + +**image:images/icons/documentation.svg[documentation icon] Learn more in <<ecs-application-logs,ECS formatted logs>>** + +[discrete] +[[correlate-application-logs-apm-agent-log-reformatting]] +==== {apm-agent} log reformatting + +Some Elastic {apm-agent}s can automatically reformat application logs to ECS format +without adding an ECS logger dependency or modifying the application. + +This feature is supported for the following {apm-agent}s: + +* {apm-ruby-ref}/log-reformat.html[Ruby] +* {apm-py-ref}/logs.html#log-reformatting[Python] +* {apm-java-ref}/logs.html#log-reformatting[Java] + +**image:images/icons/documentation.svg[documentation icon] Learn more in <<ecs-application-logs,ECS formatted logs>>** + +[discrete] +[[correlate-application-logs-apm-agent-log-sending]] +=== {apm-agent} log sending + +Automatically capture and send logs directly to the managed intake service using the {apm-agent} without using {filebeat} or {agent}. + +Log sending is supported in the Java {apm-agent}. + +**image:images/icons/documentation.svg[documentation icon] Learn more in <<send-application-logs,{apm-agent} log sending>>** + +[discrete] +[[correlate-application-logs-log-correlation]] +== Log correlation + +include::../transclusion/observability/application-logs/correlate-logs.asciidoc[] diff --git a/docs/en/serverless/logging/ecs-application-logs.asciidoc b/docs/en/serverless/logging/ecs-application-logs.asciidoc new file mode 100644 index 0000000000..3bfcaf3a1c --- /dev/null +++ b/docs/en/serverless/logging/ecs-application-logs.asciidoc @@ -0,0 +1,213 @@ +[[ecs-application-logs]] += ECS formatted application logs + +:description: Use an ECS logger or an {apm-agent} to format your logs in ECS format. +:keywords: serverless, observability, how-to + +preview:[] + +Logs formatted in Elastic Common Schema (ECS) don't require manual parsing, and the configuration can be reused across applications. ECS-formatted logs, when paired with an {apm-agent}, allow you to correlate logs to easily view logs that belong to a particular trace. + +You can format your logs in ECS format the following ways: + +* <<ecs-application-logs-ecs-loggers,**ECS loggers:**>> plugins for your logging libraries that reformat your logs into ECS format. +* <<reformatting-logs,**{apm-agent} ECS reformatting:**>> Java, Ruby, and Python {apm-agent}s automatically reformat application logs to ECS format without a logger. + +[discrete] +[[ecs-application-logs-ecs-loggers]] +== ECS loggers + +ECS loggers reformat your application logs into ECS-compatible JSON, removing the need for manual parsing. +ECS loggers require {filebeat} or {agent} configured to monitor and capture application logs. +In addition, pairing ECS loggers with your framework's {apm-agent} allows you to correlate logs to easily view logs that belong to a particular trace. + +[discrete] +[[ecs-application-logs-get-started]] +=== Get started + +For more information on adding an ECS logger to your application, refer to the guide for your framework: + +* {ecs-logging-dotnet-ref}/setup.html[.NET] +* Go: {ecs-logging-go-zap-ref}/setup.html[zap], {ecs-logging-go-logrus-ref}/setup.html[logrus] +* {ecs-logging-java-ref}/setup.html[Java] +* Node.js: {ecs-logging-nodejs-ref}/morgan.html[morgan], {ecs-logging-nodejs-ref}/pino.html[pino], {ecs-logging-nodejs-ref}/winston.html[winston] +* {ecs-logging-php-ref}/setup.html[PHP] +* {ecs-logging-python-ref}/installation.html[Python] +* {ecs-logging-ruby-ref}/setup.html[Ruby] + +[discrete] +[[reformatting-logs]] +== APM agent ECS reformatting + +Java, Ruby, and Python {apm-agent}s can automatically reformat application logs to ECS format without an ECS logger or the need to modify your application. The {apm-agent} also allows for log correlation so you can easily view logs that belong to a particular trace. + +To set up log ECS reformatting: + +. <<ecs-application-logs-enable-log-ecs-reformatting,Enable {apm-agent} reformatting>> +. <<ecs-application-logs-ingest-logs,Ingest logs with {filebeat} or {agent}.>> +. <<ecs-application-logs-view-logs,View logs in Logs Explorer>> + +[discrete] +[[ecs-application-logs-enable-log-ecs-reformatting]] +=== Enable log ECS reformatting + +Log ECS reformatting is controlled by the `log_ecs_reformatting` configuration option, and is disabled by default. Refer to the guide for your framework for information on enabling: + +* {apm-java-ref}/config-logging.html#config-log-ecs-reformatting[Java] +* {apm-ruby-ref}/configuration.html#config-log-ecs-formatting[Ruby] +* {apm-py-ref}/configuration.html#config-log_ecs_reformatting[Python] + +[discrete] +[[ecs-application-logs-ingest-logs]] +=== Ingest logs + +After enabling log ECS reformatting, send your application logs to your project using one of the following shipping tools: + +* <<ecs-application-logs-ingest-logs-with-filebeat,**{filebeat}:**>> A lightweight data shipper that sends log data to your project. +* <<ecs-application-logs-ingest-logs-with-agent,**{agent}:**>> A single agent for logs, metrics, security data, and threat prevention. With Fleet, you can centrally manage {agent} policies and lifecycles directly from your project. + +[discrete] +[[ecs-application-logs-ingest-logs-with-filebeat]] +=== Ingest logs with {filebeat} + +[IMPORTANT] +==== +Use {filebeat} version 8.11+ for the best experience when ingesting logs with {filebeat}. +==== + +Follow these steps to ingest application logs with {filebeat}. + +[discrete] +[[ecs-application-logs-step-1-install-filebeat]] +==== Step 1: Install {filebeat} + +Install {filebeat} on the server you want to monitor by running the commands that align with your system: + +include::../transclusion/observability/tab-widgets/filebeat-install/widget.asciidoc[] + +[discrete] +[[ecs-application-logs-step-2-connect-to-your-project]] +==== Step 2: Connect to your project + +Connect to your project using an API key to set up {filebeat}. Set the following information in the `filebeat.yml` file: + +[source,yaml] +---- +output.elasticsearch: + hosts: ["your-projects-elasticsearch-endpoint"] + api_key: "id:api_key" +---- + +. Set the `hosts` to your project's {es} endpoint. Locate your project's endpoint by clicking the help icon (image:images/icons/help.svg[Help icon]) and selecting **Endpoints**. Add the **{es} endpoint** to your configuration. +. From **Developer tools**, run the following command to create an API key that grants `manage` permissions for the `cluster` and the `filebeat-*` indices using: ++ +[source,shell] +---- +POST /_security/api_key +{ + "name": "filebeat_host001", + "role_descriptors": { + "filebeat_writer": { + "cluster": ["manage"], + "index": [ + { + "names": ["filebeat-*"], + "privileges": ["manage"] + } + ] + } + } +} +---- ++ +Refer to {filebeat-ref}/beats-api-keys.html[Grant access using API keys] for more information. + +[discrete] +[[ecs-application-logs-step-3-configure-filebeat]] +==== Step 3: Configure {filebeat} + +Add the following configuration to your `filebeat.yaml` file to start collecting log data. + +:ecs_logs: true +include::../transclusion/observability/tab-widgets/filebeat-logs/widget.asciidoc[] +:ecs_logs!: + +[discrete] +[[ecs-application-logs-step-4-set-up-and-start-filebeat]] +==== Step 4: Set up and start {filebeat} + +From the {filebeat} installation directory, set the {ref}/index-templates.html[index template] by running the command that aligns with your system: + +include::../transclusion/observability/tab-widgets/filebeat-setup/widget.asciidoc[] + +From the {filebeat} installation directory, start filebeat by running the command that aligns with your system: + +include::../transclusion/observability/tab-widgets/filebeat-start/widget.asciidoc[] + +[discrete] +[[ecs-application-logs-ingest-logs-with-agent]] +=== Ingest logs with {agent} + +Add the custom logs integration to ingest and centrally manage your logs using {agent} and {fleet}: + +[discrete] +[[ecs-application-logs-step-1-add-the-custom-logs-integration-to-your-project]] +==== Step 1: Add the custom logs integration to your project + +To add the custom logs integration to your project: + +. In your {observability} project, go to **Project Settings** → **Integrations**. +. Type `custom` in the search bar and select **Custom Logs**. +. Click **Install {agent}** at the bottom of the page, and follow the instructions for your system to install the {agent}. If you've already installed an {agent}, you'll be taken directly to configuring your integration. +. After installing the {agent}, click **Save and continue** to configure the integration from the **Add Custom Logs integration** page. +. Give your integration a meaningful name and description. +. Add the **Log file path**. For example, `/var/log/your-logs.log`. +. Under **Custom log file**, click **Advanced options**. ++ +[role="screenshot"] +image:images/custom-logs-advanced-options.png[Screenshot of advanced options location] +. In the **Processors** text box, add the following YAML configuration to add processors that enhance your data. See {filebeat-ref}/filtering-and-enhancing-data.html[processors] to learn more. ++ +[source,yaml] +---- +processors: + - add_host_metadata: ~ + - add_cloud_metadata: ~ + - add_docker_metadata: ~ + - add_kubernetes_metadata: ~ +---- +. Under **Custom configurations**, add the following YAML configuration to collect data. ++ +[source,yaml] +---- +json: + overwrite_keys: true <1> + add_error_key: true <2> + expand_keys: true <3> + keys_under_root: true <4> +fields_under_root: true <5> +fields: + service.name: your_service_name <6> + service.version: your_service_version <6> + service.environment: your_service_environment <6> +---- ++ +<1> Values from the decoded JSON object overwrite the fields that {agent} normally adds (type, source, offset, etc.) in case of conflicts. ++ +<2> {agent} adds an "error.message" and "error.type: json" key in case of JSON unmarshalling errors. ++ +<3> {agent} will recursively de-dot keys in the decoded JSON, and expand them into a hierarchical object structure. ++ +<4> By default, the decoded JSON is placed under a "json" key in the output document. When set to `true`, the keys are copied top level in the output document. ++ +<5> When set to `true`, custom fields are stored as top-level fields in the output document instead of being grouped under a fields sub-dictionary. ++ +<6> The `service.name` (required), `service.version` (optional), and `service.environment` (optional) of the service you're collecting logs from, used for <<correlate-application-logs-log-correlation,Log correlation>>. +. An agent policy is created that defines the data your {agent} collects. If you've previously installed an {agent} on the host you're collecting logs from, you can select the **Existing hosts** tab and use an existing agent policy. +. Click **Save and continue**. + +[discrete] +[[ecs-application-logs-view-logs]] +== View logs + +Use <<discover-and-explore-logs,Logs Explorer>> to search, filter, and visualize your logs. Refer to the <<filter-and-aggregate-logs,filter and aggregate logs>> documentation for more information. diff --git a/docs/en/serverless/logging/filter-and-aggregate-logs.asciidoc b/docs/en/serverless/logging/filter-and-aggregate-logs.asciidoc new file mode 100644 index 0000000000..589d1c7e23 --- /dev/null +++ b/docs/en/serverless/logging/filter-and-aggregate-logs.asciidoc @@ -0,0 +1,357 @@ +[[filter-and-aggregate-logs]] += Filter and aggregate logs + +:keywords: serverless, observability, how-to + +preview:[] + +Filter and aggregate your log data to find specific information, gain insight, and monitor your systems more efficiently. You can filter and aggregate based on structured fields like timestamps, log levels, and IP addresses that you've extracted from your log data. + +This guide shows you how to: + +* <<logs-filter,Filter logs>>: Narrow down your log data by applying specific criteria. +* <<logs-aggregate,Aggregate logs>>: Analyze and summarize data to find patterns and gain insight. + +[discrete] +[[logs-filter-and-aggregate-prereq]] +== Before you get started + +:role: Admin +:goal: create ingest pipelines and set the index template +include::../partials/roles.asciidoc[] +:role!: + +:goal!: + +The examples on this page use the following ingest pipeline and index template, which you can set in **Developer Tools**. If you haven't used ingest pipelines and index templates to parse your log data and extract structured fields yet, start with the <<parse-log-data,Parse and organize logs>> documentation. + +Set the ingest pipeline with the following command: + +[source,console] +---- +PUT _ingest/pipeline/logs-example-default +{ + "description": "Extracts the timestamp log level and host ip", + "processors": [ + { + "dissect": { + "field": "message", + "pattern": "%{@timestamp} %{log.level} %{host.ip} %{message}" + } + } + ] +} +---- + +Set the index template with the following command: + +[source,console] +---- +PUT _index_template/logs-example-default-template +{ + "index_patterns": [ "logs-example-*" ], + "data_stream": { }, + "priority": 500, + "template": { + "settings": { + "index.default_pipeline":"logs-example-default" + } + }, + "composed_of": [ + "logs-mappings", + "logs-settings", + "logs@custom", + "ecs@dynamic_templates" + ], + "ignore_missing_component_templates": ["logs@custom"] +} +---- + +[discrete] +[[logs-filter]] +== Filter logs + +Filter your data using the fields you've extracted so you can focus on log data with specific log levels, timestamp ranges, or host IPs. You can filter your log data in different ways: + +* <<logs-filter-logs-explorer,Filter logs in Logs Explorer>>: Filter and visualize log data in Logs Explorer. +* <<logs-filter-qdsl,Filter logs with Query DSL>>: Filter log data from Developer Tools using Query DSL. + +[discrete] +[[logs-filter-logs-explorer]] +=== Filter logs in Logs Explorer + +Logs Explorer is a tool that automatically provides views of your log data based on integrations and data streams. To open Logs Explorer, go to **Discover** and select the **Logs Explorer** tab. + +From Logs Explorer, you can use the {kibana-ref}/kuery-query.html[{kib} Query Language (KQL)] in the search bar to narrow down the log data that's displayed. +For example, you might want to look into an event that occurred within a specific time range. + +Add some logs with varying timestamps and log levels to your data stream: + +. In your Observability project, go to **Developer Tools**. +. In the **Console** tab, run the following command: + +[source,console] +---- +POST logs-example-default/_bulk +{ "create": {} } +{ "message": "2023-09-15T08:15:20.234Z WARN 192.168.1.101 Disk usage exceeds 90%." } +{ "create": {} } +{ "message": "2023-09-14T10:30:45.789Z ERROR 192.168.1.102 Critical system failure detected." } +{ "create": {} } +{ "message": "2023-09-10T14:20:45.789Z ERROR 192.168.1.105 Database connection lost." } +{ "create": {} } +{ "message": "2023-09-20T09:40:32.345Z INFO 192.168.1.106 User logout initiated." } +---- + +For this example, let's look for logs with a `WARN` or `ERROR` log level that occurred on September 14th or 15th. From Logs Explorer: + +. Add the following KQL query in the search bar to filter for logs with log levels of `WARN` or `ERROR`: ++ +[source,text] +---- +log.level: ("ERROR" or "WARN") +---- +. Click the current time range, select **Absolute**, and set the **Start date** to `Sep 14, 2023 @ 00:00:00.000`. ++ +[role="screenshot"] +image:images/logs-start-date.png[Set the time range start date] +. Click the end of the current time range, select **Absolute**, and set the **End date** to `Sep 15, 2023 @ 23:59:59.999`. ++ +[role="screenshot"] +image:images/logs-end-date.png[Set the time range end date] + +Under the **Documents** tab, you'll see the filtered log data matching your query. + +[role="screenshot"] +image::images/logs-kql-filter.png[] + +For more on using Logs Explorer, refer to the {kibana-ref}/discover.html[Discover] documentation. + +[discrete] +[[logs-filter-qdsl]] +=== Filter logs with Query DSL + +{ref}/query-dsl.html[Query DSL] is a JSON-based language that sends requests and retrieves data from indices and data streams. You can filter your log data using Query DSL from **Developer Tools**. + +For example, you might want to troubleshoot an issue that happened on a specific date or at a specific time. To do this, use a boolean query with a {ref}/query-dsl-range-query.html[range query] to filter for the specific timestamp range and a {ref}/query-dsl-term-query.html[term query] to filter for `WARN` and `ERROR` log levels. + +First, from **Developer Tools**, add some logs with varying timestamps and log levels to your data stream with the following command: + +[source,console] +---- +POST logs-example-default/_bulk +{ "create": {} } +{ "message": "2023-09-15T08:15:20.234Z WARN 192.168.1.101 Disk usage exceeds 90%." } +{ "create": {} } +{ "message": "2023-09-14T10:30:45.789Z ERROR 192.168.1.102 Critical system failure detected." } +{ "create": {} } +{ "message": "2023-09-10T14:20:45.789Z ERROR 192.168.1.105 Database connection lost." } +{ "create": {} } +{ "message": "2023-09-20T09:40:32.345Z INFO 192.168.1.106 User logout initiated." } +---- + +Let's say you want to look into an event that occurred between September 14th and 15th. The following boolean query filters for logs with timestamps during those days that also have a log level of `ERROR` or `WARN`. + +[source,console] +---- +POST /logs-example-default/_search +{ + "query": { + "bool": { + "filter": [ + { + "range": { + "@timestamp": { + "gte": "2023-09-14T00:00:00", + "lte": "2023-09-15T23:59:59" + } + } + }, + { + "terms": { + "log.level": ["WARN", "ERROR"] + } + } + ] + } + } +} +---- + +The filtered results should show `WARN` and `ERROR` logs that occurred within the timestamp range: + +[source,JSON] +---- +{ + ... + "hits": { + ... + "hits": [ + { + "_index": ".ds-logs-example-default-2023.09.25-000001", + "_id": "JkwPzooBTddK4OtTQToP", + "_score": 0, + "_source": { + "message": "192.168.1.101 Disk usage exceeds 90%.", + "log": { + "level": "WARN" + }, + "@timestamp": "2023-09-15T08:15:20.234Z" + } + }, + { + "_index": ".ds-logs-example-default-2023.09.25-000001", + "_id": "A5YSzooBMYFrNGNwH75O", + "_score": 0, + "_source": { + "message": "192.168.1.102 Critical system failure detected.", + "log": { + "level": "ERROR" + }, + "@timestamp": "2023-09-14T10:30:45.789Z" + } + } + ] + } +} +---- + +[discrete] +[[logs-aggregate]] +== Aggregate logs + +Use aggregation to analyze and summarize your log data to find patterns and gain insight. {ref}/search-aggregations-bucket.html[Bucket aggregations] organize log data into meaningful groups making it easier to identify patterns, trends, and anomalies within your logs. + +For example, you might want to understand error distribution by analyzing the count of logs per log level. + +First, from **Developer Tools**, add some logs with varying log levels to your data stream using the following command: + +[source,console] +---- +POST logs-example-default/_bulk +{ "create": {} } +{ "message": "2023-09-15T08:15:20.234Z WARN 192.168.1.101 Disk usage exceeds 90%." } +{ "create": {} } +{ "message": "2023-09-14T10:30:45.789Z ERROR 192.168.1.102 Critical system failure detected." } +{ "create": {} } +{ "message": "2023-09-15T12:45:55.123Z INFO 192.168.1.103 Application successfully started." } +{ "create": {} } +{ "message": "2023-09-14T15:20:10.789Z WARN 192.168.1.104 Network latency exceeding threshold." } +{ "create": {} } +{ "message": "2023-09-10T14:20:45.789Z ERROR 192.168.1.105 Database connection lost." } +{ "create": {} } +{ "message": "2023-09-20T09:40:32.345Z INFO 192.168.1.106 User logout initiated." } +{ "create": {} } +{ "message": "2023-09-21T15:20:55.678Z DEBUG 192.168.1.102 Database connection established." } +---- + +Next, run this command to aggregate your log data using the `log.level` field: + +[source,console] +---- +POST logs-example-default/_search?size=0&filter_path=aggregations +{ +"size": 0, <1> +"aggs": { + "log_level_distribution": { + "terms": { + "field": "log.level" + } + } + } +} +---- + +<1> Searches with an aggregation return both the query results and the aggregation, so you would see the logs matching the data and the aggregation. Setting `size` to `0` limits the results to aggregations. + +The results should show the number of logs in each log level: + +[source,JSON] +---- +{ + "aggregations": { + "error_distribution": { + "doc_count_error_upper_bound": 0, + "sum_other_doc_count": 0, + "buckets": [ + { + "key": "ERROR", + "doc_count": 2 + }, + { + "key": "INFO", + "doc_count": 2 + }, + { + "key": "WARN", + "doc_count": 2 + }, + { + "key": "DEBUG", + "doc_count": 1 + } + ] + } + } +} +---- + +You can also combine aggregations and queries. For example, you might want to limit the scope of the previous aggregation by adding a range query: + +[source,console] +---- +GET /logs-example-default/_search +{ + "size": 0, + "query": { + "range": { + "@timestamp": { + "gte": "2023-09-14T00:00:00", + "lte": "2023-09-15T23:59:59" + } + } + }, + "aggs": { + "my-agg-name": { + "terms": { + "field": "log.level" + } + } + } +} +---- + +The results should show an aggregate of logs that occurred within your timestamp range: + +[source,JSON] +---- +{ + ... + "hits": { + ... + "hits": [] + }, + "aggregations": { + "my-agg-name": { + "doc_count_error_upper_bound": 0, + "sum_other_doc_count": 0, + "buckets": [ + { + "key": "WARN", + "doc_count": 2 + }, + { + "key": "ERROR", + "doc_count": 1 + }, + { + "key": "INFO", + "doc_count": 1 + } + ] + } + } +} +---- + +For more on aggregation types and available aggregations, refer to the {ref}/search-aggregations.html[Aggregations] documentation. diff --git a/docs/en/serverless/logging/get-started-with-logs.asciidoc b/docs/en/serverless/logging/get-started-with-logs.asciidoc new file mode 100644 index 0000000000..1baf316f96 --- /dev/null +++ b/docs/en/serverless/logging/get-started-with-logs.asciidoc @@ -0,0 +1,49 @@ +[[get-started-with-logs]] += Get started with system logs + +:description: Learn how to onboard your system log data quickly. +:keywords: serverless, observability, how-to + +preview:[] + +:role: Admin +:goal: onboard log data +include::../partials/roles.asciidoc[] +:role!: + +:goal!: + +In this guide you'll learn how to onboard system log data from a machine or server, +then observe the data in **Logs Explorer**. + +To onboard system log data: + +. <<create-an-observability-project,Create a new {observability} project>>, or open an existing one. +. In your {observability} project, go to **Add data**. +. Under **Collect and analyze logs**, click **Stream host system logs**. +When the page loads, the system integration is installed automatically, and a new API key is created. +Make sure you copy the API key and store it in a secure location. +. Follow the in-product steps to install and configure the {agent}. +Notice that you can choose to download the agent's config automatically to avoid adding it manually. + +After the agent is installed and successfully streaming log data, you can view the data in the UI: + +. From the navigation menu, go to **Discover** and select the **Logs Explorer** tab. The view shows all log datasets. +Notice you can add fields, change the view, expand a document to see details, +and perform other actions to explore your data. +. Click **All log datasets** and select **System** → **syslog** to show syslog logs. + +[role="screenshot"] +image::images/log-explorer-select-syslogs.png[Screen capture of the Logs Explorer showing syslog dataset selected] + +[discrete] +[[get-started-with-logs-next-steps]] +== Next steps + +Now that you've added system logs and explored your data, +learn how to onboard other types of data: + +* <<stream-log-files>> +* <<apm-get-started>> + +To onboard other types of data, select **Add Data** from the main menu. diff --git a/docs/en/serverless/logging/log-monitoring.asciidoc b/docs/en/serverless/logging/log-monitoring.asciidoc new file mode 100644 index 0000000000..a8c080d73e --- /dev/null +++ b/docs/en/serverless/logging/log-monitoring.asciidoc @@ -0,0 +1,118 @@ +[[log-monitoring]] += Log monitoring + +:description: Use Elastic to deploy and manage logs at a petabyte scale, and get insights from your logs in minutes. +:keywords: serverless, observability, overview + +preview:[] + +Elastic Observability allows you to deploy and manage logs at a petabyte scale, giving you insights into your logs in minutes. You can also search across your logs in one place, troubleshoot in real time, and detect patterns and outliers with categorization and anomaly detection. For more information, refer to the following links: + +* <<get-started-with-logs,Get started with system logs>>: Onboard system log data from a machine or server. +* <<stream-log-files,Stream any log file>>: Send log files to your Observability project using a standalone {agent}. +* <<parse-log-data,Parse and route logs>>: Parse your log data and extract structured fields that you can use to analyze your data. +* <<logs-filter,Filter and aggregate logs>>: Filter and aggregate your log data to find specific information, gain insight, and monitor your systems more efficiently. +* <<discover-and-explore-logs,Explore logs>>: Find information on visualizing and analyzing logs. +* <<run-log-pattern-analysis,Run pattern analysis on log data>>: Find patterns in unstructured log messages and make it easier to examine your data. +* <<troubleshoot-logs,Troubleshoot logs>>: Find solutions for errors you might encounter while onboarding your logs. + +[discrete] +[[log-monitoring-send-logs-data-to-your-project]] +== Send logs data to your project + +You can send logs data to your project in different ways depending on your needs: + +* {agent} +* {filebeat} + +When choosing between {agent} and {filebeat}, consider the different features and functionalities between the two options. +See {fleet-guide}/beats-agent-comparison.html[{beats} and {agent} capabilities] for more information on which option best fits your situation. + +[discrete] +[[log-monitoring-agent]] +=== {agent} + +{agent} uses https://www.elastic.co/integrations/data-integrations[integrations] to ingest logs from Kubernetes, MySQL, and many more data sources. +You have the following options when installing and managing an {agent}: + +[discrete] +[[log-monitoring-fleet-managed-agent]] +==== {fleet}-managed {agent} + +Install an {agent} and use {fleet} to define, configure, and manage your agents in a central location. + +See {fleet-guide}/install-fleet-managed-elastic-agent.html[install {fleet}-managed {agent}]. + +[discrete] +[[log-monitoring-standalone-agent]] +==== Standalone {agent} + +Install an {agent} and manually configure it locally on the system where it’s installed. +You are responsible for managing and upgrading the agents. + +See {fleet-guide}/install-standalone-elastic-agent.html[install standalone {agent}]. + +[discrete] +[[log-monitoring-agent-in-a-containerized-environment]] +==== {agent} in a containerized environment + +Run an {agent} inside of a container — either with {fleet-server} or standalone. + +See {fleet-guide}/install-elastic-agents-in-containers.html[install {agent} in containers]. + +[discrete] +[[log-monitoring-filebeat]] +=== {filebeat} + +{filebeat} is a lightweight shipper for forwarding and centralizing log data. +Installed as a service on your servers, {filebeat} monitors the log files or locations that you specify, collects log events, and forwards them to your Observability project for indexing. + +* {filebeat-ref}/filebeat-overview.html[{filebeat} overview]: General information on {filebeat} and how it works. +* {filebeat-ref}/filebeat-installation-configuration.html[{filebeat} quick start]: Basic installation instructions to get you started. +* {filebeat-ref}/setting-up-and-running.html[Set up and run {filebeat}]: Information on how to install, set up, and run {filebeat}. + +[discrete] +[[log-monitoring-configure-logs]] +== Configure logs + +The following resources provide information on configuring your logs: + +* {ref}/data-streams.html[Data streams]: Efficiently store append-only time series data in multiple backing indices partitioned by time and size. +* {kibana-ref}/data-views.html[Data views]: Query log entries from the data streams of specific datasets or namespaces. +* {ref}/example-using-index-lifecycle-policy.html[Index lifecycle management]: Configure the built-in logs policy based on your application's performance, resilience, and retention requirements. +* {ref}/ingest.html[Ingest pipeline]: Parse and transform log entries into a suitable format before indexing. +* {ref}/mapping.html[Mapping]: Define how data is stored and indexed. + +[discrete] +[[log-monitoring-view-and-monitor-logs]] +== View and monitor logs + +Use **Logs Explorer** to search, filter, and tail all your logs ingested into your project in one place. + +The following resources provide information on viewing and monitoring your logs: + +* <<discover-and-explore-logs,Discover and explore>>: Discover and explore all of the log events flowing in from your servers, virtual machines, and containers in a centralized view. +* <<aiops-detect-anomalies,Detect log anomalies>>: Use {ml} to detect log anomalies automatically. + +[discrete] +[[log-monitoring-monitor-data-sets]] +== Monitor data sets + +The **Data Set Quality** page provides an overview of your data sets and their quality. +Use this information to get an idea of your overall data set quality, and find data sets that contain incorrectly parsed documents. + +<<monitor-datasets,Monitor data sets>> + +[discrete] +[[log-monitoring-application-logs]] +== Application logs + +Application logs provide valuable insight into events that have occurred within your services and applications. +See <<correlate-application-logs,Application logs>>. + +//// +/* ## Create a logs threshold alert + +You can create a rule to send an alert when the log aggregation exceeds a threshold. +See <DocLink id="serverlessObservabilityCreateLogThresholdRule">Create a logs threshold rule</DocLink>. */ +//// diff --git a/docs/en/serverless/logging/log-monitoring.mdx b/docs/en/serverless/logging/log-monitoring.mdx index 12969f2b07..b8693a40b8 100644 --- a/docs/en/serverless/logging/log-monitoring.mdx +++ b/docs/en/serverless/logging/log-monitoring.mdx @@ -84,7 +84,7 @@ The following resources provide information on viewing and monitoring your logs: The **Data Set Quality** page provides an overview of your data sets and their quality. Use this information to get an idea of your overall data set quality, and find data sets that contain incorrectly parsed documents. -<DocLink id="serverlessObservabilityMonitorDatasets">Monitor data sets</DocLink> +<DocLink slug="/serverless/observability/monitor-datasets">Monitor data sets</DocLink> ## Application logs diff --git a/docs/en/serverless/logging/parse-log-data.asciidoc b/docs/en/serverless/logging/parse-log-data.asciidoc new file mode 100644 index 0000000000..2614a3cbe5 --- /dev/null +++ b/docs/en/serverless/logging/parse-log-data.asciidoc @@ -0,0 +1,930 @@ +[[parse-log-data]] += Parse and route logs + +:keywords: serverless, observability, how-to + +preview:[] + +:role: Admin +:goal: create ingest pipelines that parse and route logs +include::../partials/roles.asciidoc[] +:role!: + +:goal!: + +If your log data is unstructured or semi-structured, you can parse it and break it into meaningful fields. You can use those fields to explore and analyze your data. For example, you can find logs within a specific timestamp range or filter logs by log level to focus on potential issues. + +After parsing, you can use the structured fields to further organize your logs by configuring a reroute processor to send specific logs to different target data streams. + +Refer to the following sections for more on parsing and organizing your log data: + +* <<parse-log-data-extract-structured-fields,Extract structured fields>>: Extract structured fields like timestamps, log levels, or IP addresses to make querying and filtering your data easier. +* <<parse-log-data-reroute-log-data-to-specific-data-streams,Reroute log data to specific data streams>>: Route data from the generic data stream to a target data stream for more granular control over data retention, permissions, and processing. + +[discrete] +[[parse-log-data-extract-structured-fields]] +== Extract structured fields + +Make your logs more useful by extracting structured fields from your unstructured log data. Extracting structured fields makes it easier to search, analyze, and filter your log data. + +Follow the steps below to see how the following unstructured log data is indexed by default: + +[source,log] +---- +2023-08-08T13:45:12.123Z WARN 192.168.1.101 Disk usage exceeds 90%. +---- + +Start by storing the document in the `logs-example-default` data stream: + +. In your Observability project, go to **Developer Tools**. +. In the **Console** tab, add the example log to your project using the following command: ++ +[source,console] +---- +POST logs-example-default/_doc +{ +"message": "2023-08-08T13:45:12.123Z WARN 192.168.1.101 Disk usage exceeds 90%." +} +---- +. Then, you can retrieve the document with the following search: ++ +[source,console] +---- +GET /logs-example-default/_search +---- + +The results should look like this: + +[source,json] +---- +{ + ... + "hits": { + ... + "hits": [ + { + "_index": ".ds-logs-example-default-2023.08.09-000001", + ... + "_source": { + "message": "2023-08-08T13:45:12.123Z WARN 192.168.1.101 Disk usage exceeds 90%.", + "@timestamp": "2023-08-09T17:19:27.73312243Z" + } + } + ] + } +} +---- + +Your project indexes the `message` field by default and adds a `@timestamp` field. Since there was no timestamp set, it's set to `now`. +At this point, you can search for phrases in the `message` field like `WARN` or `Disk usage exceeds`. +For example, run the following command to search for the phrase `WARN` in the log's `message` field: + +[source,console] +---- +GET logs-example-default/_search +{ + "query": { + "match": { + "message": { + "query": "WARN" + } + } + } +} +---- + +While you can search for phrases in the `message` field, you can't use this field to filter log data. Your message, however, contains all of the following potential fields you can extract and use to filter and aggregate your log data: + +* **@timestamp** (`2023-08-08T13:45:12.123Z`): Extracting this field lets you sort logs by date and time. This is helpful when you want to view your logs in the order that they occurred or identify when issues happened. +* **log.level** (`WARN`): Extracting this field lets you filter logs by severity. This is helpful if you want to focus on high-severity WARN or ERROR-level logs, and reduce noise by filtering out low-severity INFO-level logs. +* **host.ip** (`192.168.1.101`): Extracting this field lets you filter logs by the host IP addresses. This is helpful if you want to focus on specific hosts that you’re having issues with or if you want to find disparities between hosts. +* **message** (`Disk usage exceeds 90%.`): You can search for phrases or words in the message field. + +[NOTE] +==== +These fields are part of the {ecs-ref}/ecs-reference.html[Elastic Common Schema (ECS)]. The ECS defines a common set of fields that you can use across your project when storing data, including log and metric data. +==== + +[discrete] +[[parse-log-data-extract-the-timestamp-field]] +=== Extract the `@timestamp` field + +When you added the log to your project in the previous section, the `@timestamp` field showed when the log was added. The timestamp showing when the log actually occurred was in the unstructured `message` field: + +[source,json] +---- + ... + "_source": { + "message": "2023-08-08T13:45:12.123Z WARN 192.168.1.101 Disk usage exceeds 90%.", <1> + "@timestamp": "2023-08-09T17:19:27.73312243Z" <2> + } + ... +---- + +<1> The timestamp in the `message` field shows when the log occurred. + +<2> The timestamp in the `@timestamp` field shows when the log was added to your project. + +When looking into issues, you want to filter for logs by when the issue occurred not when the log was added to your project. +To do this, extract the timestamp from the unstructured `message` field to the structured `@timestamp` field by completing the following: + +. <<parse-log-data-use-an-ingest-pipeline-to-extract-the-timestamp-field,Use an ingest pipeline to extract the `@timestamp` field>> +. <<parse-log-data-test-the-pipeline-with-the-simulate-pipeline-api,Test the pipeline with the simulate pipeline API>> +. <<parse-log-data-configure-a-data-stream-with-an-index-template,Configure a data stream with an index template>> +. <<parse-log-data-create-a-data-stream,Create a data stream>> + +[discrete] +[[parse-log-data-use-an-ingest-pipeline-to-extract-the-timestamp-field]] +==== Use an ingest pipeline to extract the `@timestamp` field + +Ingest pipelines consist of a series of processors that perform common transformations on incoming documents before they are indexed. +To extract the `@timestamp` field from the example log, use an ingest pipeline with a {ref}/dissect-processor.html[dissect processor]. +The dissect processor extracts structured fields from unstructured log messages based on a pattern you set. + +Your project can parse string timestamps that are in `yyyy-MM-dd'T'HH:mm:ss.SSSZ` and `yyyy-MM-dd` formats into date fields. +Since the log example's timestamp is in one of these formats, you don't need additional processors. +More complex or nonstandard timestamps require a {ref}/date-processor.html[date processor] to parse the timestamp into a date field. + +Use the following command to extract the timestamp from the `message` field into the `@timestamp` field: + +[source,console] +---- +PUT _ingest/pipeline/logs-example-default +{ + "description": "Extracts the timestamp", + "processors": [ + { + "dissect": { + "field": "message", + "pattern": "%{@timestamp} %{message}" + } + } + ] +} +---- + +The previous command sets the following values for your ingest pipeline: + +* `_ingest/pipeline/logs-example-default`: The name of the pipeline,`logs-example-default`, needs to match the name of your data stream. You'll set up your data stream in the next section. For more information, refer to the {fleet-guide}/data-streams.html#data-streams-naming-scheme[data stream naming scheme]. +* `field`: The field you're extracting data from, `message` in this case. +* `pattern`: The pattern of the elements in your log data. The `%{@timestamp} %{message}` pattern extracts the timestamp, `2023-08-08T13:45:12.123Z`, to the `@timestamp` field, while the rest of the message, `WARN 192.168.1.101 Disk usage exceeds 90%.`, stays in the `message` field. The dissect processor looks for the space as a separator defined by the pattern. + +[discrete] +[[parse-log-data-test-the-pipeline-with-the-simulate-pipeline-api]] +==== Test the pipeline with the simulate pipeline API + +The {ref}/simulate-pipeline-api.html#ingest-verbose-param[simulate pipeline API] runs the ingest pipeline without storing any documents. +This lets you verify your pipeline works using multiple documents. + +Run the following command to test your ingest pipeline with the simulate pipeline API. + +[source,console] +---- +POST _ingest/pipeline/logs-example-default/_simulate +{ + "docs": [ + { + "_source": { + "message": "2023-08-08T13:45:12.123Z WARN 192.168.1.101 Disk usage exceeds 90%." + } + } + ] +} +---- + +The results should show the `@timestamp` field extracted from the `message` field: + +[source,console] +---- +{ + "docs": [ + { + "doc": { + "_index": "_index", + "_id": "_id", + "_version": "-3", + "_source": { + "message": "WARN 192.168.1.101 Disk usage exceeds 90%.", + "@timestamp": "2023-08-08T13:45:12.123Z" + }, + ... + } + } + ] +} +---- + +[NOTE] +==== +Make sure you've created the ingest pipeline using the `PUT` command in the previous section before using the simulate pipeline API. +==== + +[discrete] +[[parse-log-data-configure-a-data-stream-with-an-index-template]] +==== Configure a data stream with an index template + +After creating your ingest pipeline, run the following command to create an index template to configure your data stream's backing indices: + +[source,console] +---- +PUT _index_template/logs-example-default-template +{ + "index_patterns": [ "logs-example-*" ], + "data_stream": { }, + "priority": 500, + "template": { + "settings": { + "index.default_pipeline":"logs-example-default" + } + }, + "composed_of": [ + "logs@mappings", + "logs@settings", + "logs@custom", + "ecs@mappings" + ], + "ignore_missing_component_templates": ["logs@custom"] +} +---- + +The previous command sets the following values for your index template: + +* `index_pattern`: Needs to match your log data stream. Naming conventions for data streams are `<type>-<dataset>-<namespace>`. In this example, your logs data stream is named `logs-example-*`. Data that matches this pattern will go through your pipeline. +* `data_stream`: Enables data streams. +* `priority`: Sets the priority of your index templates. Index templates with a higher priority take precedence. If a data stream matches multiple index templates, your project uses the template with the higher priority. Built-in templates have a priority of `200`, so use a priority higher than `200` for custom templates. +* `index.default_pipeline`: The name of your ingest pipeline. `logs-example-default` in this case. +* `composed_of`: Here you can set component templates. Component templates are building blocks for constructing index templates that specify index mappings, settings, and aliases. Elastic has several built-in templates to help when ingesting your log data. + +The example index template above sets the following component templates: + +* `logs@mappings`: general mappings for log data streams that include disabling automatic date detection from `string` fields and specifying mappings for {ecs-ref}/ecs-data_stream.html[`data_stream` ECS fields]. +* `logs@settings`: general settings for log data streams including the following: ++ +** The default lifecycle policy that rolls over when the primary shard reaches 50 GB or after 30 days. +** The default pipeline uses the ingest timestamp if there is no specified `@timestamp` and places a hook for the `logs@custom` pipeline. If a `logs@custom` pipeline is installed, it's applied to logs ingested into this data stream. +** Sets the {ref}/ignore-malformed.html[`ignore_malformed`] flag to `true`. When ingesting a large batch of log data, a single malformed field like an IP address can cause the entire batch to fail. When set to true, malformed fields with a mapping type that supports this flag are still processed. +** `logs@custom`: a predefined component template that is not installed by default. Use this name to install a custom component template to override or extend any of the default mappings or settings. +** `ecs@mappings`: dynamic templates that automatically ensure your data stream mappings comply with the {ecs-ref}/ecs-reference.html[Elastic Common Schema (ECS)]. + +[discrete] +[[parse-log-data-create-a-data-stream]] +==== Create a data stream + +Create your data stream using the {fleet-guide}/data-streams.html#data-streams-naming-scheme[data stream naming scheme]. Name your data stream to match the name of your ingest pipeline, `logs-example-default` in this case. Post the example log to your data stream with this command: + +[source,console] +---- +POST logs-example-default/_doc +{ + "message": "2023-08-08T13:45:12.123Z WARN 192.168.1.101 Disk usage exceeds 90%." +} +---- + +View your documents using this command: + +[source,console] +---- +GET /logs-example-default/_search +---- + +You should see the pipeline has extracted the `@timestamp` field: + +[source,json] +---- +{ + ... + { + ... + "hits": { + ... + "hits": [ + { + "_index": ".ds-logs-example-default-2023.08.09-000001", + "_id": "RsWy3IkB8yCtA5VGOKLf", + "_score": 1, + "_source": { + "message": "WARN 192.168.1.101 Disk usage exceeds 90%.", + "@timestamp": "2023-08-08T13:45:12.123Z" <1> + } + } + ] + } + } +} +---- + +<1> The extracted `@timestamp` field. + +You can now use the `@timestamp` field to sort your logs by the date and time they happened. + +[discrete] +[[parse-log-data-troubleshoot-the-timestamp-field]] +==== Troubleshoot the `@timestamp` field + +Check the following common issues and solutions with timestamps: + +* **Timestamp failure:** If your data has inconsistent date formats, set `ignore_failure` to `true` for your date processor. This processes logs with correctly formatted dates and ignores those with issues. +* **Incorrect timezone:** Set your timezone using the `timezone` option on the {ref}/date-processor.html[date processor]. +* **Incorrect timestamp format:** Your timestamp can be a Java time pattern or one of the following formats: ISO8601, UNIX, UNIX_MS, or TAI64N. For more information on timestamp formats, refer to the {ref}/mapping-date-format.html[mapping date format]. + +[discrete] +[[parse-log-data-extract-the-loglevel-field]] +=== Extract the `log.level` field + +Extracting the `log.level` field lets you filter by severity and focus on critical issues. This section shows you how to extract the `log.level` field from this example log: + +[source,log] +---- +2023-08-08T13:45:12.123Z WARN 192.168.1.101 Disk usage exceeds 90%. +---- + +To extract and use the `log.level` field: + +. <<parse-log-data-add-loglevel-to-your-ingest-pipeline,Add the `log.level` field to the dissect processor pattern in your ingest pipeline.>> +. <<parse-log-data-test-the-pipeline-with-the-simulate-api,Test the pipeline with the simulate API.>> +. <<parse-log-data-query-logs-based-on-loglevel,Query your logs based on the `log.level` field.>> + +[discrete] +[[parse-log-data-add-loglevel-to-your-ingest-pipeline]] +==== Add `log.level` to your ingest pipeline + +Add the `%{log.level}` option to the dissect processor pattern in the ingest pipeline you created in the <<parse-log-data-use-an-ingest-pipeline-to-extract-the-timestamp-field,Extract the `@timestamp` field>> section with this command: + +[source,console] +---- +PUT _ingest/pipeline/logs-example-default +{ + "description": "Extracts the timestamp and log level", + "processors": [ + { + "dissect": { + "field": "message", + "pattern": "%{@timestamp} %{log.level} %{message}" + } + } + ] +} +---- + +Now your pipeline will extract these fields: + +* The `@timestamp` field: `2023-08-08T13:45:12.123Z` +* The `log.level` field: `WARN` +* The `message` field: `192.168.1.101 Disk usage exceeds 90%.` + +In addition to setting an ingest pipeline, you need to set an index template. Use the index template created in the <<parse-log-data-configure-a-data-stream-with-an-index-template,Extract the `@timestamp` field>> section. + +[discrete] +[[parse-log-data-test-the-pipeline-with-the-simulate-api]] +==== Test the pipeline with the simulate API + +Test that your ingest pipeline works as expected with the {ref}/simulate-pipeline-api.html#ingest-verbose-param[simulate pipeline API]: + +[source,console] +---- +POST _ingest/pipeline/logs-example-default/_simulate +{ + "docs": [ + { + "_source": { + "message": "2023-08-08T13:45:12.123Z WARN 192.168.1.101 Disk usage exceeds 90%." + } + } + ] +} +---- + +The results should show the `@timestamp` and the `log.level` fields extracted from the `message` field: + +[source,json] +---- +{ + "docs": [ + { + "doc": { + "_index": "_index", + "_id": "_id", + "_version": "-3", + "_source": { + "message": "192.168.1.101 Disk usage exceeds 90%.", + "log": { + "level": "WARN" + }, + "@timestamp": "2023-8-08T13:45:12.123Z", + }, + ... + } + } + ] +} +---- + +[discrete] +[[parse-log-data-query-logs-based-on-loglevel]] +==== Query logs based on `log.level` + +Once you've extracted the `log.level` field, you can query for high-severity logs like `WARN` and `ERROR`, which may need immediate attention, and filter out less critical `INFO` and `DEBUG` logs. + +Let's say you have the following logs with varying severities: + +[source,log] +---- +2023-08-08T13:45:12.123Z WARN 192.168.1.101 Disk usage exceeds 90%. +2023-08-08T13:45:14.003Z ERROR 192.168.1.103 Database connection failed. +2023-08-08T13:45:15.004Z DEBUG 192.168.1.104 Debugging connection issue. +2023-08-08T13:45:16.005Z INFO 192.168.1.102 User changed profile picture. +---- + +Add them to your data stream using this command: + +[source,console] +---- +POST logs-example-default/_bulk +{ "create": {} } +{ "message": "2023-08-08T13:45:12.123Z WARN 192.168.1.101 Disk usage exceeds 90%." } +{ "create": {} } +{ "message": "2023-08-08T13:45:14.003Z ERROR 192.168.1.103 Database connection failed." } +{ "create": {} } +{ "message": "2023-08-08T13:45:15.004Z DEBUG 192.168.1.104 Debugging connection issue." } +{ "create": {} } +{ "message": "2023-08-08T13:45:16.005Z INFO 192.168.1.102 User changed profile picture." } +---- + +Then, query for documents with a log level of `WARN` or `ERROR` with this command: + +[source,console] +---- +GET logs-example-default/_search +{ + "query": { + "terms": { + "log.level": ["WARN", "ERROR"] + } + } +} +---- + +The results should show only the high-severity logs: + +[source,json] +---- +{ +... + }, + "hits": { + ... + "hits": [ + { + "_index": ".ds-logs-example-default-2023.08.14-000001", + "_id": "3TcZ-4kB3FafvEVY4yKx", + "_score": 1, + "_source": { + "message": "192.168.1.101 Disk usage exceeds 90%.", + "log": { + "level": "WARN" + }, + "@timestamp": "2023-08-08T13:45:12.123Z" + } + }, + { + "_index": ".ds-logs-example-default-2023.08.14-000001", + "_id": "3jcZ-4kB3FafvEVY4yKx", + "_score": 1, + "_source": { + "message": "192.168.1.103 Database connection failed.", + "log": { + "level": "ERROR" + }, + "@timestamp": "2023-08-08T13:45:14.003Z" + } + } + ] + } +} +---- + +[discrete] +[[parse-log-data-extract-the-hostip-field]] +=== Extract the `host.ip` field + +Extracting the `host.ip` field lets you filter logs by host IP addresses allowing you to focus on specific hosts that you're having issues with or find disparities between hosts. + +The `host.ip` field is part of the {ecs-ref}/ecs-reference.html[Elastic Common Schema (ECS)]. Through the ECS, the `host.ip` field is mapped as an {ref}/ip.html[`ip` field type]. `ip` field types allow range queries so you can find logs with IP addresses in a specific range. You can also query `ip` field types using Classless Inter-Domain Routing (CIDR) notation to find logs from a particular network or subnet. + +This section shows you how to extract the `host.ip` field from the following example logs and query based on the extracted fields: + +[source,log] +---- +2023-08-08T13:45:12.123Z WARN 192.168.1.101 Disk usage exceeds 90%. +2023-08-08T13:45:14.003Z ERROR 192.168.1.103 Database connection failed. +2023-08-08T13:45:15.004Z DEBUG 192.168.1.104 Debugging connection issue. +2023-08-08T13:45:16.005Z INFO 192.168.1.102 User changed profile picture. +---- + +To extract and use the `host.ip` field: + +. <<parse-log-data-add-hostip-to-your-ingest-pipeline,Add the `host.ip` field to your dissect processor in your ingest pipeline.>> +. <<parse-log-data-test-the-pipeline-with-the-simulate-api,Test the pipeline with the simulate API.>> +. <<parse-log-data-query-logs-based-on-hostip,Query your logs based on the `host.ip` field.>> + +[discrete] +[[parse-log-data-add-hostip-to-your-ingest-pipeline]] +==== Add `host.ip` to your ingest pipeline + +Add the `%{host.ip}` option to the dissect processor pattern in the ingest pipeline you created in the <<parse-log-data-use-an-ingest-pipeline-to-extract-the-timestamp-field,Extract the `@timestamp` field>> section: + +[source,console] +---- +PUT _ingest/pipeline/logs-example-default +{ + "description": "Extracts the timestamp log level and host ip", + "processors": [ + { + "dissect": { + "field": "message", + "pattern": "%{@timestamp} %{log.level} %{host.ip} %{message}" + } + } + ] +} +---- + +Your pipeline will extract these fields: + +* The `@timestamp` field: `2023-08-08T13:45:12.123Z` +* The `log.level` field: `WARN` +* The `host.ip` field: `192.168.1.101` +* The `message` field: `Disk usage exceeds 90%.` + +In addition to setting an ingest pipeline, you need to set an index template. Use the index template created in the <<parse-log-data-configure-a-data-stream-with-an-index-template,Extract the `@timestamp` field>> section. + +[discrete] +[[parse-log-data-test-the-pipeline-with-the-simulate-api-1]] +==== Test the pipeline with the simulate API + +Test that your ingest pipeline works as expected with the {ref}/simulate-pipeline-api.html#ingest-verbose-param[simulate pipeline API]: + +[source,console] +---- +POST _ingest/pipeline/logs-example-default/_simulate +{ + "docs": [ + { + "_source": { + "message": "2023-08-08T13:45:12.123Z WARN 192.168.1.101 Disk usage exceeds 90%." + } + } + ] +} +---- + +The results should show the `host.ip`, `@timestamp`, and `log.level` fields extracted from the `message` field: + +[source,json] +---- +{ + "docs": [ + { + "doc": { + ... + "_source": { + "host": { + "ip": "192.168.1.101" + }, + "@timestamp": "2023-08-08T13:45:12.123Z", + "message": "Disk usage exceeds 90%.", + "log": { + "level": "WARN" + } + }, + ... + } + } + ] +} +---- + +[discrete] +[[parse-log-data-query-logs-based-on-hostip]] +==== Query logs based on `host.ip` + +You can query your logs based on the `host.ip` field in different ways, including using CIDR notation and range queries. + +Before querying your logs, add them to your data stream using this command: + +[source,console] +---- +POST logs-example-default/_bulk +{ "create": {} } +{ "message": "2023-08-08T13:45:12.123Z WARN 192.168.1.101 Disk usage exceeds 90%." } +{ "create": {} } +{ "message": "2023-08-08T13:45:14.003Z ERROR 192.168.1.103 Database connection failed." } +{ "create": {} } +{ "message": "2023-08-08T13:45:15.004Z DEBUG 192.168.1.104 Debugging connection issue." } +{ "create": {} } +{ "message": "2023-08-08T13:45:16.005Z INFO 192.168.1.102 User changed profile picture." } +---- + +[discrete] +[[parse-log-data-cidr-notation]] +===== CIDR notation + +You can use https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#CIDR_notation[CIDR notation] to query your log data using a block of IP addresses that fall within a certain network segment. CIDR notations uses the format of `[IP address]/[prefix length]`. The following command queries IP addresses in the `192.168.1.0/24` subnet meaning IP addresses from `192.168.1.0` to `192.168.1.255`. + +[source,console] +---- +GET logs-example-default/_search +{ + "query": { + "term": { + "host.ip": "192.168.1.0/24" + } + } +} +---- + +Because all of the example logs are in this range, you'll get the following results: + +[source,json] +---- +{ + ... + }, + "hits": { + ... + { + "_index": ".ds-logs-example-default-2023.08.16-000001", + "_id": "ak4oAIoBl7fe5ItIixuB", + "_score": 1, + "_source": { + "host": { + "ip": "192.168.1.101" + }, + "@timestamp": "2023-08-08T13:45:12.123Z", + "message": "Disk usage exceeds 90%.", + "log": { + "level": "WARN" + } + } + }, + { + "_index": ".ds-logs-example-default-2023.08.16-000001", + "_id": "a04oAIoBl7fe5ItIixuC", + "_score": 1, + "_source": { + "host": { + "ip": "192.168.1.103" + }, + "@timestamp": "2023-08-08T13:45:14.003Z", + "message": "Database connection failed.", + "log": { + "level": "ERROR" + } + } + }, + { + "_index": ".ds-logs-example-default-2023.08.16-000001", + "_id": "bE4oAIoBl7fe5ItIixuC", + "_score": 1, + "_source": { + "host": { + "ip": "192.168.1.104" + }, + "@timestamp": "2023-08-08T13:45:15.004Z", + "message": "Debugging connection issue.", + "log": { + "level": "DEBUG" + } + } + }, + { + "_index": ".ds-logs-example-default-2023.08.16-000001", + "_id": "bU4oAIoBl7fe5ItIixuC", + "_score": 1, + "_source": { + "host": { + "ip": "192.168.1.102" + }, + "@timestamp": "2023-08-08T13:45:16.005Z", + "message": "User changed profile picture.", + "log": { + "level": "INFO" + } + } + } + ] + } +} +---- + +[discrete] +[[parse-log-data-range-queries]] +===== Range queries + +Use {ref}/query-dsl-range-query.html[range queries] to query logs in a specific range. + +The following command searches for IP addresses greater than or equal to `192.168.1.100` and less than or equal to `192.168.1.102`. + +[source,console] +---- +GET logs-example-default/_search +{ + "query": { + "range": { + "host.ip": { + "gte": "192.168.1.100", <1> + "lte": "192.168.1.102" <2> + } + } + } +} +---- + +<1> Greater than or equal to `192.168.1.100`. + +<2> Less than or equal to `192.168.1.102`. + +You'll get the following results only showing logs in the range you've set: + +[source,json] +---- +{ + ... + }, + "hits": { + ... + { + "_index": ".ds-logs-example-default-2023.08.16-000001", + "_id": "ak4oAIoBl7fe5ItIixuB", + "_score": 1, + "_source": { + "host": { + "ip": "192.168.1.101" + }, + "@timestamp": "2023-08-08T13:45:12.123Z", + "message": "Disk usage exceeds 90%.", + "log": { + "level": "WARN" + } + } + }, + { + "_index": ".ds-logs-example-default-2023.08.16-000001", + "_id": "bU4oAIoBl7fe5ItIixuC", + "_score": 1, + "_source": { + "host": { + "ip": "192.168.1.102" + }, + "@timestamp": "2023-08-08T13:45:16.005Z", + "message": "User changed profile picture.", + "log": { + "level": "INFO" + } + } + } + ] + } +} +---- + +[discrete] +[[parse-log-data-reroute-log-data-to-specific-data-streams]] +== Reroute log data to specific data streams + +By default, an ingest pipeline sends your log data to a single data stream. To simplify log data management, use a {ref}/reroute-processor.html[reroute processor] to route data from the generic data stream to a target data stream. For example, you might want to send high-severity logs to a specific data stream to help with categorization. + +This section shows you how to use a reroute processor to send the high-severity logs (`WARN` or `ERROR`) from the following example logs to a specific data stream and keep the regular logs (`DEBUG` and `INFO`) in the default data stream: + +[source,log] +---- +2023-08-08T13:45:12.123Z WARN 192.168.1.101 Disk usage exceeds 90%. +2023-08-08T13:45:14.003Z ERROR 192.168.1.103 Database connection failed. +2023-08-08T13:45:15.004Z DEBUG 192.168.1.104 Debugging connection issue. +2023-08-08T13:45:16.005Z INFO 192.168.1.102 User changed profile picture. +---- + +[NOTE] +==== +When routing data to different data streams, we recommend picking a field with a limited number of distinct values to prevent an excessive increase in the number of data streams. For more details, refer to the {ref}/size-your-shards.html[Size your shards] documentation. +==== + +To use a reroute processor: + +. <<parse-log-data-add-a-reroute-processor-to-the-ingest-pipeline,Add a reroute processor to your ingest pipeline.>> +. <<parse-log-data-add-logs-to-a-data-stream,Add the example logs to your data stream.>> +. <<parse-log-data-verify-the-reroute-processor-worked,Query your logs and verify the high-severity logs were routed to the new data stream.>> + +[discrete] +[[parse-log-data-add-a-reroute-processor-to-the-ingest-pipeline]] +=== Add a reroute processor to the ingest pipeline + +Add a reroute processor to your ingest pipeline with the following command: + +[source,console] +---- +PUT _ingest/pipeline/logs-example-default +{ + "description": "Extracts fields and reroutes WARN", + "processors": [ + { + "dissect": { + "field": "message", + "pattern": "%{@timestamp} %{log.level} %{host.ip} %{message}" + } + }, + { + "reroute": { + "tag": "high_severity_logs", + "if" : "ctx.log?.level == 'WARN' || ctx.log?.level == 'ERROR'", + "dataset": "critical" + } + } + ] +} +---- + +The previous command sets the following values for your reroute processor: + +* `tag`: Identifier for the processor that you can use for debugging and metrics. In the example, the tag is set to `high_severity_logs`. +* `if`: Conditionally runs the processor. In the example, `"ctx.log?.level == 'WARN' || ctx.log?.level == 'ERROR'",` means the processor runs when the `log.level` field is `WARN` or `ERROR`. +* `dataset`: the data stream dataset to route your document to if the previous condition is `true`. In the example, logs with a `log.level` of `WARN` or `ERROR` are routed to the `logs-critical-default` data stream. + +In addition to setting an ingest pipeline, you need to set an index template. Use the index template created in the <<parse-log-data-configure-a-data-stream-with-an-index-template,Extract the `@timestamp` field>> section. + +[discrete] +[[parse-log-data-add-logs-to-a-data-stream]] +=== Add logs to a data stream + +Add the example logs to your data stream with this command: + +[source,console] +---- +POST logs-example-default/_bulk +{ "create": {} } +{ "message": "2023-08-08T13:45:12.123Z WARN 192.168.1.101 Disk usage exceeds 90%." } +{ "create": {} } +{ "message": "2023-08-08T13:45:14.003Z ERROR 192.168.1.103 Database connection failed." } +{ "create": {} } +{ "message": "2023-08-08T13:45:15.004Z DEBUG 192.168.1.104 Debugging connection issue." } +{ "create": {} } +{ "message": "2023-08-08T13:45:16.005Z INFO 192.168.1.102 User changed profile picture." } +---- + +[discrete] +[[parse-log-data-verify-the-reroute-processor-worked]] +=== Verify the reroute processor worked + +The reroute processor should route any logs with a `log.level` of `WARN` or `ERROR` to the `logs-critical-default` data stream. Query the data stream using the following command to verify the log data was routed as intended: + +[source,console] +---- +GET logs-critical-default/_search +---- + +Your should see similar results to the following showing that the high-severity logs are now in the `critical` dataset: + +[source,json] +---- +{ + ... + "hits": { + ... + "hits": [ + ... + "_source": { + "host": { + "ip": "192.168.1.101" + }, + "@timestamp": "2023-08-08T13:45:12.123Z", + "message": "Disk usage exceeds 90%.", + "log": { + "level": "WARN" + }, + "data_stream": { + "namespace": "default", + "type": "logs", + "dataset": "critical" + }, + { + ... + "_source": { + "host": { + "ip": "192.168.1.103" + }, + "@timestamp": "2023-08-08T13:45:14.003Z", + "message": "Database connection failed.", + "log": { + "level": "ERROR" + }, + "data_stream": { + "namespace": "default", + "type": "logs", + "dataset": "critical" + } + } + } + ] + } +} +---- diff --git a/docs/en/serverless/logging/plaintext-application-logs.asciidoc b/docs/en/serverless/logging/plaintext-application-logs.asciidoc new file mode 100644 index 0000000000..eca726c5d2 --- /dev/null +++ b/docs/en/serverless/logging/plaintext-application-logs.asciidoc @@ -0,0 +1,288 @@ +[[plaintext-application-logs]] += Plaintext application logs + +:description: Parse and ingest raw, plain-text application logs using a log shipper like Filebeat. +:keywords: serverless, observability, how-to + +preview:[] + +Ingest and parse plaintext logs, including existing logs, from any programming language or framework without modifying your application or its configuration. + +Plaintext logs require some additional setup that structured logs do not require: + +* To search, filter, and aggregate effectively, you need to parse plaintext logs using an ingest pipeline to extract structured fields. Parsing is based on log format, so you might have to maintain different settings for different applications. +* To <<plaintext-application-logs-correlate-logs,correlate plaintext logs>>, you need to inject IDs into log messages and parse them using an ingest pipeline. + +To ingest, parse, and correlate plaintext logs: + +. Ingest plaintext logs with <<plaintext-application-logs-ingest-logs-with-filebeat,{filebeat}>> or <<plaintext-application-logs-ingest-logs-with-agent,{agent}>> and parse them before indexing with an ingest pipeline. +. <<plaintext-application-logs-correlate-logs,Correlate plaintext logs with an {apm-agent}.>> +. <<plaintext-application-logs-view-logs,View logs in Logs Explorer>> + +[discrete] +[[plaintext-application-logs-ingest-logs]] +== Ingest logs + +Send application logs to your project using one of the following shipping tools: + +* <<plaintext-application-logs-ingest-logs-with-filebeat,**{filebeat}:**>> A lightweight data shipper that sends log data to your project. +* <<plaintext-application-logs-ingest-logs-with-agent,**{agent}:**>> A single agent for logs, metrics, security data, and threat prevention. With Fleet, you can centrally manage {agent} policies and lifecycles directly from your project. + +[discrete] +[[plaintext-application-logs-ingest-logs-with-filebeat]] +=== Ingest logs with {filebeat} + +[IMPORTANT] +==== +Use {filebeat} version 8.11+ for the best experience when ingesting logs with {filebeat}. +==== + +Follow these steps to ingest application logs with {filebeat}. + +[discrete] +[[plaintext-application-logs-step-1-install-filebeat]] +==== Step 1: Install {filebeat} + +Install {filebeat} on the server you want to monitor by running the commands that align with your system: + +include::../transclusion/observability/tab-widgets/filebeat-install/widget.asciidoc[] + +[discrete] +[[plaintext-application-logs-step-2-connect-to-your-project]] +==== Step 2: Connect to your project + +Connect to your project using an API key to set up {filebeat}. Set the following information in the `filebeat.yml` file: + +[source,yaml] +---- +output.elasticsearch: + hosts: ["your-projects-elasticsearch-endpoint"] + api_key: "id:api_key" +---- + +. Set the `hosts` to your project's {es} endpoint. Locate your project's endpoint by clicking the help icon (image:images/icons/help.svg[Help icon]) and selecting **Endpoints**. Add the **{es} endpoint** to your configuration. +. From **Developer tools**, run the following command to create an API key that grants `manage` permissions for the `cluster` and the `filebeat-*` indices using: ++ +[source,shell] +---- +POST /_security/api_key +{ + "name": "your_api_key", + "role_descriptors": { + "filebeat_writer": { + "cluster": ["manage"], + "index": [ + { + "names": ["filebeat-*"], + "privileges": ["manage", "create_doc"] + } + ] + } + } +} +---- ++ +Refer to {filebeat-ref}/beats-api-keys.html[Grant access using API keys] for more information. + +[discrete] +[[plaintext-application-logs-step-3-configure-filebeat]] +==== Step 3: Configure {filebeat} + +Add the following configuration to the `filebeat.yaml` file to start collecting log data. + +[source,yaml] +---- +filebeat.inputs: +- type: filestream <1> + enabled: true + paths: /path/to/logs.log <2> +---- + +<1> Reads lines from an active log file. + +<2> Paths that you want {filebeat} to crawl and fetch logs from. + +You can add additional settings to the `filebeat.yml` file to meet the needs of your specific set up. For example, the following settings would add a parser to manage messages that span multiple lines and add service fields: + +[source,yaml] +---- + parsers: + - multiline: + type: pattern + pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}' + negate: true + match: after + fields_under_root: true + fields: + service.name: your_service_name + service.environment: your_service_environment + event.dataset: your_event_dataset +---- + +[discrete] +[[plaintext-application-logs-step-4-set-up-and-start-filebeat]] +==== Step 4: Set up and start {filebeat} + +From the {filebeat} installation directory, set the {ref}/index-templates.html[index template] by running the command that aligns with your system: + +include::../transclusion/observability/tab-widgets/filebeat-setup/widget.asciidoc[] + +from the {filebeat} installation directory, start filebeat by running the command that aligns with your system: + +include::../transclusion/observability/tab-widgets/filebeat-start/widget.asciidoc[] + +[discrete] +[[plaintext-application-logs-step-5-parse-logs-with-an-ingest-pipeline]] +==== Step 5: Parse logs with an ingest pipeline + +Use an ingest pipeline to parse the contents of your logs into structured, {ecs-ref}/ecs-reference.html[Elastic Common Schema (ECS)]-compatible fields. + +Create an ingest pipeline with a {ref}/dissect-processor.html[dissect processor] to extract structured ECS fields from your log messages. In your project, go to **Developer Tools** and use a command similar to the following example: + +[source,shell] +---- +PUT _ingest/pipeline/filebeat* <1> +{ + "description": "Extracts the timestamp log level and host ip", + "processors": [ + { + "dissect": { <2> + "field": "message", <3> + "pattern": "%{@timestamp} %{log.level} %{host.ip} %{message}" <4> + } + } + ] +} +---- + +<1> `_ingest/pipeline/filebeat*`: The name of the pipeline. Update the pipeline name to match the name of your data stream. For more information, refer to {fleet-guide}/data-streams.html#data-streams-naming-scheme[Data stream naming scheme]. + +<2> `processors.dissect`: Adds a {ref}/dissect-processor.html[dissect processor] to extract structured fields from your log message. + +<3> `field`: The field you're extracting data from, `message` in this case. + +<4> `pattern`: The pattern of the elements in your log data. The pattern varies depending on your log format. `%{@timestamp}`, `%{log.level}`, `%{host.ip}`, and `%{message}` are common {ecs-ref}/ecs-reference.html[ECS] fields. This pattern would match a log file in this format: `2023-11-07T09:39:01.012Z ERROR 192.168.1.110 Server hardware failure detected.` + +Refer to <<parse-log-data-extract-structured-fields,Extract structured fields>> for more on using ingest pipelines to parse your log data. + +After creating your pipeline, specify the pipeline for filebeat in the `filebeat.yml` file: + +[source,yaml] +---- +output.elasticsearch: + hosts: ["your-projects-elasticsearch-endpoint"] + api_key: "id:api_key" + pipeline: "your-pipeline" <1> +---- + +<1> Add the pipeline output and the name of your pipeline to the output. + +[discrete] +[[plaintext-application-logs-ingest-logs-with-agent]] +=== Ingest logs with {agent} + +Follow these steps to ingest and centrally manage your logs using {agent} and {fleet}. + +[discrete] +[[plaintext-application-logs-step-1-add-the-custom-logs-integration-to-your-project]] +==== Step 1: Add the custom logs integration to your project + +To add the custom logs integration to your project: + +. In your {observability} project, go to **Project Settings** → **Integrations**. +. Type `custom` in the search bar and select **Custom Logs**. +. Click **Add Custom Logs**. +. Click **Install {agent}** at the bottom of the page, and follow the instructions for your system to install the {agent}. +. After installing the {agent}, configure the integration from the **Add Custom Logs integration** page. +. Give your integration a meaningful name and description. +. Add the **Log file path**. For example, `/var/log/your-logs.log`. +. An agent policy is created that defines the data your {agent} collects. If you've previously installed an {agent} on the host you're collecting logs from, you can select the **Existing hosts** tab and use an existing agent policy. +. Click **Save and continue**. + +You can add additional settings to the integration under **Custom log file** by clicking **Advanced options** and adding YAML configurations to the **Custom configurations**. For example, the following settings would add a parser to manage messages that span multiple lines and add service fields. Service fields are used for <<correlate-application-logs-log-correlation,Log correlation>>. + +[source,yaml] +---- + parsers: + - multiline: + type: pattern + pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}' + negate: true + match: after + fields_under_root: true + fields: + service.name: your_service_name <1> + service.version: your_service_version <1> + service.environment: your_service_environment <1> +---- + +<1> for <<correlate-application-logs-log-correlation,Log correlation>>, add the `service.name` (required), `service.version` (optional), and `service.environment` (optional) of the service you're collecting logs from. + +[discrete] +[[plaintext-application-logs-step-2-add-an-ingest-pipeline-to-your-integration]] +==== Step 2: Add an ingest pipeline to your integration + +To aggregate or search for information in plaintext logs, use an ingest pipeline with your integration to parse the contents of your logs into structured, {ecs-ref}/ecs-reference.html[Elastic Common Schema (ECS)]-compatible fields. + +. From the custom logs integration, select **Integration policies** tab. +. Select the integration policy you created in the previous section. +. Click **Change defaults** → **Advanced options**. +. Under **Ingest pipelines**, click **Add custom pipeline**. +. Create an ingest pipeline with a {ref}/dissect-processor.html[dissect processor] to extract structured fields from your log messages. ++ +Click **Import processors** and add a similar JSON to the following example: ++ +[source,JSON] +---- +{ + "description": "Extracts the timestamp log level and host ip", + "processors": [ + { + "dissect": { <1> + "field": "message", <2> + "pattern": "%{@timestamp} %{log.level} %{host.ip} %{message}" <3> + } + } + ] +} +---- ++ +<1> `processors.dissect`: Adds a {ref}/dissect-processor.html[dissect processor] to extract structured fields from your log message. ++ +<2> `field`: The field you're extracting data from, `message` in this case. ++ +<3> `pattern`: The pattern of the elements in your log data. The pattern varies depending on your log format. `%{@timestamp}`, `%{log.level}`, `%{host.ip}`, and `%{message}` are common {ecs-ref}/ecs-reference.html[ECS] fields. This pattern would match a log file in this format: `2023-11-07T09:39:01.012Z ERROR 192.168.1.110 Server hardware failure detected.` +. Click **Create pipeline**. +. Save and deploy your integration. + +[discrete] +[[plaintext-application-logs-correlate-logs]] +== Correlate logs + +Correlate your application logs with trace events to: + +* view the context of a log and the parameters provided by a user +* view all logs belonging to a particular trace +* easily move between logs and traces when debugging application issues + +Log correlation works on two levels: + +* at service level: annotation with `service.name`, `service.version`, and `service.environment` allow you to link logs with APM services +* at trace level: annotation with `trace.id` and `transaction.id` allow you to link logs with traces + +Learn about correlating plaintext logs in the agent-specific ingestion guides: + +* {apm-go-ref}/logs.html[Go] +* {apm-java-ref}/logs.html#log-correlation-ids[Java] +* {apm-dotnet-ref}/log-correlation.html[.NET] +* {apm-node-ref}/log-correlation.html[Node.js] +* {apm-py-ref}/logs.html#log-correlation-ids[Python] +* {apm-ruby-ref}/log-correlation.html[Ruby] + +[discrete] +[[plaintext-application-logs-view-logs]] +== View logs + +To view logs ingested by {filebeat}, go to **Discover**. Create a data view based on the `filebeat-*` index pattern. Refer to {kibana-ref}/data-views.html[Create a data view] for more information. + +To view logs ingested by {agent}, go to **Discover** and select the <<discover-and-explore-logs,**Logs Explorer**>> tab. Refer to the <<filter-and-aggregate-logs,Filter and aggregate logs>> documentation for more on viewing and filtering your log data. diff --git a/docs/en/serverless/logging/run-log-pattern-analysis.asciidoc b/docs/en/serverless/logging/run-log-pattern-analysis.asciidoc new file mode 100644 index 0000000000..351090b298 --- /dev/null +++ b/docs/en/serverless/logging/run-log-pattern-analysis.asciidoc @@ -0,0 +1,35 @@ +[[run-log-pattern-analysis]] += Run a pattern analysis on log data + +:description: Find patterns in unstructured log messages. +:keywords: serverless, observability, how-to + +preview:[] + +preview::[] + +Log pattern analysis helps you find patterns in unstructured log messages and makes it easier to examine your data. +When you run a pattern analysis, it performs categorization analysis on a selected field, +creates categories based on the data, and then displays them together in a chart that shows the distribution of each category and an example document that matches the category. +Log pattern analysis is useful when you want to examine how often different types of logs appear in your data set. +It also helps you group logs in ways that go beyond what you can achieve with a terms aggregation. + +Log pattern analysis works on every text field. + +To run a log pattern analysis: + +. In your {observability} project, go to **Discover** and select the **Logs Explorer** tab. +. Select an integration, for example **Elastic APM error_logs**, and apply any filters that you want. +. If you don't see any results, expand the time range, for example, to **Last 15 days**. +. In the **Available fields** list, select the text field you want to analyze, then click **Run pattern analysis**. ++ +[role="screenshot"] +image:images/run-log-pattern-analysis.png[Run log pattern analysis] ++ +The results of the analysis are shown in a table: ++ +[role="screenshot"] +image::images/log-pattern-analysis.png[Log pattern analysis of the message field ] +. (Optional) Select one or more patterns, then choose to filter for (or filter out) documents that match the selected patterns. +**Logs Explorer** only displays documents that match (or don't match) the selected patterns. +The filter options enable you to remove unimportant messages and focus on the more important, actionable data during troubleshooting. diff --git a/docs/en/serverless/logging/send-application-logs.asciidoc b/docs/en/serverless/logging/send-application-logs.asciidoc new file mode 100644 index 0000000000..329163ae8f --- /dev/null +++ b/docs/en/serverless/logging/send-application-logs.asciidoc @@ -0,0 +1,15 @@ +[[send-application-logs]] += {apm-agent} log sending + +:description: Use the Java {apm-agent} to capture and send logs. +:keywords: serverless, observability, how-to + +preview:[] + +include::../transclusion/observability/application-logs/apm-agent-log-sending.asciidoc[] + +[discrete] +[[send-application-logs-get-started]] +== Get started + +See the {apm-java-ref}/logs.html#log-sending[Java agent] documentation to get started. diff --git a/docs/en/serverless/logging/stream-log-files.asciidoc b/docs/en/serverless/logging/stream-log-files.asciidoc new file mode 100644 index 0000000000..eb2d1f2f21 --- /dev/null +++ b/docs/en/serverless/logging/stream-log-files.asciidoc @@ -0,0 +1,297 @@ +[[stream-log-files]] += Stream any log file + +:description: Send a log file to your Observability project using the standalone {agent}. +:keywords: serverless, observability, how-to + +preview:[] + +:role: Admin +:goal: onboard log data +include::../partials/roles.asciidoc[] +:role!: + +:goal!: + +// HACK +// for images deeply nested in block elements +++++ +<div style="display:none"> +++++ +[role="screenshot"] +image::images/logs-stream-logs-api-key-beats.png[] +[role="screenshot"] +image::images/log-copy-es-endpoint.png[Copy a project's Elasticsearch endpoint] +++++ +</div> +++++ + +This guide shows you how to send a log file to your Observability project using a standalone {agent} and configure the {agent} and your data streams using the `elastic-agent.yml` file, and query your logs using the data streams you've set up. + +The quickest way to get started is to: + +. Open your Observability project. If you don't have one, <<create-an-observability-project,create an observability project>>. +. Go to **Add Data**. +. Under **Collect and analyze logs**, click **Stream log files**. + +This will kick off a set of guided instructions that walk you through configuring the standalone {agent} and sending log data to your project. + +To install and configure the {agent} manually, refer to <<manually-install-agent-logs,Manually install and configure the standalone {agent}>>. + +[discrete] +[[stream-log-files-configure-inputs-and-integration]] +== Configure inputs and integration + +Enter a few configuration details in the guided instructions. + +// Do we want to include a screenshot or will it be too difficult to maintain? + +[role="screenshot"] +image::images/logs-stream-logs-config.png[Configure inputs and integration in the Stream log files guided instructions] + +**Configure inputs** + +* **Log file path**: The path to your log files. +You can also use a pattern like `/var/log/your-logs.log*`. +Click **Add row** to add more log file paths. ++ +This will be passed to the `paths` field in the generated `elastic-agent.yml` file in a future step. ++ +* **Service name**: Provide a service name to allow for distributed services running on +multiple hosts to correlate the related instances. + +// Advanced settings? + +**Configure integration** + +Elastic creates an integration to streamline connecting your log data to Elastic. + +* **Integration name**: Give your integration a name. +This is a unique identifier for your stream of log data that you can later use to filter data in Logs Explorer. +The value must be unique within your project, all lowercase, and max 100 chars. Special characters will be replaced with `_`. ++ +This will be passed to the `streams.id` field in the generated `elastic-agent.yml` file in a future step. ++ +The integration name will be used in Logs Explorer. +It will appear in the "All logs" dropdown menu. ++ +[role="screenshot"] +image:images/logs-stream-logs-service-name.png[All logs dropdown menu on Logs Explorer page] ++ +* **Dataset name**: Give your integration's dataset a name. +The name for your dataset data stream. Name this data stream anything that signifies the source of the data. +The value must be all lowercase and max 100 chars. Special characters will be replaced with `_`. ++ +This will be passed to the `data_stream.dataset` field in the generated `elastic-agent.yml` file in a future step. + +[discrete] +[[stream-log-files-install-the-agent]] +== Install the {agent} + +After configuring the inputs and integration, you'll continue in the guided instructions to +install and configure the standalone {agent}. + +Run the command under **Install the {agent}** that corresponds with your system to download, extract, and install the {agent}. +Turning on **Automatically download the agent's config** includes your updated {agent} configuration file in the download. + +If you do not want to automatically download the configuration, click **Download config file** to download it manually and +add it to `/opt/Elastic/Agent/elastic-agent.yml` on the host where you installed the {agent}. +The values you provided in <<stream-log-files-configure-inputs-and-integration,Configure inputs and integration>> will be prepopulated in the generated configuration file. + +[discrete] +[[manually-install-agent-logs]] +== Manually install and configure the standalone {agent} + +If you're not using the guided instructions, follow these steps to manually install and configure your the {agent}. + +[discrete] +[[stream-log-files-step-1-download-and-extract-the-agent-installation-package]] +=== Step 1: Download and extract the {agent} installation package + +On your host, download and extract the installation package that corresponds with your system: + +include::../transclusion/fleet/tab-widgets/download-widget.asciidoc[] + +[discrete] +[[stream-log-files-step-2-install-and-start-the-agent]] +=== Step 2: Install and start the {agent} + +After downloading and extracting the installation package, you're ready to install the {agent}. +From the agent directory, run the install command that corresponds with your system: + +[NOTE] +==== +On macOS, Linux (tar package), and Windows, run the `install` command to +install and start {agent} as a managed service and start the service. The DEB and RPM +packages include a service unit for Linux systems with +systemd, For these systems, you must enable and start the service. +==== + +include::../transclusion/fleet/tab-widgets/run-standalone-widget.asciidoc[] + +During installation, you'll be prompted with some questions: + +. When asked if you want to install the agent as a service, enter `Y`. +. When asked if you want to enroll the agent in Fleet, enter `n`. + +[discrete] +[[stream-log-files-step-3-configure-the-agent]] +=== Step 3: Configure the {agent} + +After your agent is installed, configure it by updating the `elastic-agent.yml` file. + +[discrete] +[[stream-log-files-locate-your-configuration-file]] +==== Locate your configuration file + +You'll find the `elastic-agent.yml` in one of the following locations according to your system: + +include::../transclusion/observability/tab-widgets/logs/agent-location/widget.asciidoc[] + +[discrete] +[[stream-log-files-update-your-configuration-file]] +==== Update your configuration file + +Update the default configuration in the `elastic-agent.yml` file manually. +It should look something like this: + +[source,yaml] +---- +outputs: + default: + type: elasticsearch + hosts: '<your-elasticsearch-endpoint>:<port>' + api_key: 'your-api-key' +inputs: + - id: your-log-id + type: filestream + streams: + - id: your-log-stream-id + data_stream: + dataset: example + paths: + - /var/log/your-logs.log +---- + +You need to set the values for the following fields: + +|=== +| Field | Value + +| `hosts` +a| Copy the {es} endpoint from your project's page and add the port (the default port is `443`). For example, `https://my-deployment.es.us-central1.gcp.cloud.es.io:443`. + +If you're following the guided instructions in your project, +the {es} endpoint will be prepopulated in the configuration file. + +[TIP] +==== +If you need to find your project's {es} endpoint outside the guided instructions: + +. Go to the **Projects** page that lists all your projects. +. Click **Manage** next to the project you want to connect to. +. Click **View** next to _Endpoints_. +. Copy the _Elasticsearch endpoint_. + +[role="screenshot"] +image::images/log-copy-es-endpoint.png[Copy a project's Elasticsearch endpoint] +==== + +| `api-key` +a| Use an API key to grant the agent access to your project. +The API key format should be `<id>:<key>`. + +If you're following the guided instructions in your project, an API key will be autogenerated +and will be prepopulated in the downloadable configuration file. + +If configuring the {agent} manually, create an API key: + +. Navigate to **Project settings** → **Management** → **API keys** and click **Create API key**. +. Select **Restrict privileges** and add the following JSON to give privileges for ingesting logs. ++ +[source,json] +---- +{ + "standalone_agent": { + "cluster": [ + "monitor" + ], + "indices": [ + { + "names": [ + "logs-*-*" + ], + "privileges": [ + "auto_configure", "create_doc" + ] + } + ] + } +} +---- +. You _must_ set the API key to configure {beats}. +Immediately after the API key is generated and while it is still being displayed, click the +**Encoded** button next to the API key and select **Beats** from the list in the tooltip. +Base64 encoded API keys are not currently supported in this configuration. ++ +[role="screenshot"] +image::images/logs-stream-logs-api-key-beats.png[] + +| `inputs.id` +| A unique identifier for your input. + +| `type` +| The type of input. For collecting logs, set this to `filestream`. + +| `streams.id` +a| A unique identifier for your stream of log data. + +If you're following the guided instructions in your project, this will be prepopulated with +the value you specified in <<stream-log-files-configure-inputs-and-integration,Configure inputs and integration>>. + +| `data_stream.dataset` +a| The name for your dataset data stream. Name this data stream anything that signifies the source of the data. In this configuration, the dataset is set to `example`. The default value is `generic`. + +If you're following the guided instructions in your project, this will be prepopulated with +the value you specified in <<stream-log-files-configure-inputs-and-integration,Configure inputs and integration>>. + +| `paths` +a| The path to your log files. You can also use a pattern like `/var/log/your-logs.log*`. + +If you're following the guided instructions in your project, this will be prepopulated with +the value you specified in <<stream-log-files-configure-inputs-and-integration,Configure inputs and integration>>. +|=== + +[discrete] +[[stream-log-files-restart-the-agent]] +==== Restart the {agent} + +After updating your configuration file, you need to restart the {agent}. + +First, stop the {agent} and its related executables using the command that works with your system: + +include::../transclusion/fleet/tab-widgets/stop-widget.asciidoc[] + +Next, restart the {agent} using the command that works with your system: + +include::../transclusion/fleet/tab-widgets/start-widget.asciidoc[] + +[discrete] +[[stream-log-files-troubleshoot-your-agent-configuration]] +== Troubleshoot your {agent} configuration + +If you're not seeing your log files in your project, verify the following in the `elastic-agent.yml` file: + +* The path to your logs file under `paths` is correct. +* Your API key is in `<id>:<key>` format. If not, your API key may be in an unsupported format, and you'll need to create an API key in **Beats** format. + +If you're still running into issues, refer to {fleet-guide}/fleet-troubleshooting.html[{agent} troubleshooting] and {fleet-guide}/elastic-agent-configuration.html[Configure standalone Elastic Agents]. + +[discrete] +[[stream-log-files-next-steps]] +== Next steps + +After you have your agent configured and are streaming log data to your project: + +* Refer to the <<parse-log-data,Parse and organize logs>> documentation for information on extracting structured fields from your log data, rerouting your logs to different data streams, and filtering and aggregating your log data. +* Refer to the <<filter-and-aggregate-logs,Filter and aggregate logs>> documentation for information on filtering and aggregating your log data to find specific information, gain insight, and monitor your systems more efficiently. diff --git a/docs/en/serverless/logging/troubleshoot-logs.asciidoc b/docs/en/serverless/logging/troubleshoot-logs.asciidoc new file mode 100644 index 0000000000..46d0f4efe7 --- /dev/null +++ b/docs/en/serverless/logging/troubleshoot-logs.asciidoc @@ -0,0 +1,142 @@ +[[troubleshoot-logs]] += Troubleshoot logs + +:description: Find solutions to errors you might encounter while onboarding your logs. +:keywords: serverless, observability, troubleshooting + +preview:[] + +This section provides possible solutions for errors you might encounter while onboarding your logs. + +[discrete] +[[troubleshoot-logs-user-does-not-have-permissions-to-create-api-key]] +== User does not have permissions to create API key + +When adding a new data using the guided instructions in your project (**Add data** → **Collect and analyze logs** → **Stream log files**), +if you don't have the required privileges to create an API key, you'll see the following error message: + +[NOTE] +==== +You need permission to manage API keys +==== + +[discrete] +[[troubleshoot-logs-solution]] +=== Solution + +You need to either: + +* Ask an administrator to update your user role to at least **Deployment access** → **Admin**. Read more about user roles in https://www.elastic.co/docs/current/serverless/general/assign-user-roles[Assign user roles and privileges]. After your use role is updated, restart the onboarding flow. +* Get an API key from an administrator and manually add the API to the {agent} configuration. See <<stream-log-files-step-3-configure-the-agent,Configure the {agent}>> for more on manually updating the configuration and adding the API key. + +// Not sure if these are different in serverless... + +//// +/* ## Failed to create API key + +If you don't have the privileges to create `savedObjects` in a project, you'll see the following error message: + +```plaintext +Failed to create API key + +Something went wrong: Unable to create observability-onboarding-state +``` + +### Solution + +You need an administrator to give you the `Saved Objects Management` {kib} privilege to generate the required `observability-onboarding-state` flow state. +Once you have the necessary privileges, restart the onboarding flow. */ +//// + +[discrete] +[[troubleshoot-logs-observability-project-not-accessible-from-host]] +== Observability project not accessible from host + +If your Observability project is not accessible from the host, you'll see the following error message after pasting the **Install the {agent}** instructions into the host: + +[source,plaintext] +---- +Failed to connect to {host} port {port} after 0 ms: Connection refused +---- + +[discrete] +[[troubleshoot-logs-solution-1]] +=== Solution + +The host needs access to your project. Port `443` must be open and the project's {es} endpoint must be reachable. You can locate your project's endpoint by clicking the help icon (image:images/icons/help.svg[Help icon]) and selecting **Endpoints**. Run the following command, replacing the URL with your endpoint, and you should get an authentication error with more details on resolving your issue: + +[source,shell] +---- +curl https://your-endpoint.elastic.cloud +---- + +[discrete] +[[troubleshoot-logs-download-agent-failed]] +== Download {agent} failed + +If the host was able to download the installation script but cannot connect to the public artifact repository, you'll see the following error message: + +[source,plaintext] +---- +Download Elastic Agent + +Failed to download Elastic Agent, see script for error. +---- + +[discrete] +[[troubleshoot-logs-solutions]] +=== Solutions + +* If the combination of the {agent} version and operating system architecture is not available, you'll see the following error message: ++ +[source,plaintext] +---- +The requested URL returned error: 404 +---- ++ +To fix this, update the {agent} version in the installation instructions to a known version of the {agent}. +* If the {agent} was fully downloaded previously, you'll see the following error message: ++ +[source,plaintext] +---- +Error: cannot perform installation as Elastic Agent is already running from this directory +---- ++ +To fix this, delete previous downloads and restart the onboarding. +* You're an Elastic Cloud Enterprise user without access to the Elastic downloads page. + +[discrete] +[[troubleshoot-logs-install-agent-failed]] +== Install {agent} failed + +If an {agent} already exists on your host, you'll see the following error message: + +[source,plaintext] +---- +Install Elastic Agent + +Failed to install Elastic Agent, see script for error. +---- + +[discrete] +[[troubleshoot-logs-solution-2]] +=== Solution + +You can uninstall the current {agent} using the `elastic-agent uninstall` command, and run the script again. + +[WARNING] +==== +Uninstalling the current {agent} removes the entire current setup, including the existing configuration. +==== + +[discrete] +[[troubleshoot-logs-waiting-for-logs-to-be-shipped-step-never-completes]] +== Waiting for Logs to be shipped... step never completes + +If the **Waiting for Logs to be shipped...** step never completes, logs are not being shipped to your Observability project, and there is most likely an issue with your {agent} configuration. + +[discrete] +[[troubleshoot-logs-solution-3]] +=== Solution + +Inspect the {agent} logs for errors. See the {fleet-guide}/debug-standalone-agents.html#inspect-standalone-agent-logs[Debug standalone {agent}s] documentation for more on finding errors in {agent} logs. diff --git a/docs/en/serverless/logging/troubleshoot-logs.mdx b/docs/en/serverless/logging/troubleshoot-logs.mdx index 5bf09218ee..f1b08924a2 100644 --- a/docs/en/serverless/logging/troubleshoot-logs.mdx +++ b/docs/en/serverless/logging/troubleshoot-logs.mdx @@ -20,7 +20,7 @@ if you don't have the required privileges to create an API key, you'll see the f You need to either: -* Ask an administrator to update your user role to at least **Deployment access** → **Admin**. Read more about user roles in <DocLink slug="/serverless/general/assign-user-roles" />. After your use role is updated, restart the onboarding flow. +* Ask an administrator to update your user role to at least **Deployment access** → **Admin**. Read more about user roles in <DocLink slug="/serverless/general/assign-user-roles">Assign user roles and privileges</DocLink>. After your use role is updated, restart the onboarding flow. * Get an API key from an administrator and manually add the API to the ((agent)) configuration. See <DocLink slug="/serverless/observability/stream-log-files" section="step-3-configure-the-agent">Configure the ((agent))</DocLink> for more on manually updating the configuration and adding the API key. {/* Not sure if these are different in serverless... */} diff --git a/docs/en/serverless/logging/view-and-monitor-logs.asciidoc b/docs/en/serverless/logging/view-and-monitor-logs.asciidoc new file mode 100644 index 0000000000..fd60343690 --- /dev/null +++ b/docs/en/serverless/logging/view-and-monitor-logs.asciidoc @@ -0,0 +1,109 @@ +[[discover-and-explore-logs]] += Explore logs + +:description: Visualize and analyze logs. +:keywords: serverless, observability, how-to + +preview:[] + +With **Logs Explorer**, based on Discover, you can quickly search and filter your log data, get information about the structure of log fields, and display your findings in a visualization. +You can also customize and save your searches and place them on a dashboard. +Instead of having to log into different servers, change directories, and view individual files, all your logs are available in a single view. + +Go to Logs Explorer by opening **Discover** from the navigation menu, and selecting the **Logs Explorer** tab. + +[role="screenshot"] +image::images/log-explorer.png[Screen capture of the Logs Explorer] + +[discrete] +[[discover-and-explore-logs-required-kib-privileges]] +== Required {kib} privileges + +Viewing data in Logs Explorer requires `read` privileges for **Discover** and **Integrations**. +For more on assigning Kibana privileges, refer to the {kibana-ref}/kibana-privileges.html[{kib} privileges] docs. + +[discrete] +[[discover-and-explore-logs-find-your-logs]] +== Find your logs + +By default, Logs Explorer shows all of your logs according to the index patterns set in the **logs source** advanced setting. +Update this setting by going to _Management_ → _Advanced Settings_ and searching for _logs source_. + +If you need to focus on logs from a specific integrations, select the integration from the logs menu: + +[role="screenshot"] +image::images/log-menu.png[Screen capture of log menu] + +Once you have the logs you want to focus on displayed, you can drill down further to find the information you need. +For more on filtering your data in Logs Explorer, refer to <<logs-filter-logs-explorer,Filter logs in Logs Explorer>>. + +[discrete] +[[discover-and-explore-logs-review-log-data-in-the-documents-table]] +== Review log data in the documents table + +The documents table in Logs Explorer functions similarly to the table in Discover. +You can add fields, order table columns, sort fields, and update the row height in the same way you would in Discover. + +Refer to the {kibana-ref}/discover.html[Discover] documentation for more information on updating the table. + +[discrete] +[[discover-and-explore-logs-analyze-data-with-smart-fields]] +=== Analyze data with smart fields + +Smart fields are dynamic fields that provide valuable insight on where your log documents come from, what information they contain, and how you can interact with them. +The following sections detail the smart fields available in Logs Explorer. + +[discrete] +[[discover-and-explore-logs-resource-smart-field]] +==== Resource smart field + +The resource smart field shows where your logs are coming from by displaying fields like `service.name`, `container.name`, `orchestrator.namespace`, `host.name`, and `cloud.instance.id`. +Use this information to see where issues are coming from and if issues are coming from the same source. + +[discrete] +[[discover-and-explore-logs-content-smart-field]] +==== Content smart field + +The content smart field shows your logs' `log.level` and `message` fields. +If neither of these fields are available, the content smart field will show the `error.message` or `event.original` field. +Use this information to see your log content and inspect issues. + +[discrete] +[[discover-and-explore-logs-actions-smart-field]] +==== Actions smart field + +The actions smart field provides access to additional information about your logs. + +**Expand:** (image:images/icons/expand.svg[expand icon]) Open the log details to get an in-depth look at an individual log file. + +**Degraded document indicator:** (image:images/icons/pagesSelect.svg[degraded document indicator icon]) Shows if any of the document's fields were ignored when it was indexed. +Ignored fields could indicate malformed fields or other issues with your document. Use this information to investigate and determine why fields are being ignored. + +**Stacktrace indicator:** (image:images/icons/apmTrace.svg[stacktrace indicator icon]) Shows if the document contains stack traces. +This indicator makes it easier to navigate through your documents and know if they contain additional information in the form of stack traces. + +[discrete] +[[discover-and-explore-logs-view-log-details]] +== View log details + +Click the expand icon (image:images/icons/expand.svg[expand icon]) in the **Actions** column to get an in-depth look at an individual log file. + +These details provide immediate feedback and context for what's happening and where it's happening for each log. +From here, you can quickly debug errors and investigate the services where errors have occurred. + +The following actions help you filter and focus on specific fields in the log details: + +* **Filter for value (image:images/icons/plusInCircle.svg[filter for value icon]):** Show logs that contain the specific field value. +* **Filter out value (image:images/icons/minusInCircle.svg[filter out value icon]):** Show logs that do _not_ contain the specific field value. +* **Filter for field present (image:images/icons/filter.svg[filter for present icon]):** Show logs that contain the specific field. +* **Toggle column in table (image:images/icons/listAdd.svg[toggle column in table icon]):** Add or remove a column for the field to the main Logs Explorer table. + +[discrete] +[[discover-and-explore-logs-view-log-quality-issues]] +== View log quality issues + +From the log details of a document with ignored fields, as shown by the degraded document indicator ((image:images/icons/pagesSelect.svg[degraded document indicator icon])), expand the **Quality issues** section to see the name and value of the fields that were ignored. +Select **Data set details** to open the **Data Set Quality** page. Here you can monitor your data sets and investigate any issues. + +The **Data Set Details** page is also accessible from **Project settings** → **Management** → **Data Set Quality**. +Refer to <<monitor-datasets,Monitor data sets>> for more information. diff --git a/docs/en/serverless/logging/view-and-monitor-logs.mdx b/docs/en/serverless/logging/view-and-monitor-logs.mdx index a1e1e68c4a..1c8f2dc9c9 100644 --- a/docs/en/serverless/logging/view-and-monitor-logs.mdx +++ b/docs/en/serverless/logging/view-and-monitor-logs.mdx @@ -87,4 +87,4 @@ From the log details of a document with ignored fields, as shown by the degraded Select **Data set details** to open the **Data Set Quality** page. Here you can monitor your data sets and investigate any issues. The **Data Set Details** page is also accessible from **Project settings** → **Management** → **Data Set Quality**. -Refer to <DocLink id="serverlessObservabilityMonitorDatasets">Monitor data sets</DocLink> for more information. \ No newline at end of file +Refer to <DocLink slug="/serverless/observability/monitor-datasets">Monitor data sets</DocLink> for more information. \ No newline at end of file diff --git a/docs/en/serverless/monitor-datasets.asciidoc b/docs/en/serverless/monitor-datasets.asciidoc new file mode 100644 index 0000000000..c06e8d9c7c --- /dev/null +++ b/docs/en/serverless/monitor-datasets.asciidoc @@ -0,0 +1,72 @@ +[[monitor-datasets]] += Data set quality monitoring + +:description: Monitor data sets to find degraded documents. +:keywords: serverless, observability, how-to + +beta:[] + +The **Data Set Quality** page provides an overview of your log, metric, trace, and synthetic data sets. +Use this information to get an idea of your overall data set quality and find data sets that contain incorrectly parsed documents. + +Access the Data Set Quality page from the main menu at **Project settings** → **Management** → **Data Set Quality**. +By default, the page only shows log data sets. To see other data set types, select them from the **Type** menu. + +.Requirements +[NOTE] +==== +Users with the `viewer` role can view the Data Sets Quality summary. To view the Active Data Sets and Estimated Data summaries, users need the `monitor` {ref}/security-privileges.html#privileges-list-indices[index privilege] for the `logs-*-*` index. +==== + +The quality of your data sets is based on the percentage of degraded documents in each data set. +A degraded document in a data set contains the {ref}/mapping-ignored-field.html[`_ignored`] property because one or more of its fields were ignored during indexing. +Fields are ignored for a variety of reasons. +For example, when the {ref}/mapping-ignored-field.html[`ignore_malformed`] parameter is set to true, if a document field contains the wrong data type, the malformed field is ignored and the rest of the document is indexed. + +From the data set table, you'll find information for each data set such as its namespace, when the data set was last active, and the percentage of degraded docs. +The percentage of degraded documents determines the data set's quality according to the following scale: + +* Good (image:images/green-dot-icon.png[Good icon]): 0% of the documents in the data set are degraded. +* Degraded (image:images/yellow-dot-icon.png[Degraded icon]): Greater than 0% and up to 3% of the documents in the data set are degraded. +* Poor (image:images/red-dot-icon.png[Poor icon]): Greater than 3% of the documents in the data set are degraded. + +Opening the details of a specific data set shows the degraded documents history, a summary for the data set, and other details that can help you determine if you need to investigate any issues. + +[discrete] +[[monitor-datasets-investigate-issues]] +== Investigate issues + +The Data Set Quality page has a couple of different ways to help you find ignored fields and investigate issues. +From the data set table, you can open the data set's details page, and view commonly ignored fields and information about those fields. +Open a logs data set in Logs Explorer or other data set types in Discover to find ignored fields in individual documents. + +[discrete] +[[monitor-datasets-find-ignored-fields-in-data-sets]] +=== Find ignored fields in data sets + +To open the details page for a data set with poor or degraded quality and view ignored fields: + +. From the data set table, click image:images/icons/expand.svg[expand icon] next to a data set with poor or degraded quality. +. From the details, scroll down to **Quality issues**. + +The **Quality issues** section shows fields that have been ignored, the number of documents that contain ignored fields, and the timestamp of last occurrence of the field being ignored. + +[discrete] +[[monitor-datasets-find-ignored-fields-in-individual-logs]] +=== Find ignored fields in individual logs + +To use Logs Explorer or Discover to find ignored fields in individual logs: + +. Find data sets with degraded documents using the **Degraded Docs** column of the data sets table. +. Click the percentage in the **Degraded Docs** column to open the data set in Logs Explorer or Discover. + +The **Documents** table in Logs Explorer or Discover is automatically filtered to show documents that were not parsed correctly. +Under the **actions** column, you'll find the degraded document icon (image:images/icons/indexClose.svg[degraded document icon]). + +Now that you know which documents contain ignored fields, examine them more closely to find the origin of the issue: + +. Under the **actions** column, click image:images/icons/expand.svg[expand icon] to open the document details. +. Select the **JSON** tab. +. Scroll towards the end of the JSON to find the `ignored_field_values`. + +Here, you'll find all of the `_ignored` fields in the document and their values, which should provide some clues as to why the fields were ignored. diff --git a/docs/en/serverless/observability-overview.asciidoc b/docs/en/serverless/observability-overview.asciidoc new file mode 100644 index 0000000000..7334c62267 --- /dev/null +++ b/docs/en/serverless/observability-overview.asciidoc @@ -0,0 +1,151 @@ +[[serverless-observability-overview]] += Observability overview + +:description: Learn how to accelerate problem resolution with open, flexible, and unified observability powered by advanced machine learning and analytics. +:keywords: serverless, observability, overview + +preview:[] + +{observability} provides granular insights and context into the behavior of applications running in your environments. +It's an important part of any system that you build and want to monitor. +Being able to detect and fix root cause events quickly within an observable system is a minimum requirement for any analyst. + +Elastic {observability} provides a single stack to unify your logs, metrics, and application traces. +Ingest your data directly to your Observability project, where you can further process and enhance the data, +before visualizing it and adding alerts. + +image::images/serverless-capabilities.svg[Elastic {observability} overview diagram] + +[discrete] +[[apm-overview]] +== Log monitoring + +Analyze log data from your hosts, services, Kubernetes, Apache, and many more. + +In **Logs Explorer** (powered by Discover), you can quickly search and filter your log data, +get information about the structure of the fields, and display your findings in a visualization. + +[role="screenshot"] +image::images/log-explorer-overview.png[Logs Explorer showing log events] + +<<log-monitoring,Learn more about log monitoring →>> + +// RUM is not supported for this release. + +// Synthetic monitoring is not supported for this release. + +// Universal Profiling is not supported for this release. + +[discrete] +[[serverless-observability-overview-application-performance-monitoring-apm]] +== Application performance monitoring (APM) + +Instrument your code and collect performance data and errors at runtime by installing APM agents like Java, Go, .NET, and many more. +Then use {observability} to monitor your software services and applications in real time: + +* Visualize detailed performance information on your services. +* Identify and analyze errors. +* Monitor host-level and APM agent-specific metrics like JVM and Go runtime metrics. + +The **Service** inventory provides a quick, high-level overview of the health and general performance of all instrumented services. + +[role="screenshot"] +image::images/services-inventory.png[Service inventory showing health and performance of instrumented services] + +<<apm,Learn more about Application performance monitoring (APM) →>> + +[discrete] +[[metrics-overview]] +== Infrastructure monitoring + +Monitor system and service metrics from your servers, Docker, Kubernetes, Prometheus, and other services and applications. + +The **Infrastructure** UI provides a couple ways to view and analyze metrics across your infrastructure: + +The **Inventory** page provides a view of your infrastructure grouped by resource type. + +[role="screenshot"] +image::images/metrics-app.png[{infrastructure-app} in {kib}] + +The **Hosts** page provides a dashboard-like view of your infrastructure and is backed by an easy-to-use interface called Lens. + +[role="screenshot"] +image::images/hosts.png[Screenshot of the Hosts page] + +From either page, you can view health and performance metrics to get visibility into the overall health of your infrastructure. +You can also drill down into details about a specific host, including performance metrics, host metadata, running processes, +and logs. + +<<infrastructure-monitoring,Learn more about infrastructure monitoring → >> + +[discrete] +[[serverless-observability-overview-synthetic-monitoring]] +== Synthetic monitoring + +Simulate actions and requests that an end user would perform on your site at predefined intervals and in a controlled environment. +The end result is rich, consistent, and repeatable data that you can trend and alert on. + +For more information, see <<monitor-synthetics,Synthetic monitoring>>. + +[discrete] +[[serverless-observability-overview-alerting]] +== Alerting + +Stay aware of potential issues in your environments with {observability}’s alerting +and actions feature that integrates with log monitoring and APM. +It provides a set of built-in actions and specific threshold rules +and enables central management of all rules. + +On the **Alerts** page, the **Alerts** table provides a snapshot of alerts occurring within the specified time frame. The table includes the alert status, when it was last updated, the reason for the alert, and more. + +[role="screenshot"] +image::images/observability-alerts-overview.png[Summary of Alerts on the {observability} overview page] + +<<alerting,Learn more about alerting → >> + +[discrete] +[[serverless-observability-overview-service-level-objectives-slos]] +== Service-level objectives (SLOs) + +Set clear, measurable targets for your service performance, +based on factors like availability, response times, error rates, and other key metrics. +Then monitor and track your SLOs in real time, +using detailed dashboards and alerts that help you quickly identify and troubleshoot issues. + +From the SLO overview list, you can see all of your SLOs and a quick summary of what’s happening in each one: + +[role="screenshot"] +image::images/slo-dashboard.png[Dashboard showing list of SLOs] + +<<slos,Learn more about SLOs → >> + +[discrete] +[[serverless-observability-overview-cases]] +== Cases + +Collect and share information about observability issues by creating cases. +Cases allow you to track key investigation details, +add assignees and tags to your cases, set their severity and status, and add alerts, +comments, and visualizations. You can also send cases to third-party systems, +such as ServiceNow and Jira. + +[role="screenshot"] +image::images/cases.png[Screenshot showing list of cases] + +<<cases,Learn more about cases → >> + +[discrete] +[[serverless-observability-overview-aiops]] +== AIOps + +Reduce the time and effort required to detect, understand, investigate, and resolve incidents at scale +by leveraging predictive analytics and machine learning: + +* Detect anomalies by comparing real-time and historical data from different sources to look for unusual, problematic patterns. +* Find and investigate the causes of unusual spikes or drops in log rates. +* Detect distribution changes, trend changes, and other statistically significant change points in a metric of your time series data. + +[role="screenshot"] +image::images/log-rate-analysis.png[Log rate analysis page showing log rate spike ] + +<<aiops,Learn more about AIOps →>> diff --git a/docs/en/serverless/partials/apm-agent-warning.asciidoc b/docs/en/serverless/partials/apm-agent-warning.asciidoc new file mode 100644 index 0000000000..0735572550 --- /dev/null +++ b/docs/en/serverless/partials/apm-agent-warning.asciidoc @@ -0,0 +1,4 @@ +[IMPORTANT] +==== +Not all APM agent configuration options are compatible with Elastic Cloud serverless. +==== diff --git a/docs/en/serverless/partials/feature-beta.asciidoc b/docs/en/serverless/partials/feature-beta.asciidoc new file mode 100644 index 0000000000..fadfae5c1c --- /dev/null +++ b/docs/en/serverless/partials/feature-beta.asciidoc @@ -0,0 +1,5 @@ +.{feature} is in beta +[IMPORTANT] +==== +The {feature} functionality is in beta and is subject to change. The design and code is less mature than official generally available features and is being provided as-is with no warranties. +==== diff --git a/docs/en/serverless/partials/roles.asciidoc b/docs/en/serverless/partials/roles.asciidoc new file mode 100644 index 0000000000..099647d125 --- /dev/null +++ b/docs/en/serverless/partials/roles.asciidoc @@ -0,0 +1,5 @@ +.Required role +[NOTE] +==== +The **{role}** role or higher is required to {goal}. To learn more, refer to https://www.elastic.co/docs/current/serverless/general/assign-user-roles[Assign user roles and privileges]. +==== diff --git a/docs/en/serverless/partials/roles.mdx b/docs/en/serverless/partials/roles.mdx index d7d302aa28..fc438318ce 100644 --- a/docs/en/serverless/partials/roles.mdx +++ b/docs/en/serverless/partials/roles.mdx @@ -1,3 +1,3 @@ <DocCallOut title="Required role"> - The **{props.role}** role or higher is required to {props.goal}. To learn more, refer to <DocLink slug="/serverless/general/assign-user-roles" />. + The **{props.role}** role or higher is required to {props.goal}. To learn more, refer to <DocLink slug="/serverless/general/assign-user-roles">Assign user roles and privileges</DocLink>. </DocCallOut> \ No newline at end of file diff --git a/docs/en/serverless/projects/billing.asciidoc b/docs/en/serverless/projects/billing.asciidoc new file mode 100644 index 0000000000..8b578d401e --- /dev/null +++ b/docs/en/serverless/projects/billing.asciidoc @@ -0,0 +1,23 @@ +[[observability-billing]] += Observability billing dimensions + +:description: Learn about how Observability usage affects pricing. +:keywords: serverless, observability, overview + +preview:[] + +Elastic Observability severless projects provide you with all the capabilities of Elastic Observability to monitor critical applications. +Projects are provided using a Software as a Service (SaaS) model, and pricing is entirely consumption-based. + +Your monthly bill is based on the capabilities you use. +When you use Elastic Observability, your bill is calculated based on data volume, which has these components: + +* **Ingest** — Measured by the number of GB of log/event/info data that you send to your Observability project over the course of a month. +* **Storage/Retention** — This is known as Search AI Lake. +* In addition to the core ingest and retention dimensions, there is an optional charge to execute synthetic monitors on our testing infrastructure. +Browser (journey) based tests are charged on a per-test-run basis, +and Ping (lightweight) tests have an all-you-can-use model per location used. + +For more information, refer to https://www.elastic.co/docs/current/serverless/general/serverless-billing[Serverless billing dimensions]. + +For detailed Observability serverless project rates, check the https://www.elastic.co/pricing/serverless-observability[Observability Serverless pricing page]. diff --git a/docs/en/serverless/projects/billing.mdx b/docs/en/serverless/projects/billing.mdx index f3b6f3f4d8..2de3bc1c25 100644 --- a/docs/en/serverless/projects/billing.mdx +++ b/docs/en/serverless/projects/billing.mdx @@ -19,6 +19,6 @@ When you use Elastic Observability, your bill is calculated based on data volume Browser (journey) based tests are charged on a per-test-run basis, and Ping (lightweight) tests have an all-you-can-use model per location used. -For more information, refer to <DocLink slug="/serverless/general/serverless-billing" />. +For more information, refer to <DocLink slug="/serverless/general/serverless-billing">Serverless billing dimensions</DocLink>. For detailed Observability serverless project rates, check the [Observability Serverless pricing page](https://www.elastic.co/pricing/serverless-observability). diff --git a/docs/en/serverless/projects/create-an-observability-project.asciidoc b/docs/en/serverless/projects/create-an-observability-project.asciidoc new file mode 100644 index 0000000000..1a6dfd2025 --- /dev/null +++ b/docs/en/serverless/projects/create-an-observability-project.asciidoc @@ -0,0 +1,49 @@ +[[create-an-observability-project]] += Create an Elastic {observability} project + +:description: Create a fully-managed Elastic {observability} project to monitor the health of your applications. +:keywords: serverless, observability, how-to + +++++ +<titleabbrev>Create an Observability project</titleabbrev> +++++ + +:role: Admin +:goal: create projects +include::../partials/roles.asciidoc[] +:role!: + +:goal!: + +preview:[] + +An {observability} project allows you to run Elastic {observability} in an autoscaled and fully-managed environment, +where you don't have to manage the underlying {es} cluster or {kib} instances. + +. Navigate to https://cloud.elastic.co/[cloud.elastic.co] and log in to your account. +. Within **Serverless projects**, click **Create project**. +. Under **Observability**, click **Next**. +. Enter a name for your project. +. (Optional) Click **Edit settings** to change your project settings: ++ +** **Cloud provider**: The cloud platform where you’ll deploy your project. We currently support Amazon Web Services (AWS). +** **Region**: The https://www.elastic.co/docs/current/serverless/regions[region] where your project will live. +. Click **Create project**. It takes a few minutes to create your project. +. When the project is ready, click **Continue**. + +From here, you can start adding logs and other observability data. + +[TIP] +==== +To return to the onboarding page later, select **Add data** from the main menu. +==== + +[discrete] +[[create-an-observability-project-next-steps]] +== Next steps + +Learn how to add data to your project and start using {observability} features: + +* <<get-started-with-logs>> +* <<apm-get-started>> +* <<get-started-with-metrics>> diff --git a/docs/en/serverless/quickstarts/k8s-logs-metrics.asciidoc b/docs/en/serverless/quickstarts/k8s-logs-metrics.asciidoc new file mode 100644 index 0000000000..c950f5100d --- /dev/null +++ b/docs/en/serverless/quickstarts/k8s-logs-metrics.asciidoc @@ -0,0 +1,53 @@ +[[quickstarts-k8s-logs-metrics]] += Monitor your Kubernetes cluster with Elastic Agent + +:description: Learn how to monitor your cluster infrastructure running on Kubernetes. +:keywords: serverless, observability, how-to + +preview:[] + +In this quickstart guide, you'll learn how to create the Kubernetes resources that are required to monitor your cluster infrastructure. + +This new approach requires minimal configuration and provides you with an easy setup to monitor your infrastructure. You no longer need to download, install, or configure the Elastic Agent, everything happens automatically when you run the kubectl command. + +The kubectl command installs the standalone Elastic Agent in your Kubernetes cluster, downloads all the Kubernetes resources needed to collect metrics from the cluster, and sends it to Elastic. + +[discrete] +[[quickstarts-k8s-logs-metrics-prerequisites]] +== Prerequisites + +* An {observability} project. To learn more, refer to <<create-an-observability-project>>. +* A user with the **Admin** role or higher—required to onboard system logs and metrics. To learn more, refer to https://www.elastic.co/docs/current/serverless/general/assign-user-roles[Assign user roles and privileges]. +* A running Kubernetes cluster. +* https://kubernetes.io/docs/reference/kubectl/[Kubectl]. + +[discrete] +[[quickstarts-k8s-logs-metrics-collect-your-data]] +== Collect your data + +. <<create-an-observability-project,Create a new {observability} project>>, or open an existing one. +. In your {observability} project, go to **Add Data**. +. Select **Monitor infrastructure**, and then select **Kubernetes**. ++ +[role="screenshot"] +image::images/quickstart-k8s-entry-point.png[Kubernetes entry point] +. To install the Elastic Agent on your host, copy and run the install command. ++ +You will use the kubectl command to download a manifest file, inject user's API key generated by Kibana, and create the Kubernetes resources. +. Go back to the **Add Observability Data** page. +There might be a slight delay before data is ingested. When ready, you will see the message **We are monitoring your cluster**. +. Click **Explore Kubernetes cluster** to navigate to dashboards and explore your data. + +[discrete] +[[quickstarts-k8s-logs-metrics-visualize-your-data]] +== Visualize your data + +After installation is complete and all relevant data is flowing into Elastic, +the **Visualize your data** section allows you to access the Kubernetes Cluster Overview dashboard that can be used to monitor the health of the cluster. + +[role="screenshot"] +image::images/quickstart-k8s-overview.png[Kubernetes overview dashboard] + +Furthermore, you can access other useful prebuilt dashboards for monitoring Kubernetes resources, for example running pods per namespace, as well as the resources they consume, like CPU and memory. + +Refer to <<serverless-observability-overview>> for a description of other useful features. diff --git a/docs/en/serverless/quickstarts/k8s-logs-metrics.mdx b/docs/en/serverless/quickstarts/k8s-logs-metrics.mdx index 9ae1a9cf49..4a2fbd4459 100644 --- a/docs/en/serverless/quickstarts/k8s-logs-metrics.mdx +++ b/docs/en/serverless/quickstarts/k8s-logs-metrics.mdx @@ -16,7 +16,7 @@ The kubectl command installs the standalone Elastic Agent in your Kubernetes clu ## Prerequisites - An ((observability)) project. To learn more, refer to <DocLink slug="/serverless/observability/create-an-observability-project" />. -- A user with the **Admin** role or higher—required to onboard system logs and metrics. To learn more, refer to <DocLink slug="/serverless/general/assign-user-roles" />. +- A user with the **Admin** role or higher—required to onboard system logs and metrics. To learn more, refer to <DocLink slug="/serverless/general/assign-user-roles">Assign user roles and privileges</DocLink>. - A running Kubernetes cluster. - [Kubectl](https://kubernetes.io/docs/reference/kubectl/). @@ -25,7 +25,8 @@ The kubectl command installs the standalone Elastic Agent in your Kubernetes clu 1. <DocLink slug="/serverless/observability/create-an-observability-project">Create a new ((observability)) project</DocLink>, or open an existing one. 1. In your ((observability)) project, go to **Add Data**. 1. Select **Monitor infrastructure**, and then select **Kubernetes**. - ![Kubernetes entry point](../images/quickstart-k8s-entry-point.png) + + ![Kubernetes entry point](../images/quickstart-k8s-entry-point.png) 1. To install the Elastic Agent on your host, copy and run the install command. You will use the kubectl command to download a manifest file, inject user's API key generated by Kibana, and create the Kubernetes resources. diff --git a/docs/en/serverless/quickstarts/monitor-hosts-with-elastic-agent.asciidoc b/docs/en/serverless/quickstarts/monitor-hosts-with-elastic-agent.asciidoc new file mode 100644 index 0000000000..b59d5ddba0 --- /dev/null +++ b/docs/en/serverless/quickstarts/monitor-hosts-with-elastic-agent.asciidoc @@ -0,0 +1,128 @@ +[[quickstarts-monitor-hosts-with-elastic-agent]] += Monitor hosts with {agent} + +:description: Learn how to scan your hosts to detect and collect logs and metrics. +:keywords: serverless, observability, how-to + +preview:[] + +In this quickstart guide, you'll learn how to scan your host to detect and collect logs and metrics, +then navigate to dashboards to further analyze and explore your observability data. +You'll also learn how to get value out of your observability data. + +To scan your host, you'll run an auto-detection script that downloads and installs {agent}, +which is used to collect observability data from the host and send it to Elastic. + +The script also generates an {agent} configuration file that you can use with your existing Infrastructure-as-Code tooling. + +[discrete] +[[quickstarts-monitor-hosts-with-elastic-agent-prerequisites]] +== Prerequisites + +* An {observability} project. To learn more, refer to <<create-an-observability-project>>. +* A user with the **Admin** role or higher—required to onboard system logs and metrics. To learn more, refer to https://www.elastic.co/docs/current/serverless/general/assign-user-roles[Assign user roles and privileges]. +* Root privileges on the host—required to run the auto-detection script used in this quickstart. + +[discrete] +[[quickstarts-monitor-hosts-with-elastic-agent-limitations]] +== Limitations + +* The auto-detection script currently scans for metrics and logs from Apache, Docker, Nginx, and the host system. +It also scans for custom log files. +* The auto-detection script works on Linux and MacOS only. Support for the `lsof` command is also required if you want to detect custom log files. +* If you've installed Apache or Nginx in a non-standard location, you'll need to specify log file paths manually when you run the scan. +* Because Docker Desktop runs in a VM, its logs are not auto-detected. + +[discrete] +[[quickstarts-monitor-hosts-with-elastic-agent-collect-your-data]] +== Collect your data + +. <<create-an-observability-project,Create a new {observability} project>>, or open an existing one. +. In your {observability} project, go to **Add Data**. +. Select **Collect and analyze logs**, and then select **Auto-detect logs and metrics**. +. Copy the command that's shown. For example: ++ +[role="screenshot"] +image::images/quickstart-autodetection-command.png[Quick start showing command for running auto-detection] ++ +You'll run this command to download the auto-detection script and scan your system for observability data. +. Open a terminal on the host you want to scan, and run the command. +. Review the list of log files: ++ +** Enter `Y` to ingest all the log files listed. +** Enter `n` to either exclude log files or specify additional log paths. Enter `Y` to confirm your selections. + +When the script is done, you'll see a message like "{agent} is configured and running." + +There might be a slight delay before logs and other data are ingested. + +.Need to scan your host again? +[NOTE] +==== +You can re-run the script on the same host to detect additional logs. +The script will scan the host and reconfigure {agent} with any additional logs that are found. +If the script misses any custom logs, you can add them manually by entering `n` after the script has finished scanning the host. +==== + +[discrete] +[[quickstarts-monitor-hosts-with-elastic-agent-visualize-your-data]] +== Visualize your data + +After installation is complete and all relevant data is flowing into Elastic, +the **Visualize your data** section will show links to assets you can use to analyze your data. +Depending on what type of observability data was collected, +the page may link to the following integration assets: + +|=== +| Integration asset | Description + +| **System** +| Prebuilt dashboard for monitoring host status and health using system metrics. + +| **Apache** +| Prebuilt dashboard for monitoring Apache HTTP server health using error and access log data. + +| **Docker** +| Prebuilt dashboard for monitoring the status and health of Docker containers. + +| **Nginx** +| Prebuilt dashboard for monitoring Nginx server health using error and access log data. + +| **Custom .log files** +| Logs Explorer for analyzing custom logs. +|=== + +For example, you can navigate the **Host overview** dashboard to explore detailed metrics about system usage and throughput. +Metrics that indicate a possible problem are highlighted in red. + +[role="screenshot"] +image::images/quickstart-host-overview.png[Host overview dashboard] + +[discrete] +[[quickstarts-monitor-hosts-with-elastic-agent-get-value-out-of-your-data]] +== Get value out of your data + +After using the dashboards to examine your data and confirm you've ingested all the host logs and metrics you want to monitor, +you can use Elastic {observability} to gain deeper insight into your data. + +For host monitoring, the following capabilities and features are recommended: + +* In the <<infrastructure-monitoring,Infrastructure UI>>, analyze and compare data collected from your hosts. +You can also: ++ +** <<detect-metric-anomalies,Detect anomalies>> for memory usage and network traffic on hosts. +** <<alerting,Create alerts>> that notify you when an anomaly is detected or a metric exceeds a given value. +* In the <<discover-and-explore-logs,Logs Explorer>>, search and filter your log data, +get information about the structure of log fields, and display your findings in a visualization. +You can also: ++ +** <<monitor-datasets,Monitor log data set quality>> to find degraded documents. +** <<run-log-pattern-analysis,Run a pattern analysis>> to find patterns in unstructured log messages. +** <<alerting,Create alerts>> that notify you when an Observability data type reaches or exceeds a given value. +* Use <<aiops,AIOps features>> to apply predictive analytics and machine learning to your data: ++ +** <<aiops-detect-anomalies,Detect anomalies>> by comparing real-time and historical data from different sources to look for unusual, problematic patterns. +** <<aiops-analyze-spikes,Analyze log spikes and drops>>. +** <<aiops-detect-change-points,Detect change points>> in your time series data. + +Refer to <<serverless-observability-overview>> for a description of other useful features. diff --git a/docs/en/serverless/quickstarts/monitor-hosts-with-elastic-agent.mdx b/docs/en/serverless/quickstarts/monitor-hosts-with-elastic-agent.mdx index 946d752b0d..f6381bb6a0 100644 --- a/docs/en/serverless/quickstarts/monitor-hosts-with-elastic-agent.mdx +++ b/docs/en/serverless/quickstarts/monitor-hosts-with-elastic-agent.mdx @@ -19,7 +19,7 @@ The script also generates an ((agent)) configuration file that you can use with ## Prerequisites - An ((observability)) project. To learn more, refer to <DocLink slug="/serverless/observability/create-an-observability-project" />. -- A user with the **Admin** role or higher—required to onboard system logs and metrics. To learn more, refer to <DocLink slug="/serverless/general/assign-user-roles" />. +- A user with the **Admin** role or higher—required to onboard system logs and metrics. To learn more, refer to <DocLink slug="/serverless/general/assign-user-roles">Assign user roles and privileges</DocLink>. - Root privileges on the host—required to run the auto-detection script used in this quickstart. ## Limitations @@ -36,8 +36,10 @@ The script also generates an ((agent)) configuration file that you can use with 1. In your ((observability)) project, go to **Add Data**. 1. Select **Collect and analyze logs**, and then select **Auto-detect logs and metrics**. 1. Copy the command that's shown. For example: - ![Quick start showing command for running auto-detection](../images/quickstart-autodetection-command.png) - You'll run this command to download the auto-detection script and scan your system for observability data. + + ![Quick start showing command for running auto-detection](../images/quickstart-autodetection-command.png) + + You'll run this command to download the auto-detection script and scan your system for observability data. 1. Open a terminal on the host you want to scan, and run the command. 1. Review the list of log files: - Enter `Y` to ingest all the log files listed. diff --git a/docs/en/serverless/quickstarts/overview.asciidoc b/docs/en/serverless/quickstarts/overview.asciidoc new file mode 100644 index 0000000000..b2d45bf33c --- /dev/null +++ b/docs/en/serverless/quickstarts/overview.asciidoc @@ -0,0 +1,20 @@ +[[quickstarts-overview]] += Quickstarts + +:description: Learn how to ingest your observability data and get immediate value. +:keywords: serverless, observability, how-to + +Our quickstarts dramatically reduce your time-to-value by offering a fast path to ingest and visualize your Observability data. +Each quickstart provides: + +* A highly opinionated, fast path to data ingestion +* Sensible configuration defaults with minimal configuration required +* Auto-detection of logs and metrics for monitoring hosts +* Quick access to related dashboards and visualizations + +[discrete] +[[quickstarts-overview-available-quickstarts]] +== Available quickstarts + +* <<quickstarts-monitor-hosts-with-elastic-agent>> +* <<quickstarts-k8s-logs-metrics>> diff --git a/docs/en/serverless/slos/create-an-slo.asciidoc b/docs/en/serverless/slos/create-an-slo.asciidoc new file mode 100644 index 0000000000..af14e20515 --- /dev/null +++ b/docs/en/serverless/slos/create-an-slo.asciidoc @@ -0,0 +1,259 @@ +[[create-an-slo]] += Create an SLO + +:description: Learn how to define a service-level indicator (SLI), set an objective, and create a service-level objective (SLO). +:keywords: serverless, observability, how-to + +preview:[] + +:role: Editor +:goal: create SLOs +include::../partials/roles.asciidoc[] +:role!: + +:goal!: + +To create an SLO, in your {observability} project, go to **Observability** → **SLOs**: + +* If you're creating your first SLO, you'll see an introductory page. Click the **Create SLO** button. +* If you've created SLOs before, click the **Create new SLO** button in the upper-right corner of the page. + +From here, complete the following steps: + +. <<define-sli,Define your service-level indicator (SLI)>>. +. <<set-slo,Set your objectives>>. +. <<slo-describe,Describe your SLO>>. + +[discrete] +[[define-sli]] +== Define your SLI + +The type of SLI to use depends on the location of your data: + +* <<custom-kql,Custom KQL>>: Create an SLI based on raw logs coming from your services. +* <<timeslice-metric,Timeslice metric>>: Create an SLI based on a custom equation that uses multiple aggregations. +* <<custom-metric,Custom metric>>: Create an SLI to define custom equations from metric fields in your indices. +* <<histogram-metric,Histogram metric>>: Create an SLI based on histogram metrics. +* <<apm-latency-and-availability,APM latency and APM availability>>: Create an SLI based on services using application performance monitoring (APM). + +[discrete] +[[custom-kql]] +=== Custom KQL + +Create an indicator based on any of your {es} indices or data views. You define two queries: one that yields the good events from your index, and one that yields the total events from your index. + +**Example:** You can define a custom KQL indicator based on the `service-logs` index with the **good query** defined as `nested.field.response.latency <= 100 and nested.field.env : “production”` and the **total query** defined as `nested.field.env : “production”`. + +When defining a custom KQL SLI, set the following fields: + +* **Index:** The data view or index pattern you want to base the SLI on. For example, `service-logs`. +* **Timestamp field:** The timestamp field used by the index. +* **Query filter:** A KQL filter to specify relevant criteria by which to filter the index documents. +* **Good query:** The query yielding events that are considered good or successful. For example, `nested.field.response.latency <= 100 and nested.field.env : “production”`. +* **Total query:** The query yielding all events to take into account for computing the SLI. For example, `nested.field.env : “production”`. +* **Group by:** The field used to group the data based on the values of the specific field. For example, you could group by the `url.domain` field, which would create individual SLOs for each value of the selected field. + +[discrete] +[[custom-metric]] +=== Custom metric + +Create an indicator to define custom equations from metric fields in your indices. + +**Example:** You can define **Good events** as the sum of the field `processor.processed` with a filter of `"processor.outcome: \"success\""`, and the **Total events** as the sum of `processor.processed` with a filter of `"processor.outcome: *"`. + +When defining a custom metric SLI, set the following fields: + +* **Source** ++ +** **Index:** The data view or index pattern you want to base the SLI on. For example, `my-service-*`. +** **Timestamp field:** The timestamp field used by the index. +** **Query filter:** A KQL filter to specify relevant criteria by which to filter the index documents. For example, `'field.environment : "production" and service.name : "my-service"'`. +* **Good events** ++ +** **Metric [A-Z]:** The field that is aggregated using the `sum` aggregation for good events. For example, `processor.processed`. +** **Filter [A-Z]:** The filter to apply to the metric for good events. For example, `"processor.outcome: \"success\""`. +** **Equation:** The equation that calculates the good metric. For example, `A`. +* **Total events** ++ +** **Metric [A-Z]:** The field that is aggregated using the `sum` aggregation for total events. For example, `processor.processed`. +** **Filter [A-Z]:** The filter to apply to the metric for total events. For example, `"processor.outcome: *"`. +** **Equation:** The equation that calculates the total metric. For example, `A`. +* **Group by:** The field used to group the data based on the values of the specific field. For example, you could group by the `url.domain` field, which would create individual SLOs for each value of the selected field. + +[discrete] +[[timeslice-metric]] +=== Timeslice metric + +Create an indicator based on a custom equation that uses statistical aggregations and a threshold to determine whether a slice is good or bad. +Supported aggregations include `Average`, `Max`, `Min`, `Sum`, `Cardinality`, `Last value`, `Std. deviation`, `Doc count`, and `Percentile`. +The equation supports basic math and logic. + +[NOTE] +==== +This indicator requires you to use the `Timeslices` budgeting method. +==== + +**Example:** You can define an indicator to determine whether a Kubernetes StatefulSet is healthy. +First you set the query filter to `orchestrator.cluster.name: "elastic-k8s" AND kubernetes.namespace: "my-ns" AND data_stream.dataset: "kubernetes.state_statefulset"`. +Then you define an equation that compares the number of ready (healthy) replicas to the number of observed replicas: +`A == B ? 1 : 0`, where `A` retrieves the last value of `kubernetes.statefulset.replicas.ready` and `B` retrieves the last value of `kubernetes.statefulset.replicas.observed`. +The equation returns `1` if the condition `A == B` is true (indicating the same number of replicas) or `0` if it's false. If the value is less than 1, you can determine that the Kubernetes StatefulSet is unhealthy. + +When defining a timeslice metric SLI, set the following fields: + +* **Source** ++ +** **Index:** The data view or index pattern you want to base the SLI on. For example, `metrics-*:metrics-*`. +** **Timestamp field:** The timestamp field used by the index. +** **Query filter:** A KQL filter to specify relevant criteria by which to filter the index documents. For example, `orchestrator.cluster.name: "elastic-k8s" AND kubernetes.namespace: "my-ns" AND data_stream.dataset: "kubernetes.state_statefulset"`. +* **Metric definition** ++ +** **Aggregation [A-Z]:** The type of aggregation to use. +** **Field [A-Z]:** The field to use in the aggregation. For example, `kubernetes.statefulset.replicas.ready`. +** **Filter [A-Z]:** The filter to apply to the metric. +** **Equation:** The equation that calculates the total metric. For example, `A == B ? 1 : 0`. +** **Comparator:** The type of comparison to perform. +** **Threshold:** The value to use along with the comparator to determine if the slice is good or bad. + +[discrete] +[[histogram-metric]] +=== Histogram metric + +Histograms record data in a compressed format and can record latency and delay metrics. You can create an SLI based on histogram metrics using a `range` aggregation or a `value_count` aggregation for both the good and total events. Filtering with KQL queries is supported on both event types. + +When using a `range` aggregation, both the `from` and `to` thresholds are required for the range and the events are the total number of events within that range. The range includes the `from` value and excludes the `to` value. + +**Example:** You can define your **Good events** using the `processor.latency` field with a filter of `"processor.outcome: \"success\""`, and your **Total events** using the `processor.latency` field with a filter of `"processor.outcome: *"`. + +When defining a histogram metric SLI, set the following fields: + +* **Source** ++ +** **Index:** The data view or index pattern you want to base the SLI on. For example, `my-service-*`. +** **Timestamp field:** The timestamp field used by the index. +** **Query filter:** A KQL filter to specify relevant criteria by which to filter the index documents. For example, `field.environment : "production" and service.name : "my-service"`. +* **Good events** ++ +** **Aggregation:** The type of aggregation to use for good events, either **Value count** or **Range**. +** **Field:** The field used to aggregate events considered good or successful. For example, `processor.latency`. +** **From:** (`range` aggregation only) The starting value of the range for good events. For example, `0`. +** **To:** (`range` aggregation only) The ending value of the range for good events. For example, `100`. +** **KQL filter:** The filter for good events. For example, `"processor.outcome: \"success\""`. +* **Total events** ++ +** **Aggregation:** The type of aggregation to use for total events, either **Value count** or **Range**. +** **Field:** The field used to aggregate total events. For example, `processor.latency`. +** **From:** (`range` aggregation only) The starting value of the range for total events. For example, `0`. +** **To:** (`range` aggregation only) The ending value of the range for total events. For example, `100`. +** **KQL filter:** The filter for total events. For example, `"processor.outcome : *"`. +* **Group by:** The field used to group the data based on the values of the specific field. For example, you could group by the `url.domain` field, which would create individual SLOs for each value of the selected field. + +[discrete] +[[apm-latency-and-availability]] +=== APM latency and APM availability + +There are two types of SLI you can create based on services using application performance monitoring (APM): APM latency and APM availability. + +Use **APM latency** to create an indicator based on latency data received from your instrumented services and a latency threshold. + +**Example:** You can define an indicator on an APM service named `banking-service` for the `production` environment, and the transaction name `POST /deposit` with a latency threshold value of 300ms. + +Use **APM availability** to create an indicator based on the availability of your instrumented services. +Availability is determined by calculating the percentage of successful transactions (`event.outcome : "success"`) out of the total number of successful and failed transactions—unknown outcomes are excluded. + +**Example:** You can define an indicator on an APM service named `search-service` for the `production` environment, and the transaction name `POST /search`. + +When defining either an APM latency or APM availability SLI, set the following fields: + +* **Service name:** The APM service name. +* **Service environment:** Either `all` or the specific environment. +* **Transaction type:** Either `all` or the specific transaction type. +* **Transaction name:** Either `all` or the specific transaction name. +* **Threshold (APM latency only):** The latency threshold in milliseconds (ms) to consider the request as good. +* **Query filter:** An optional query filter on the APM data. + +[discrete] +[[synthetics-availability-sli]] +=== Synthetics availability + +Create an indicator based on the availability of your synthetic monitors. +Availability is determined by calculating the percentage of checks that are successful (`monitor.status : "up"`) +out of the total number of checks. + +**Example**: You can define an indicator based on a HTTP monitor being "up" for at least 99% of the time. + +When defining a Synthetics availability SLI, set the following fields: + +* **Monitor name** — The name of one or more <<synthetics-configuration,synthetic monitors>>. +* **Project** — The ID of one or more <<synthetics-configuration-project,projects>> containing synthetic monitors. +* **Tags** — One or more <<synthetics-configuration,tags>> assigned to synthetic monitors. +* **Query filter** — An optional KQL query used to filter the Synthetics checks on some relevant criteria. + +[NOTE] +==== +Synthetics availability SLIs are automatically grouped by monitor and location. +==== + +[discrete] +[[set-slo]] +== Set your objectives + +After defining your SLI, you need to set your objectives. To set your objectives, complete the following: + +. <<slo-budgeting-method,Select your budgeting method>> +. <<slo-time-window,Set your time window>> +. <<slo-target,Set your target/SLO percentage>> + +[discrete] +[[slo-time-window]] +=== Set your time window and duration + +Select the durations over which you want to compute your SLO. You can select either a **rolling** or **calendar aligned** time window: + +|=== +| | + +| **Rolling** +| Uses data from a specified duration that depends on when the SLO was created, for example the last 30 days. + +| **Calendar aligned** +| Uses data from a specified duration that aligns with calendar, for example weekly or monthly. +|=== + +[discrete] +[[slo-budgeting-method]] +=== Select your budgeting method + +You can select either an **occurrences** or a **timeslices** budgeting method: + +|=== +| | + +| **Occurrences** +| Uses the number of good events and the number of total events to compute the SLI. + +| **Timeslices** +| Breaks the overall time window into smaller slices of a defined duration, and uses the number of good slices over the number of total slices to compute the SLI. +|=== + +[discrete] +[[slo-target]] +=== Set your target/SLO (%) + +The SLO target objective as a percentage. + +[discrete] +[[slo-describe]] +== Describe your SLO + +After setting your objectives, give your SLO a name, a short description, and add any relevant tags. + +[discrete] +[[slo-alert-checkbox]] +== SLO burn rate alert rule + +When you use the UI to create an SLO, a default SLO burn rate alert rule is created automatically. +The burn rate rule will use the default configuration and no connector. +You must configure a connector if you want to receive alerts for SLO breaches. + +For more information about configuring the rule, see <<create-slo-burn-rate-alert-rule,Create an SLO burn rate rule>>. diff --git a/docs/en/serverless/slos/slos.asciidoc b/docs/en/serverless/slos/slos.asciidoc new file mode 100644 index 0000000000..35c444bb94 --- /dev/null +++ b/docs/en/serverless/slos/slos.asciidoc @@ -0,0 +1,106 @@ +[[slos]] += SLOs + +:description: Set clear, measurable targets for your service performance with service-level objectives (SLOs). +:keywords: serverless, observability, overview + +preview:[] + +Service-level objectives (SLOs) allow you to set clear, measurable targets for your service performance, based on factors like availability, response times, error rates, and other key metrics. +You can define SLOs based on different types of data sources, such as custom KQL queries and APM latency or availability data. + +Once you've defined your SLOs, you can monitor them in real time, with detailed dashboards and alerts that help you quickly identify and troubleshoot any issues that may arise. +You can also track your progress against your SLO targets over time, with a clear view of your error budgets and burn rates. + +[discrete] +[[slo-important-concepts]] +== Important concepts + +The following table lists some important concepts related to SLOs: + +|=== +| | + +| **Service-level indicator (SLI)** +| The measurement of your service's performance, such as service latency or availability. + +| **SLO** +| The target you set for your SLI. It specifies the level of performance you expect from your service over a period of time. + +| **Error budget** +| The amount of time that your SLI can fail to meet the SLO target before it violates your SLO. + +| **Burn rate** +| The rate at which your service consumes your error budget. +|=== + +[discrete] +[[slo-in-elastic]] +== SLO overview + +From the SLO overview, you can see all of your SLOs and a quick summary of what's happening in each one: + +[role="screenshot"] +image::images/slo-dashboard.png[Dashboard showing list of SLOs] + +Select an SLO from the overview to see additional details including: + +* **Burn rate:** the percentage of bad events over different time periods (1h, 6h, 24h, 72h) and the risk of exhausting your error budget within those time periods. +* **Historical SLI:** the SLI value and how it's trending over the SLO time window. +* **Error budget burn down:** the remaining error budget and how it's trending over the SLO time window. +* **Alerts:** active alerts if you've set any <<create-slo-burn-rate-alert-rule,SLO burn rate alert rules>> for the SLO. + +[role="screenshot"] +image::images/slo-detailed-view.png[Detailed view of a single SLO] + +[discrete] +[[filter-SLOs]] +== Search and filter SLOs + +You can apply searches and filters to quickly find the SLOs you're interested in. + +[role="screenshot"] +image::images/slo-filtering-options.png[Options for filtering SLOs in the overview] + +* **Apply structured filters:** Next to the search field, click the **Add filter** image:images/icons/plusInCircleFilled.svg[Add filter icon] icon to add a custom filter. Notice that you can use `OR` and `AND` to combine filters. The structured filter can be disabled, inverted, or pinned across all apps. +* **Enter a semi-structured search:** In the search field, start typing a field name to get suggestions for field names and operators that you can use to build a structured query. The semi-structured search will filter SLOs for matches, and only return matching SLOs. +* Use the **Status** and **Tags** menus to include or exclude SLOs from the view based on the status or defined tags. + +There are also options to sort and group the SLOs displayed in the overview: + +[role="screenshot"] +image::images/slo-group-by.png[SLOs sorted by SLO status and grouped by tags] + +* **Sort by**: SLI value, SLO status, Error budget consumed, or Error budget remaining. +* **Group by**: None, Tags, Status, or SLI type. +* Click icons to switch between a card view (image:images/icons/apps.svg[Card view icon]), list view (image:images/icons/list.svg[List view icon]), or compact view (image:images/icons/tableDensityCompact.svg[Compact view icon]]). + +[discrete] +[[slos-slo-dashboard-panels]] +== SLO dashboard panels + +SLO data is also available as Dashboard _panels_. +Panels allow you to curate custom data views and visualizations to bring clarity to your data. + +Available SLO panels include: + +* **SLO Overview**: Visualize a selected SLO's health, including name, current SLI value, target, and status. +* **SLO Alerts**: Visualize one or more SLO alerts, including status, rule name, duration, and reason. In addition, configure and update alerts, or create cases directly from the panel. + +[role="screenshot"] +image::images/slo-dashboard-panel.png[Detailed view of an SLO dashboard panel] + +To learn more about Dashboards, see <<dashboards,Dashboards>>. + +[discrete] +[[slo-overview-next-steps]] +== Next steps + +Get started using SLOs to measure your service performance: + +// TODO: Find out if any special privileges are required to grant access to SLOs and document as required. Classic doclink was <DocLink id="enObservabilitySloPrivileges">Configure SLO access</DocLink> + +* <<create-an-slo>> +* <<create-slo-burn-rate-alert-rule>> +* <<view-alerts>> +* <<triage-slo-burn-rate-breaches>> diff --git a/docs/en/serverless/synthetics/synthetics-analyze.asciidoc b/docs/en/serverless/synthetics/synthetics-analyze.asciidoc new file mode 100644 index 0000000000..ed9ff44e2d --- /dev/null +++ b/docs/en/serverless/synthetics/synthetics-analyze.asciidoc @@ -0,0 +1,393 @@ +[[synthetics-analyze]] += Analyze data from synthetic monitors + +++++ +<titleabbrev>Analyze monitor data</titleabbrev> +++++ + +preview:[] + +The Synthetics UI in Observability projects both provides a high-level overview of your service's +availability and allows you to dig into details to diagnose what caused downtime. + +[discrete] +[[synthetics-analyze-overview]] +== Overview + +The Synthetics **Overview** tab provides you with a high-level view of all the services you are monitoring +to help you quickly diagnose outages and other connectivity issues within your network. + +To access this page in your Observability project, go to **Synthetics** → **Overview**. + +This overview includes a snapshot of the current status of all monitors, the number of errors that +occurred over the last 6 hours, and the number of alerts over the last 12 hours. +All monitors created using a Synthetics project or using the UI will be listed below with information +about the location, current status, and duration average. + +[NOTE] +==== +When you use a single monitor configuration to create monitors in multiple locations, each location +is listed as a separate monitor as they run as individual monitors and the status and duration average +can vary by location. +==== + +[role="screenshot"] +image::images/synthetics-monitor-page.png[Synthetics UI in an Observability project] + +To get started with your analysis in the Overview tab, you can search for monitors or +use the filter options including current status (up, down, or disabled), +monitor type (for example, journey or HTTP), location, and more. + +Then click an individual monitor to see some details in a flyout. +From there, you can click **Go to monitor** to go to an individual monitor's page +to see more details (as described below). + +[discrete] +[[synthetics-analyze-individual-monitors]] +== All monitor types + +When you go to an individual monitor's page, you'll see much more detail about the monitor's +performance over time. The details vary by monitor type, but for every monitor at the top of the +page you'll see: + +* The monitor's **name** with a down arrow icon that you can use to quickly move between monitors. +* The **location** of the monitor. If the same monitor configuration was used to create monitors in +multiple locations, you'll also see a down arrow icon that you can use to quickly move between +locations that use the same configuration. +* The latest **status** and when the monitor was **last run**. +* The **image:images/icons/beaker.svg[Experiment] Run test manually** button that allows you to run the test on +demand before the next scheduled run. ++ +[NOTE] +==== +This is only available for monitors running on Elastic's global managed testing infrastructure. +It is not available for monitors running on {private-location}s. +==== +* The **image:images/icons/pencil.svg[Edit] Edit monitor** button that allows you to edit the monitor's +configuration. + +[role="screenshot"] +image::images/synthetics-analyze-individual-monitor-header.png[Header at the top of the individual monitor page for all monitor types in the Synthetics UI] + +Each individual monitor's page has three tabs: Overview, History, and Errors. + +[discrete] +[[synthetics-analyze-individual-monitors-overview]] +=== Overview + +The **Overview** tab has information about the monitor availability, duration, and any errors +that have occurred since the monitor was created. +The _Duration trends_ chart displays the timing for each check that was performed in the last 30 days. +This visualization helps you to gain insights into how quickly requests resolve by the targeted endpoint +and gives you a sense of how frequently a host or endpoint was down. + +[role="screenshot"] +image::images/synthetics-analyze-individual-monitor-details.png[Details in the Overview tab on the individual monitor page for all monitor types in the Synthetics UI] + +[discrete] +[[synthetics-analyze-individual-monitors-history]] +=== History + +The **History** tab has information on every time the monitor has run. +It includes some high-level stats and a complete list of all test runs. +Use the calendar icon (image:images/icons/calendar.svg[Calendar]) and search bar +to filter for runs that occurred in a specific time period. + +// What you might do with this info + +// ... + +For browser monitors, you can click on any run in the **Test runs** list +to see the details for that run. Read more about what information is +included the in <<synthetics-analyze-one-run,Details for one run>> section below. + +[role="screenshot"] +image::images/synthetics-analyze-individual-monitor-history.png[The History tab on the individual monitor page for all monitor types in the Synthetics UI] + +If the monitor is configured to <<synthetics-configuration-monitor,retest on failure>>, +you'll see retests listed in the **Test runs** table. Runs that are retests include a +rerun icon (image:images/icons/refresh.svg[Refresh icon]) next to the result badge. + +[role="screenshot"] +image::images/synthetics-retest.png[A failed run and a retest in the table of test runs in the Synthetics UI] + +[discrete] +[[synthetics-analyze-individual-monitors-errors]] +=== Errors + +The **Errors** tab has information on failed runs. +If the monitor is configured to <<synthetics-configuration-monitor,retest on failure>>, +failed runs will only result in an error if both the initial run and the rerun fail. +This can reduce noise related to transient problems. + +The Errors tab includes a high-level overview of all alerts and a complete list of all failures. +Use the calendar icon (image:images/icons/calendar.svg[Calendar]) and search bar +to filter for runs that occurred in a specific time period. + +// What you might do with this info + +// ... + +For browser monitors, you can click on any run in the **Error** list +to open an **Error details** page that includes most of the same information +that is included the in <<synthetics-analyze-one-run,Details for one run>> section below. + +[role="screenshot"] +image::images/synthetics-analyze-individual-monitor-errors.png[The Errors tab on the individual monitor page for all monitor types in the Synthetics UI] + +[discrete] +[[synthetics-analyze-journeys]] +== Browser monitors + +For browser monitors, you can look at results at various levels of granularity: + +* See an overview of journey runs over time. +* Drill down into the details of a single run. +* Drill down further into the details of a single _step_ within a journey. + +[discrete] +[[journey_runs_over_time]] +=== Journey runs over time + +The journey page on the Overview tab includes: + +* An overview of the **last test run** including high-level information for each step. +* **Alerts** to date including both active and recovered alerts. +* **Duration by step** over the last 24 hours. +* A list of the **last 10 test runs** that link to the <<synthetics-analyze-one-run,details for each run>>. + +[role="screenshot"] +image::images/synthetics-analyze-journeys-over-time.png[Individual journey page for browser monitors in the Synthetics UI] + +From here, you can either drill down into: + +* The latest run of the full journey by clicking **image:images/icons/inspect.svg[Inspect] View test run** +or a past run in the list of **Last 10 test runs**. +This will take you to the view described below in <<synthetics-analyze-one-run,Details for one run>>. +* An individual step in this run by clicking the performance breakdown icon +(image:images/icons/apmTrace.svg[APM trace]) next to one of the steps. +This will take you to the view described below in <<synthetics-analyze-one-step,Details for one step>>. + +[discrete] +[[synthetics-analyze-one-run]] +=== Details for one run + +The page detailing one run for a journey includes more information on each step in the current run +and opportunities to compare each step to the same step in previous runs. + +// What info it includes + +At the top of the page, see the _Code executed_ and any _Console_ output for each step. +If the step failed, this will also include a _Stacktrace_ tab that you can use to +diagnose the cause of errors. + +Navigate through each step using **image:images/icons/arrowLeft.svg[Previous] Previous** and +**Next image:images/icons/arrowRight.svg[Next]**. + +// Screenshot of the viz + +[role="screenshot"] +image::images/synthetics-analyze-one-run-code-executed.png[Step carousel on a page detailing one run of a browser monitor in the Synthetics UI] + +// What info it includes + +Scroll down to dig into the steps in this journey run. +Click the image:images/icons/arrowRight.svg[Next] icon next to the step number to show details. +The details include metrics for the step in the current run and the step in the last successful run. +Read more about step-level metrics below in <<synthetics-analyze-one-step-timing,Timing>> and +<<synthetics-analyze-one-step-metrics,Metrics>>. + +// What you might do with this info + +This is particularly useful to compare the metrics for a failed step to the last time it completed successfully +when trying to diagnose the reason it failed. + +// Screenshot of the viz + +[role="screenshot"] +image::images/synthetics-analyze-one-run-compare-steps.png[Step list on a page detailing one run of a browser monitor in the Synthetics UI] + +Drill down to see even more details for an individual step by clicking the performance breakdown icon +(image:images/icons/apmTrace.svg[APM trace]) next to one of the steps. +This will take you to the view described below in <<synthetics-analyze-one-step,Details for one step>>. + +[discrete] +[[synthetics-analyze-one-step]] +=== Details for one step + +After clicking the performance breakdown icon (image:images/icons/apmTrace.svg[APM trace]) +you'll see more detail for an individual step. + +[discrete] +[[synthetics-analyze-one-step-screenshot]] +==== Screenshot + +// What info it includes + +By default the synthetics library will capture a screenshot for each step regardless of +whether the step completed or failed. + +[NOTE] +==== +Customize screenshot behavior for all monitors in the <<synthetics-configuration,configuration file>>, +for one monitor using <<synthetics-monitor-use,`monitor.use`>>, or for a run using +the <<elastic-synthetics-command,CLI>>. +==== + +// What you might do with this info + +Screenshots can be particularly helpful to identify what went wrong when a step fails because of a change to the UI. +You can compare the failed step to the last time the step successfully completed. + +// Screenshot of the viz + +[role="screenshot"] +image::images/synthetics-analyze-one-step-screenshot.png[Screenshot for one step in a browser monitor in the Synthetics UI] + +[discrete] +[[synthetics-analyze-one-step-timing]] +==== Timing + +The **Timing** visualization shows a breakdown of the time spent in each part of +the resource loading process for the step including: + +* **Blocked**: The request was initiated but is blocked or queued. +* **DNS**: The DNS lookup to convert the hostname to an IP Address. +* **Connect**: The time it took the request to connect to the server. +Lengthy connections could indicate network issues, connection errors, or an overloaded server. +* **TLS**: If your page is loading resources securely over TLS, this is the time it took to set up that connection. +* **Wait**: The time it took for the response generated by the server to be received by the browser. +A lengthy Waiting (TTFB) time could indicate server-side issues. +* **Receive**: The time it took to receive the response from the server, +which can be impacted by the size of the response. +* **Send**: The time spent sending the request data to the server. + +Next to each network timing metric, there's an icon that indicates whether the value is +higher (image:images/icons/sortUp.svg[Arrow up]), +lower (image:images/icons/sortDown.svg[Arrow down]), +or the same (image:images/icons/minus.svg[Minus]) +compared to the median of all runs in the last 24 hours. +Hover over the icon to see more details in a tooltip. + +// What you might do with this info + +This gives you an overview of how much time is spent (and how that time is spent) loading resources. +This high-level information may not help you diagnose a problem on its own, but it could act as a +signal to look at more granular information in the <<synthetics-analyze-one-step-network,Network requests>> section. + +// Screenshot of the viz + +[role="screenshot"] +image::images/synthetics-analyze-one-step-timing.png[Network timing visualization for one step in a browser monitor in the Synthetics UI] + +[discrete] +[[synthetics-analyze-one-step-metrics]] +==== Metrics + +// What info it includes + +The **Metrics** visualization gives you insight into the performance of the web page visited in +the step and what a user would experience when going through the current step. +Metrics include: + +* **First contentful paint (FCP)** focuses on the initial rendering and measures the time from +when the page starts loading to when any part of the page's content is displayed on the screen. +* **Largest contentful paint (LCP)** measures loading performance. To provide a good user experience, +LCP should occur within 2.5 seconds of when the page first starts loading. +* **Cumulative layout shift (CLS)** measures visual stability. To provide a good user experience, +pages should maintain a CLS of less than 0.1. +* **`DOMContentLoaded` event (DCL)** is triggered when the browser completes parsing the document. +Helpful when there are multiple listeners, or logic is executed: +`domContentLoadedEventEnd - domContentLoadedEventStart`. +* **Transfer size** represents the size of the fetched resource. The size includes the response header +fields plus the response payload body. + +[NOTE] +==== +Largest contentful paint and Cumulative layout shift are part of Google's +https://web.dev/vitals/[Core Web Vitals], an initiative that introduces a set of metrics +that help categorize good and bad sites by quantifying the real-world user experience. +==== + +Next to each metric, there's an icon that indicates whether the value is +higher (image:images/icons/sortUp.svg[Arrow up]), +lower (image:images/icons/sortDown.svg[Arrow down]), +or the same (image:images/icons/minus.svg[Minus]) +compared to all runs over the last 24 hours. +Hover over the icon to see more details in a tooltip. + +// Screenshot of the viz + +[role="screenshot"] +image::images/synthetics-analyze-one-step-metrics.png[Metrics visualization for one step in a browser monitor in the Synthetics UI] + +[discrete] +[[synthetics-analyze-one-step-object]] +==== Object weight and count + +// What info it includes + +The **Object weight** visualization shows the cumulative size of downloaded resources by type, +and **Object count** shows the number of individual resources by type. + +// What you might do with this info + +This provides a different kind of analysis. +For example, you might have a large number of JavaScript files, +each of which will need a separate download, but they may be collectively small. +This could help you identify an opportunity to improve efficiency by combining multiple files into one. + +// Screenshot of the viz + +[role="screenshot"] +image::images/synthetics-analyze-one-step-object.png[Object visualization for one step in a browser monitor in the Synthetics UI] + +[discrete] +[[synthetics-analyze-one-step-network]] +==== Network requests + +// What info it includes + +The **Network requests** visualization is a waterfall chart that shows every request +the page made when a user executed it. +Each line in the chart represents an HTTP network request and helps you quickly identify +what resources are taking the longest to load and in what order they are loading. + +The colored bars within each line indicate the time spent per resource. +Each color represents a different part of that resource's loading process +(as defined in the <<synthetics-analyze-one-step-timing,Timing>> section above) and +includes the time spent downloading content for specific +Multipurpose Internet Mail Extensions (MIME) types: +HTML, JS, CSS, Media, Font, XHR, and Other. + +Understanding each phase of a request can help you improve your site's speed by +reducing the time spent in each phase. + +// Screenshot of the viz + +[role="screenshot"] +image::images/synthetics-analyze-one-step-network.png[Network requests waterfall visualization for one step in a browser monitor in the Synthetics UI] + +Without leaving the waterfall chart, you can view data points relating to each resource: +resource details, request headers, response headers, and certificate headers. +On the waterfall chart, select a resource name, or any part of each row, +to display the resource details overlay. + +For additional analysis, whether to check the content of a CSS file or to view a specific image, +click the image:images/icons/popout.svg[Popout] icon located beside each resource, +to view its content in a new tab. + +You can also navigate between steps and checks at the top of the page to +view the corresponding waterfall charts. + +// [discrete] + +// <span id="synthetics-analyze-anomalies"></span> + +// = Anomalies + +// [discrete] + +// <span id="synthetics-analyze-alerts"></span> + +// = Alerts diff --git a/docs/en/serverless/synthetics/synthetics-command-reference.asciidoc b/docs/en/serverless/synthetics/synthetics-command-reference.asciidoc new file mode 100644 index 0000000000..446562fd36 --- /dev/null +++ b/docs/en/serverless/synthetics/synthetics-command-reference.asciidoc @@ -0,0 +1,325 @@ +[[synthetics-command-reference]] += Use the Synthetics CLI + +++++ +<titleabbrev>Use the CLI</titleabbrev> +++++ + +preview:[] + +[discrete] +[[elastic-synthetics-command]] +== `@elastic/synthetics` + +Elastic uses the https://www.npmjs.com/package/@elastic/synthetics[@elastic/synthetics[@elastic/synthetics] +library to run synthetic browser tests and report the test results. +The library also provides a CLI to help you scaffold, develop/run tests locally, and push tests to Elastic. + +[source,sh] +---- +npx @elastic/synthetics [options] [files] [dir] +---- + +You will not need to use most command line flags. +However, there are some you may find useful: + +`--match <string>`:: +Run tests with a name or tags that match the given glob pattern. + +`--tags Array<string>`:: +Run tests with the given tags that match the given glob pattern. + +`--pattern <string>`:: +RegExp pattern to match journey files in the current working directory. Defaults +to `/*.journey.(ts|js)$/`, which matches files ending with `.journey.ts` or `.journey.js`. + +`--params <jsonstring>`:: +JSON object that defines any variables your tests require. +Read more in <<synthetics-params-secrets,Work with params and secrets>>. ++ +Params passed will be merged with params defined in your +<<synthetics-configuration-params,`synthetics.config.js` file>>. +Params defined via the CLI take precedence. + +`--playwright-options <jsonstring>`:: +JSON object to pass in custom Playwright options for the agent. +For more details on relevant Playwright options, refer to the +<<synthetics-configuration-playwright-options,the configuration docs>>. ++ +Options passed will be merged with Playwright options defined in your +<<synthetics-configuration-playwright-options,`synthetics.config.js` file>>. +Options defined via the CLI take precedence. + +`--screenshots <on|off|only-on-failure>`:: +Control whether or not to capture screenshots at the end of each step. +Options include `'on'`, `'off'`, or `'only-on-failure'`. ++ +This can also be set in the configuration file using +<<synthetics-configuration-monitor,`monitor.screenshot`>>. +The value defined via the CLI will take precedence. + +`-c, --config <string>`:: +Path to the configuration file. By default, test runner looks for a +`synthetics.config.(js|ts)` file in the current directory. Synthetics +configuration provides options to configure how your tests are run and pushed to +Elastic. Allowed options are described in the <<synthetics-configuration,configuration file>> + +`--reporter <json|junit|buildkite-cli|default>`:: +One of `json`, `junit`, `buildkite-cli`, or `default`. Use the JUnit or Buildkite +reporter to provide easily parsed output to CI systems. + +`--inline`:: +Instead of reading from a file, `cat` inline scripted journeys and pipe them through `stdin`. +For example, `cat path/to/file.js | npx @elastic/synthetics --inline`. + +`--no-throttling`:: +Does not apply throttling. ++ +Throttling can also be disabled in the configuration file using +<<synthetics-configuration-monitor,`monitor.throttling`>>. +The value defined via the CLI will take precedence. ++ +[NOTE] +==== +Network throttling for browser based monitors is disabled. +See this https://github.com/elastic/synthetics/blob/main/docs/throttling.md[documention] for more details. +==== + +`--no-headless`:: +Runs with the browser in headful mode. ++ +This is the same as setting https://playwright.dev/docs/api/class-testoptions#test-options-headless[Playwright's `headless` option] to `false` by running `--playwright-options '{"headless": false}'`. ++ +[NOTE] +==== +Headful mode should only be used locally to see the browser and interact with DOM elements directly for testing purposes. Do not attempt to run in headful mode when running through Elastic's global managed testing infrastructure or {private-location}s as this is not supported. +==== + +`-h, --help`:: +Shows help for the `npx @elastic/synthetics` command. + +[NOTE] +==== +The `--pattern`, `--tags`, and `--match` flags for filtering are only supported when you +run synthetic tests locally or push them to Elastic. Filtering is _not_ supported in any other subcommands +like `init` and `locations`. +==== + +[NOTE] +==== +For debugging synthetic tests locally, you can set an environment variable, +`DEBUG=synthetics npx @elastic/synthetics`, to capture Synthetics agent logs. +==== + +[discrete] +[[elastic-synthetics-init-command]] +== `@elastic/synthetics init` + +Scaffold a new Synthetics project using Elastic Synthetics. + +This will create a template Node.js project that includes the synthetics agent, required dependencies, +a synthetics configuration file, and example browser and lightweight monitor files. +These files can be edited and then pushed to Elastic to create monitors. + +[source,sh] +---- +npx @elastic/synthetics init <name-of-synthetics-project> +---- + +Read more about what's included in a template Synthetics project in <<synthetics-get-started-project-create-a-synthetics-project,Create a Synthetics project>>. + +[discrete] +[[elastic-synthetics-push-command]] +== `@elastic/synthetics push` + +Create monitors in by using your local journeys. By default, running +`push` command will use the `project` settings field from the `synthetics.config.ts` +file, which is set up using the `init` command. However, you can override these +settings using the CLI flags. + +[source,sh] +---- +SYNTHETICS_API_KEY=<api-key> npx @elastic/synthetics push --url <kibana-url> --id <id|name> +---- + +[NOTE] +==== +The `push` command includes interactive prompts to prevent you from accidentally deleting or duplicating monitors. +You will see a prompt when: + +* You `push` a project that used to contain one or more monitors but either no longer +contains previously running monitors or has any monitors. +Select `yes` to delete the monitors associated with the project ID being pushed. +* You `push` a Synthetics project that's already been pushed using one Synthetics project ID and then try to `push` +it using a _different_ ID. +Select `yes` to create duplicates of all monitors in the project. +You can set `DEBUG=synthetics` environment variable to capture the deleted monitors. +==== + +[NOTE] +==== +If the journey contains external NPM packages other than the `@elastic/synthetics`, +those packages will be bundled along with the journey code when the `push` command is invoked. +However there are some limitations when using external packages: + +* Bundled journeys after compression should not be more than 1500 Kilobytes. +* Native node modules will not work as expected due to platform inconsistency. +* Uploading files in journey scripts(via locator.setInputFiles) is not supported. +==== + +`--auth <string>`:: +API key used for authentication. You can also set the API key via the `SYNTHETICS_API_KEY` environment variable. ++ +To create an API key, you must be logged in as a user with +<<synthetics-feature-roles,Editor>> access. + +`--id <string>`:: +A unique id associated with your Synthetics project. +It will be used for logically grouping monitors. ++ +If you used <<elastic-synthetics-init-command,`init` to create a Synthetics project>>, this is the `<name-of-synthetics-project>` you specified. ++ +This can also be set in the configuration file using +<<synthetics-configuration-project,`project.id`>>. +The value defined via the CLI will take precedence. + +`--url <string>`:: +The URL for the Observability project to which you want to upload the monitors. ++ +This can also be set in the configuration file using +<<synthetics-configuration-project,`project.url`>>. +The value defined via the CLI will take precedence. + +`--schedule <number>`:: +The interval (in minutes) at which the monitor should run. ++ +This can also be set in the configuration file using +<<synthetics-configuration-monitor,`monitor.schedule`>>. +The value defined via the CLI will take precedence. + +https://github.com/elastic/synthetics/blob/{synthetics_version}/src/locations/public-locations.ts#L28-L37[`--locations Array<SyntheticsLocationsType>`]:: +Where to deploy the monitor. Monitors can be deployed in multiple locations so that you can detect differences in availability and response times across those locations. ++ +To list available locations, refer to <<elastic-synthetics-locations-command,`@elastic/synthetics locations`>>. ++ +This can also be set in the configuration file using +<<synthetics-configuration-monitor,`monitor.locations` in the configuration file>>. +The value defined via the CLI will take precedence. + +`--private-locations Array<string>`:: +The <<synthetics-private-location,{private-location}s>> to which the monitors will be deployed. These {private-location}s refer to locations hosted and managed by you, whereas +`locations` are hosted by Elastic. You can specify a {private-location} using the location's name. ++ +To list available {private-location}s, refer to <<elastic-synthetics-locations-command,`@elastic/synthetics locations`>>. ++ +This can also be set in the configuration file using +<<synthetics-configuration-monitor,`monitor.privateLocations` in the configuration file>>. +The value defined via the CLI will take precedence. + +`--fields <string>`:: +A list of key-value pairs that will be sent with each monitor event. +The `fields` are appended to {es} documents as `labels`, +and those labels are displayed in {kib} in the _Monitor details_ panel in the <<synthetics-analyze-individual-monitors-overview,individual monitor's _Overview_ tab>>. ++ +Example: `--fields '{ "foo": bar", "team": "synthetics" }'` ++ +This can also be set in the configuration file using <<synthetics-configuration-monitor,the `monitor.fields` option>>. +The value defined via the CLI will take precedence. + +`--yes`:: +The `push` command includes interactive prompts to prevent you from accidentally deleting or duplicating monitors. +If running the CLI non-interactively, you can override these prompts using the `--yes` option. +When the `--yes` option is passed to `push`: ++ +* If you `push` a Synthetics project that used to contain one or more monitors but no longer contains any monitors, +all monitors associated with the Synthetics project ID being pushed will be deleted. +* If you `push` a Synthetics project that's already been pushed using one Synthetics project ID and then try to `push` +it using a _different_ ID, it will create duplicates of all monitors in the Synthetics project. + +[discrete] +[[synthetics-command-reference-tag-monitors]] +== Tag monitors + +Synthetics journeys can be tagged with one or more tags. Use tags to +filter journeys when running tests locally or pushing them to Elastic. + +To add tags to a single journey, add the `tags` parameter to the `journey` function or +use the `monitor.use` method. + +[source,js] +---- +import {journey, monitor} from "@elastic/synthetics"; +journey({name: "example journey", tags: ["env:qa"] }, ({ page }) => { + monitor.use({ + tags: ["env:qa"] + }) + // Add steps here +}); +---- + +For lightweight monitors, use the `tags` field in the yaml configuration file. + +[source,yaml] +---- +name: example monitor +tags: + - env:qa +---- + +To apply tags to all browser and lightweight monitors, configure using the `monitor.tags` field in the `synthetics.config.ts` file. + +[discrete] +[[synthetics-command-reference-filter-monitors]] +== Filter monitors + +When running the `npx @elastic/synthetics push` command, you can filter the monitors that are pushed to Elastic using the following flags: + +`--tags Array<string>`:: +Push monitors with the given tags that match the glob pattern. + +`--match <string>`:: +Push monitors with a name or tags that match the glob pattern. + +`--pattern <string>`:: +RegExp pattern to match the journey files in the current working directory. +Defaults to `/*.journey.(ts|js)$/` for browser monitors and `/.(yml|yaml)$/` for +lightweight monitors. + +You can combine these techniques and push the monitors to different projects based on the tags by using multiple configuration files. + +[source,sh] +---- +npx @elastic/synthetics push --config synthetics.qa.config.ts --tags env:qa +npx @elastic/synthetics push --config synthetics.prod.config.ts --tags env:prod +---- + +[discrete] +[[elastic-synthetics-locations-command]] +== `@elastic/synthetics locations` + +List all available locations for running synthetics monitors. + +[source,sh] +---- +npx @elastic/synthetics locations --url <observability-project-host> --auth <api-key> +---- + +Run `npx @elastic/synthetics locations` with no flags to list all the available global locations managed by Elastic for running synthetics monitors. + +To list both locations on Elastic's global managed infrastructure and {private-location}s, include: + +`--url <string>`:: +The URL for the Observability project from which to fetch all available public and {private-location}s. + +`--auth <string>`:: +API key used for authentication. + +//// +/* <DocCallOut title="Note"> +If an administrator has disabled Elastic managed locations for the role you are assigned +and you do _not_ include `--url` and `--auth`, all global locations managed by Elastic will be listed. +However, you will not be able to push to these locations with your API key and will see an error: +_You don't have permission to use Elastic managed global locations_. For more details, refer to the +<DocLink slug="/serverless/observability/synthetics-troubleshooting" section="you-do-not-have-permission-to-use-elastic-managed-locations">troubleshooting docs</DocLink>. +</DocCallOut> */ +//// diff --git a/docs/en/serverless/synthetics/synthetics-configuration.asciidoc b/docs/en/serverless/synthetics/synthetics-configuration.asciidoc new file mode 100644 index 0000000000..25f22fb8ce --- /dev/null +++ b/docs/en/serverless/synthetics/synthetics-configuration.asciidoc @@ -0,0 +1,211 @@ +[[synthetics-configuration]] += Configure a Synthetics project + +preview:[] + +Synthetic tests support the configuration of dynamic parameters that can be +used in Synthetics projects. In addition, the Synthetics agent, which is built on top +of Playwright, supports configuring browser and context options that are available +in Playwright-specific methods, for example, `ignoreHTTPSErrors`, `extraHTTPHeaders`, and `viewport`. + +Create a `synthetics.config.js` or `synthetics.config.ts` file in the root of the +Synthetics project and specify the options. For example: + +[source,ts] +---- +import type { SyntheticsConfig } from '@elastic/synthetics'; + +export default env => { + const config: SyntheticsConfig = { + params: { + url: 'https://www.elastic.co', + }, + playwrightOptions: { + ignoreHTTPSErrors: false, + }, + /** + * Configure global monitor settings + */ + monitor: { + schedule: 10, + locations: [ 'us_east' ], + }, + /** + * Synthetic project monitors settings + */ + project: { + id: 'my-synthetics-project', + url: 'https://abc123', + }, + }; + if (env !== 'development') { + /** + * Override configuration specific to environment + * For example, config.params.url = "" + */ + } + return config; +}; +---- + +[NOTE] +==== +`env` in the example above is the environment you are pushing from +_not_ the environment where monitors will run. In other words, `env` +corresponds to the configured `NODE_ENV`. +==== + +The configuration file can either export an object, or a function that when +called should return the generated configuration. To know more about configuring +the tests based on environments, look at the <<synthetics-dynamic-configs,dynamic configuration>> documentation. + +[discrete] +[[synthetics-configuration-params]] +== `params` + +A JSON object that defines any variables your tests require. +Read more in <<synthetics-params-secrets,Work with params and secrets>>. + +[discrete] +[[synthetics-configuration-playwright-options]] +== `playwrightOptions` + +For all available options, refer to the https://playwright.dev/docs/test-configuration[Playwright documentation]. + +[NOTE] +==== +Do not attempt to run in headful mode (using `headless:false`) when running through Elastic's global managed testing infrastructure or Private Locations as this is not supported. +==== + +Below are details on a few Playwright options that are particularly relevant to Elastic Synthetics including TLS client authentication, timeouts, timezones, and device emulation. + +[discrete] +[[synthetics-configuration-playwright-options-client-certificates]] +=== TLS client authentication + +To enable TLS client authentication, set the https://playwright.dev/docs/api/class-testoptions#test-options-client-certificates[`clientCertificates`] option in the configuration file: + +[NOTE] +==== +Path-based options `{certPath, keyPath, pfxPath}` are only supported on Private Locations, defer to in-memory alternatives `{cert, key, pfx}` when running on locations hosted by Elastic. +==== + +[source,js] +---- +playwrightOptions: { + clientCertificates: [ + { + origin: 'https://example.com', + certPath: './cert.pem', + keyPath: './key.pem', + passphrase: 'mysecretpassword', + }, + { + origin: 'https://example.com', + cert: Buffer.from("-----BEGIN CERTIFICATE-----\n..."), + key: Buffer.from("-----BEGIN RSA PRIVATE KEY-----\n..."), + passphrase: 'mysecretpassword', + } + ], +} +---- + +[TIP] +==== +When using Synthetics monitor UI, `cert`, `key` and `pfx` can simply be specified using a string literal: + +[source,js] +---- +clientCertificates: [ + { + cert: "-----BEGIN CERTIFICATE-----\n...", + // Not cert: Buffer.from("-----BEGIN CERTIFICATE-----\n..."), + } +], +---- +==== + +[discrete] +[[synthetics-configuration-playwright-options-timeouts]] +=== Timeouts + +Playwright has two types of timeouts that are used in Elastic Synthetics: +https://playwright.dev/docs/test-timeouts#action-and-navigation-timeouts[action and navigation timeouts]. + +Elastic Synthetics uses a default action and navigation timeout of 50 seconds. +You can override this default using https://playwright.dev/docs/api/class-testoptions#test-options-action-timeout[`actionTimeout`] and https://playwright.dev/docs/api/class-testoptions#test-options-navigation-timeout[`navigationTimeout`] +in `playwrightOptions`. + +[discrete] +[[synthetics-configuration-playwright-options-timezones]] +=== Timezones and locales + +The Elastic global managed testing infrastructure does not currently set the timezone. +For {private-location}s, the monitors will use the timezone of the host machine running +the {agent}. This is not always desirable if you want to test how a web application +behaves across different timezones. To specify what timezone to use when the monitor runs, +you can use `playwrightOptions` on a per monitor or global basis. + +To use a timezone and/or locale for all monitors in the Synthetics project, set +https://playwright.dev/docs/emulation#locale%2D%2Dtimezone[`locale` and/or `timezoneId`] +in the configuration file: + +[source,js] +---- +playwrightOptions: { + locale: 'en-AU', + timezoneId: 'Australia/Brisbane', +} +---- + +To use a timezone and/or locale for a _specific_ monitor, add these options to a +journey using <<synthetics-monitor-use,`monitor.use`>>. + +[discrete] +[[synthetics-config-device-emulation]] +=== Device emulation + +Users can emulate a mobile device using the configuration file. +The example configuration below runs tests in "Pixel 5" emulation mode. + +[source,js] +---- +import { SyntheticsConfig } from "@elastic/synthetics" +import { devices } from "playwright-chromium" + +const config: SyntheticsConfig = { + playwrightOptions: { + ...devices['Pixel 5'] + } +} + +export default config; +---- + +[discrete] +[[synthetics-configuration-project]] +== `project` + +Information about the Synthetics project. + +`id` (`string`):: +A unique id associated with your Synthetics project. +It will be used for logically grouping monitors. ++ +If you used <<elastic-synthetics-init-command,`init` to create a Synthetics project>>, this is the `<name-of-synthetics-project>` you specified. + +`url` (`string`):: +The URL for the Observability project to which you want to upload the monitors. + +[discrete] +[[synthetics-configuration-monitor]] +== `monitor` + +Default values to be applied to _all_ monitors when using the <<elastic-synthetics-push-command,`@elastic/synthetics` `push` command>>. + +include::../transclusion/synthetics/configuration/monitor-config-options.asciidoc[] + +For information on configuring monitors individually, refer to: + +* <<synthetics-monitor-use,Configure individual browser monitors>> for browser monitors +* <<synthetics-lightweight,Configure lightweight monitors>> for lightweight monitors diff --git a/docs/en/serverless/synthetics/synthetics-create-test.asciidoc b/docs/en/serverless/synthetics/synthetics-create-test.asciidoc new file mode 100644 index 0000000000..7cb5fe0eef --- /dev/null +++ b/docs/en/serverless/synthetics/synthetics-create-test.asciidoc @@ -0,0 +1,443 @@ +[[synthetics-create-test]] += Write a synthetic test + +preview:[] + +After <<synthetics-get-started-project,setting up a Synthetics project>>, you can start writing synthetic tests that check critical actions and requests that an end-user might make +on your site. + +[discrete] +[[synthetics-syntax]] +== Syntax overview + +To write synthetic tests for your application, you'll need to know basic JavaScript and +https://playwright.dev/[Playwright] syntax. + +[TIP] +==== +https://playwright.dev/[Playwright] is a browser testing library developed by Microsoft. +It's fast, reliable, and features a modern API that automatically waits for page elements to be ready. +==== + +The synthetics agent exposes an API for creating and running tests, including: + +|=== +| | + +| `journey` +a| Tests one discrete unit of functionality. Takes two parameters: a `name` (string) and a `callback` (function). + +Learn more in <<synthetics-create-journey,Create a journey>>. + +| `step` +a| Actions within a journey that should be completed in a specific order. Takes two parameters: a `name` (string) and a `callback` (function). + +Learn more in <<synthetics-create-step,Add steps>>. + +| `expect` +a| Check that a value meets a specific condition. There are several supported checks. + +Learn more in <<synthetics-make-assertions,Make assertions>>. + +| `beforeAll` +a| Runs a provided function once, before any `journey` runs. If the provided function is a promise, the runner will wait for the promise to resolve before invoking the `journey`. Takes one parameter: a `callback` (function). + +Learn more in <<before-after,Set up and remove a global state>>. + +| `before` +a| Runs a provided function before a single `journey` runs. Takes one parameter: a `callback` (function). + +Learn more in <<before-after,Set up and remove a global state>>. + +| `afterAll` +a| Runs a provided function once, after all the `journey` runs have completed. Takes one parameter: a `callback` (function). + +Learn more in <<before-after,Set up and remove a global state>>. + +| `after` +a| Runs a provided function after a single `journey` has completed. Takes one parameter: a `callback` (function). + +Learn more in <<before-after,Set up and remove a global state>>. + +| `monitor` +a| The `monitor.use` method allows you to determine a monitor's configuration on a journey-by-journey basis. If you want two journeys to create monitors with different intervals, for example, you should call `monitor.use` in each of them and set the `schedule` property to different values in each. Note that this is only relevant when using the `push` command to create monitors in your Observability project. + +Learn more in <<synthetics-monitor-use,Configure individual browser monitors>>. +|=== + +[discrete] +[[synthetics-create-journey]] +== Create a journey + +Create a new file using the `.journey.ts` or `.journey.js` file extension or edit one of the example journey files. + +A _journey_ tests one discrete unit of functionality. +For example, logging into a website, adding something to a cart, or joining a mailing list. + +The journey function takes two parameters: a `name` and a `callback`. +The `name` helps you identify an individual journey. +The `callback` argument is a function that encapsulates what the journey does. +The callback provides access to fresh Playwright `page`, `params`, `browser`, and `context` instances. + +[source,js] +---- +journey('Journey name', ({ page, browser, context, params, request }) => { + // Add steps here +}); +---- + +[discrete] +[[synthetics-journey-ref]] +=== Arguments + +|=== +| | + +| **`name`** (_string_) +| A user-defined string to describe the journey. + +| **`callback`** (_function_) +a| A function where you will add steps. + +**Instances**: + +`page`:: +A https://playwright.dev/docs/api/class-page[page] object from Playwright +that lets you control the browser's current page. + +`browser`:: +A {book['playwright-api-docs']}[browser] object created by Playwright. + +`context`:: +A https://playwright.dev/docs/api/class-browsercontext[browser context] +that doesn't share cookies or cache with other browser contexts. + +`params`:: +User-defined variables that allow you to invoke the Synthetics suite with custom parameters. +For example, if you want to use a different homepage depending on the `env` +(`localhost` for `dev` and a URL for `prod`). See <<synthetics-params-secrets,Work with params and secrets>> +for more information. + +`request`:: +A request object that can be used to make API requests independently of the browser +interactions. For example, to get authentication credentials or tokens in service of a +browser-based test. See <<synthetics-request-param,Make API requests>> for more information. +|=== + +[discrete] +[[synthetics-create-step]] +== Add steps + +A journey consists of one or more _steps_. Steps are actions that should be completed in a specific order. +Steps are displayed individually in the Synthetics UI along with screenshots for convenient debugging and error tracking. + +A basic two-step journey would look like this: + +[source,js] +---- +journey('Journey name', ({ page, browser, client, params, request }) => { + step('Step 1 name', () => { + // Do something here + }); + step('Step 2 name', () => { + // Do something else here + }); +}); +---- + +Steps can be as simple or complex as you need them to be. +For example, a basic first step might load a web page: + +[source,js] +---- +step('Load the demo page', () => { + await page.goto('https://elastic.github.io/synthetics-demo/'); <1> +}); +---- + +<1> Go to the https://playwright.dev/docs/api/class-page#page-goto[`page.goto` reference] for more information. + +[discrete] +[[synthetics-step-ref]] +=== Arguments + +|=== +| | + +| **`name`** + +(_string_) +| A user-defined string to describe the journey. + +| **`callback`** (_function_) +| A function where you simulate user workflows using Synthetics and <<synthetics-playwright,Playwright>> syntax. +|=== + +[NOTE] +==== +If you want to generate code by interacting with a web page directly, you can use the **Synthetics Recorder**. + +The recorder launches a https://www.chromium.org/Home/[Chromium browser] that will listen to each interaction you have with the web page and record them internally using Playwright. +When you're done interacting with the browser, the recorder converts the recorded actions into JavaScript code that you can use with Elastic Synthetics or {heartbeat}. + +For more details on getting started with the Synthetics Recorder, refer to <<synthetics-recorder,Use the Synthetics Recorder>>. +==== + +[discrete] +[[synthetics-playwright]] +=== Playwright syntax + +Inside the callback for each step, you'll likely use a lot of Playwright syntax. +Use Playwright to simulate and validate user workflows including: + +* Interacting with the https://playwright.dev/docs/api/class-browser[browser] +or the current https://playwright.dev/docs/api/class-page[page] (like in the example above). +* Finding elements on a web page using https://playwright.dev/docs/api/class-locator[locators]. +* Simulating https://playwright.dev/docs/api/class-mouse[mouse], +https://playwright.dev/docs/api/class-touchscreen[touch], or +https://playwright.dev/docs/api/class-keyboard[keyboard] events. +* Making assertions using https://playwright.dev/docs/test-assertions[`@playwright/test`'s `expect` function]. Read more in <<synthetics-make-assertions,Make assertions>>. + +Visit the https://playwright.dev/docs[Playwright documentation] for information. + +[NOTE] +==== +Do not attempt to run in headful mode (using `headless:false`) when running through Elastic's global managed testing infrastructure or Private Locations as this is not supported. +==== + +However, not all Playwright functionality should be used with Elastic Synthetics. +In some cases, there are alternatives to Playwright functionality built into the +Elastic Synthetics library. These alternatives are designed to work better for +synthetic monitoring. Do _not_ use Playwright syntax to: + +* **Make API requests.** Use Elastic Synthetic's `request` +parameter instead. Read more in <<synthetics-request-param,Make API requests>>. + +There is also some Playwright functionality that is not supported out-of-the-box +in Elastic Synthetics including: + +* https://playwright.dev/docs/api/class-video[Videos] +* The https://playwright.dev/docs/api/class-locatorassertions#locator-assertions-to-have-screenshot-1[`toHaveScreenshot`] and https://playwright.dev/docs/api/class-snapshotassertions[`toMatchSnapshot`] assertions + +[NOTE] +==== +Captures done programmatically via https://playwright.dev/docs/api/class-page#page-screenshot[`screenshot`] or https://playwright.dev/docs/api/class-page#page-video[`video`] are not stored and are not shown in the Synthetics application. Providing a `path` will likely make the monitor fail due to missing permissions to write local files. +==== + +[discrete] +[[synthetics-make-assertions]] +== Make assertions + +A more complex `step` might wait for a page element to be selected +and then make sure that it matches an expected value. + +Elastic Synthetics uses `@playwright/test`'s `expect` function to make assertions +and supports most https://playwright.dev/docs/test-assertions[Playwright assertions]. +Elastic Synthetics does _not_ support https://playwright.dev/docs/api/class-locatorassertions#locator-assertions-to-have-screenshot-1[`toHaveScreenshot`] +or any https://playwright.dev/docs/api/class-snapshotassertions[Snapshot Assertions]. + +For example, on a page using the following HTML: + +[source,html] +---- +<header class="header"> + <h1>todos</h1> + <input class="new-todo" + autofocus autocomplete="off" + placeholder="What needs to be done?"> +</header> +---- + +You can verify that the `input` element with class `new-todo` has the expected `placeholder` value +(the hint text for `input` elements) with the following test: + +[source,js] +---- +step('Assert placeholder text', async () => { + const input = await page.locator('input.new-todo'); <1> + expect(await input.getAttribute('placeholder')).toBe( + 'What needs to be done?' + ); <2> +}); +---- + +<1> Find the `input` element with class `new-todo`. + +<2> Use the assertion library provided by the Synthetics agent to check that +the value of the `placeholder` attribute matches a specific string. + +[discrete] +[[synthetics-request-param]] +== Make API requests + +You can use the `request` parameter to make API requests independently of browser interactions. +For example, you could retrieve a token from an HTTP endpoint and use it in a subsequent webpage request. + +[source,js] +---- +step('make an API request', async () => { + const response = await request.get(params.url); + // Do something with the response +}) +---- + +The Elastic Synthetics `request` parameter is similar to https://playwright.dev/docs/api/class-apirequestcontext[other request objects that are exposed by Playwright] +with a few key differences: + +* The Elastic Synthetics `request` parameter comes built into the library so it doesn't +have to be imported separately, which reduces the amount of code needed and allows you to +make API requests in <<synthetics-get-started-ui-add-a-browser-monitor,inline journeys>>. +* The top level `request` object exposed by Elastic Synthetics has its own isolated cookie storage +unlike Playwright's `context.request` and `page.request`, which share cookie storage +with the corresponding https://playwright.dev/docs/api/class-browsercontext[`BrowserContext`]. +* If you want to control the creation of the `request` object, you can do so by passing options +via <<elastic-synthetics-command,`--playwright-options`>> or in the +<<synthetics-configuration,`synthetics.config.ts` file>>. + +For a full example that shows how to use the `request` object, refer to the https://github.com/elastic/synthetics-demo/blob/main/advanced-examples/journeys/api-requests.journey.ts[Elastic Synthetics demo repository]. + +[NOTE] +==== +The `request` parameter is not intended to be used for writing pure API tests. Instead, it is a way to support +writing plain HTTP requests in service of a browser-based test. +==== + +[discrete] +[[before-after]] +== Set up and remove a global state + +If there are any actions that should be done before or after journeys, you can use `before`, `beforeAll`, `after`, or `afterAll`. + +To set up global state or a server that will be used for a **single** `journey`, for example, +use a `before` hook. To perform this setup once before **all** journeys, use a `beforeAll` hook. + +[source,js] +---- +before(({ params }) => { + // Actions to take +}); + +beforeAll(({ params }) => { + // Actions to take +}); +---- + +You can clean up global state or close a server used for a **single** `journey` using an `after` hook. +To perform this cleanup once after all journeys, use an `afterAll` hook. + +[source,js] +---- +after(({ params }) => { + // Actions to take +}); + +afterAll(({ params }) => { + // Actions to take +}); +---- + +[discrete] +[[synthetics-import-packages]] +== Import NPM packages + +You can import and use other NPM packages inside journey code. +Refer to the example below using the external NPM package `is-positive`: + +[source,js] +---- +import { journey, step, monitor, expect } from '@elastic/synthetics'; +import isPositive from 'is-positive'; + +journey('bundle test', ({ page, params }) => { + step('check if positive', () => { + expect(isPositive(4)).toBe(true); + }); +}); +---- + +When you <<synthetics-get-started-project,create a monitor>> from a journey that uses +external NPM packages, those packages will be bundled along with the +journey code when the `push` command is invoked. + +However there are some limitations when using external packages: + +* Bundled journeys after compression should not be more than 800 Kilobytes. +* Native node modules will not work as expected due to platform inconsistency. + +[discrete] +[[synthetics-sample-test]] +== Sample synthetic test + +A complete example of a basic synthetic test might look like this: + +[source,js] +---- +import { journey, step, expect } from '@elastic/synthetics'; + +journey('Ensure placeholder is correct', ({ page }) => { + step('Load the demo page', async () => { + await page.goto('https://elastic.github.io/synthetics-demo/'); + }); + step('Assert placeholder text', async () => { + const placeholderValue = await page.getAttribute( + 'input.new-todo', + 'placeholder' + ); + expect(placeholderValue).toBe('What needs to be done?'); + }); +}); +---- + +You can find more complex examples in the https://github.com/elastic/synthetics-demo/blob/main/advanced-examples/journeys/api-requests.journey.ts[Elastic Synthetics demo repository]. + +[discrete] +[[synthetics-test-locally]] +== Test locally + +As you write journeys, you can run them locally to verify they work as expected. Then, you can create monitors to run your journeys at a regular interval. + +To test all the journeys in a Synthetics project, navigate into the directory containing the Synthetics project and run the journeys in there. +By default, the `@elastic/synthetics` runner will only run files matching the filename `*.journey.(ts|js)*`. + +[source,sh] +---- +# Run tests on the current directory. The dot `.` indicates +# that it should run all tests in the current directory. +npx @elastic/synthetics . +---- + +[discrete] +[[synthetics-test-inline]] +=== Test an inline monitor + +To test an inline monitor's journey locally, pipe the inline journey into the `npx @elastic/synthetics` command. + +Assume, for example, that your inline monitor includes the following code: + +[source,js] +---- +step('load homepage', async () => { + await page.goto('https://www.elastic.co'); +}); +step('hover over products menu', async () => { + await page.hover('css=[data-nav-item=products]'); +}); +---- + +To run that journey locally, you can save that code to a file and pipe the file's contents into `@elastic-synthetics`: + +[source,sh] +---- +cat path/to/sample.js | npx @elastic/synthetics --inline +---- + +And you'll get a response like the following: + +[source,sh] +---- +Journey: inline + ✓ Step: 'load homepage' succeeded (1831 ms) + ✓ Step: 'hover over products menu' succeeded (97 ms) + + 2 passed (2511 ms) +---- diff --git a/docs/en/serverless/synthetics/synthetics-create-test.mdx b/docs/en/serverless/synthetics/synthetics-create-test.mdx index 0d41da570d..146679ff54 100644 --- a/docs/en/serverless/synthetics/synthetics-create-test.mdx +++ b/docs/en/serverless/synthetics/synthetics-create-test.mdx @@ -287,7 +287,7 @@ in Elastic Synthetics including: * The [`toHaveScreenshot`](https://playwright.dev/docs/api/class-locatorassertions#locator-assertions-to-have-screenshot-1) and [`toMatchSnapshot`](https://playwright.dev/docs/api/class-snapshotassertions) assertions <DocCallOut title="Note"> - Captures done programmatically via https://playwright.dev/docs/api/class-page#page-screenshot[`screenshot`] or https://playwright.dev/docs/api/class-page#page-video[`video`] are not stored and are not shown in the Synthetics application. Providing a `path` will likely make the monitor fail due to missing permissions to write local files. + Captures done programmatically via [`screenshot`](https://playwright.dev/docs/api/class-page#page-screenshot) or [`video`](https://playwright.dev/docs/api/class-page#page-video) are not stored and are not shown in the Synthetics application. Providing a `path` will likely make the monitor fail due to missing permissions to write local files. </DocCallOut> <div id="synthetics-make-assertions"></div> diff --git a/docs/en/serverless/synthetics/synthetics-feature-roles.asciidoc b/docs/en/serverless/synthetics/synthetics-feature-roles.asciidoc new file mode 100644 index 0000000000..083d33541f --- /dev/null +++ b/docs/en/serverless/synthetics/synthetics-feature-roles.asciidoc @@ -0,0 +1,26 @@ +[[synthetics-feature-roles]] += Grant users access to secured resources + +preview:[] + +You can use role-based access control to grant users access to secured +resources. The roles that you set up depend on your organization's security +requirements and the minimum privileges required to use specific features. + +|=== +| Role | Synthetics functionality + +| Viewer +| * View and create visualizations that access Synthetics data. + +| Editor +| * Create, modify, and delete monitors. +* View and create visualizations that access Synthetics data. + +| Admin +| * Full access to project management, properties, and security privileges. +* Create, modify, and delete monitors. +* View and create visualizations that access Synthetics data. +|=== + +Read more about user roles in https://www.elastic.co/docs/current/serverless/general/assign-user-roles[Assign user roles and privileges]. diff --git a/docs/en/serverless/synthetics/synthetics-feature-roles.mdx b/docs/en/serverless/synthetics/synthetics-feature-roles.mdx index e2e804fcad..69b9109103 100644 --- a/docs/en/serverless/synthetics/synthetics-feature-roles.mdx +++ b/docs/en/serverless/synthetics/synthetics-feature-roles.mdx @@ -42,4 +42,4 @@ requirements and the minimum privileges required to use specific features. </DocRow> </DocTable> -Read more about user roles in <DocLink slug="/serverless/general/assign-user-roles" />. +Read more about user roles in <DocLink slug="/serverless/general/assign-user-roles">Assign user roles and privileges</DocLink>. diff --git a/docs/en/serverless/synthetics/synthetics-get-started-project.asciidoc b/docs/en/serverless/synthetics/synthetics-get-started-project.asciidoc new file mode 100644 index 0000000000..d57a7f0070 --- /dev/null +++ b/docs/en/serverless/synthetics/synthetics-get-started-project.asciidoc @@ -0,0 +1,223 @@ +[[synthetics-get-started-project]] += Create monitors with a Synthetics project + +++++ +<titleabbrev>Use a Synthetics project</titleabbrev> +++++ + +preview:[] + +A Synthetics project is the most powerful and sophisticated way to configure synthetic monitors. +A Synthetics project lets you define your infrastructure as code, more commonly known as IaaC or Git-ops. +With monitors created and managed in Synthetics projects, you organize your YAML configuration and +JavaScript- or TypeScript-defined monitors on the filesystem, use Git for version control, +and deploy via a CLI tool, usually executed on a CI/CD platform. + +image::images/synthetics-get-started-projects.png[Diagram showing which pieces of software are used to configure monitors, create monitors, and view results when using Synthetic project monitors.] + +This is one of <<synthetics-get-started,two approaches>> you can use to set up a synthetic monitor. + +[discrete] +[[synthetics-get-started-project-prerequisites]] +== Prerequisites + +You must be signed in as a user with <<synthetics-feature-roles,Editor>> access. + +// and Monitor Management must be enabled by an administrator as described in <DocLink slug="/serverless/observability/synthetics-feature-roles">Setup role</DocLink>. + +Working with a Synthetics project requires working with the Elastic Synthetics CLI tool, which +can be invoked via the `npx @elastic/synthetics` command. Before getting started +you'll need to: + +. Install https://nodejs.dev/en/[Node.js] +. Install the package: ++ +[source,sh] +---- +npm install -g @elastic/synthetics +---- +. Confirm your system is setup correctly: ++ +[source,sh] +---- +npx @elastic/synthetics -h +---- + +You should also decide where you want to run the monitors before getting started. +You can run monitors in Synthetics projects on one or both of the following: + +* **Elastic's global managed testing infrastructure**: +With Elastic's global managed testing infrastructure, you can create and run monitors in multiple +locations without having to manage your own infrastructure. +Elastic takes care of software updates and capacity planning for you. +* **{private-location}s**: {private-location}s allow you to run monitors from your own premises. +To use {private-location}s you must create a {private-location} before continuing. +For step-by-step instructions, refer to <<synthetics-private-location,Monitor resources on private networks>>. + +[discrete] +[[synthetics-get-started-project-create-a-synthetics-project]] +== Create a Synthetics project + +Start by creating your first Synthetics project. Run the command below to create a new +Synthetics project named `synthetic-project-test` in the current directory. + +[source,sh] +---- +npx @elastic/synthetics init synthetic-project-test +---- + +Then, follow the prompts on screen to set up the correct default variables for your Synthetics project. +When complete, set the `SYNTHETICS_API_KEY` environment variable in your terminal, which is used +to connect to your Observability project: + +. To generate an API key: ++ +.. Go to **Synthetics** in your Observability project. +.. Click **Settings**. +.. Switch to the **Project API Keys** tab. +.. Click **Generate Project API key**. ++ +[IMPORTANT] +==== +To generate a Project API key, you must be logged in as a user with <<synthetics-feature-roles,Editor>> access. +==== ++ +[role="screenshot"] +image::images/synthetics-monitor-management-api-key.png[Project API Keys tab in Synthetics settings] ++ +[NOTE] +==== +To use an API key to push to Elastic's global managed testing infrastructure, +the _Elastic managed locations enabled_ toggle must be on when generating the API key. +If the _Elastic managed locations enabled_ toggle is disabled, an administrator has restricted +access to Elastic's global managed testing infrastructure. + +// Read more in the <DocLink slug="/serverless/observability/synthetics-feature-roles" section="to-restrict-using-elastics-global-managed-infrastructure">writer role documentation</DocLink>. +==== +. Set the `SYNTHETICS_API_KEY` environment variable in your terminal. +You will most likely want to set this permanently. +This is done differently in https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_environment_variables?view=powershell-7.2#saving-changes-to-environment-variables[Powershell] and https://unix.stackexchange.com/a/117470[Bash]. + +Then, take a look at key files and directories inside your Synthetics project: + +* `journeys` is where you'll add `.ts` and `.js` files defining your browser monitors. +When you create a new Synthetics project, this directory will contain files defining sample monitors. +* `lightweight` is where you'll add `.yaml` files defining your lightweight monitors. +When you create a new Synthetics project, this directory will contain a file defining sample monitors. +* `synthetics.config.ts` contains settings for your Synthetics project. +When you create a new Synthetics project, it will contain some basic configuration options that you can customize later. ++ +[NOTE] +==== +The `synthetics.config.ts` in the sample Synthetics project uses a location on Elastic's global managed testing infrastructure. +Administrators can restrict access to Elastic's global managed testing infrastructure. +When you attempt to <<synthetics-get-started-project-test-and-connect-to-your-observability-project,`push` the sample monitors>>, +if you see an error stating that you don't have permission to use Elastic managed global locations, +refer to the <<synthetics-troubleshooting-no-locations,troubleshooting guide>> for guidance. +==== +* `package.json` contains NPM settings for your Synthetics project. Learn more in the https://docs.npmjs.com/about-packages-and-modules[NPM documentation]. +* `.github` contains sample workflow files to use with GitHub Actions. + +[discrete] +[[synthetics-get-started-project-examine-sample-monitors]] +== Examine sample monitors + +Inside the `lightweight` directory you'll find sample lightweight monitors. +Here's an example of a YAML file defining a lightweight monitor: + +[source,yml] +---- +# lightweight.yml +heartbeat.monitors: +- type: http + name: Todos Lightweight + id: todos-lightweight + urls: "https://elastic.github.io/synthetics-demo/" + schedule: '@every 1m' +---- + +For more details on lightweight monitor configuration options, +refer to <<synthetics-lightweight,Configure lightweight monitors>>. + +Inside the `journeys` directory you'll find sample browser monitors. +Here's an example of a TypeScript file defining a browser monitor: + +[source,ts] +---- +// example.journey.ts +import { journey, step, monitor, expect } from '@elastic/synthetics'; +journey('My Example Journey', ({ page, params }) => { + // Only relevant for the push command to create + // monitors in your Observability project + monitor.use({ + id: 'example-monitor', + schedule: 10, + }); + step('launch application', async () => { + await page.goto(params.url); + }); + step('assert title', async () => { + const header = await page.locator('h1'); + expect(await header.textContent()).toBe('todos'); + }); +}); +---- + +For more details on writing journeys and configuring browser monitors, +refer to <<synthetics-journeys,Scripting browser monitors>>. + +[discrete] +[[synthetics-get-started-project-test-and-connect-to-your-observability-project]] +== Test and connect to your Observability project + +While inside the Synthetics project directory you can do two things with the `npx @elastic/synthetics` command: + +* Test browser-based monitors locally. To run all journeys defined in `.ts` and `.js` files: ++ +[source,sh] +---- +npx @elastic/synthetics journeys +---- +* Push all monitor configurations to an Elastic Observability project. +Run the following command from inside your Synthetics project directory: ++ +[source,sh] +---- +npx @elastic/synthetics push --auth $SYNTHETICS_API_KEY --url <observability-project-url> +---- + +One monitor will appear in the Synthetics UI for each journey or +lightweight monitor, and you'll manage all monitors from your local environment. +For more details on using the `push` command, refer to <<elastic-synthetics-push-command,`@elastic/synthetics push`>>. + +[NOTE] +==== +If you've <<synthetics-private-location,added a {private-location}>>, +you can `push` to that {private-location}. + +To list available {private-location}s, +run the <<elastic-synthetics-locations-command,`elastic-synthetics locations` command>> +with the URL for the Observability project from which to fetch available locations. +==== + +[discrete] +[[synthetics-get-started-project-view-in-your-observability-project]] +== View in your Observability project + +Then, go to **Synthetics** in your Observability project. You should see your newly pushed monitors running. +You can also go to the **Management** tab to see the monitors' configuration settings. + +[NOTE] +==== +When a monitor is created or updated, the first run might not occur immediately, but the time it takes for the first run to occur will be less than the monitor's configured frequency. For example, if you create a monitor and configure it to run every 10 minutes, the first run will occur within 10 minutes of being created. After the first run, the monitor will begin running regularly based on the configured frequency. You can run a manual test if you want to see the results more quickly. +==== + +[discrete] +[[synthetics-get-started-project-next-steps]] +== Next steps + +Learn more about: + +* <<synthetics-lightweight,Configuring lightweight monitors>> +* <<synthetics-create-test,Configuring browser monitors>> +* <<synthetics-projects-best-practices,Implementing best practices for working with Synthetics projects>> diff --git a/docs/en/serverless/synthetics/synthetics-get-started-ui.asciidoc b/docs/en/serverless/synthetics/synthetics-get-started-ui.asciidoc new file mode 100644 index 0000000000..a6bf3f51a3 --- /dev/null +++ b/docs/en/serverless/synthetics/synthetics-get-started-ui.asciidoc @@ -0,0 +1,143 @@ +[[synthetics-get-started-ui]] += Create monitors in the Synthetics UI + +++++ +<titleabbrev>Use the Synthetics UI</titleabbrev> +++++ + +preview:[] + +You can create synthetic monitors directly in the UI by opening an Observability project and navigating to **Synthetics**. + +image::images/synthetics-get-started-ui.png[Diagram showing which pieces of software are used to configure monitors, create monitors, and view results when using Synthetics projects.] + +This is one of <<synthetics-get-started,two approaches>> you can use to set up a synthetic monitor. + +[discrete] +[[synthetics-get-started-ui-prerequisites]] +== Prerequisites + +You must be signed in as a user with <<synthetics-feature-roles,Editor>> access. + +// and Monitor Management must be enabled by an administrator as described in <DocLink slug="/serverless/observability/synthetics-feature-roles">Setup role</DocLink>. + +You should decide where you want to run the monitors before getting started. +You can run monitors on one or both of the following: + +* **Elastic's global managed testing infrastructure**: +With Elastic's global managed testing infrastructure, you can create and run monitors in multiple +locations without having to manage your own infrastructure. +Elastic takes care of software updates and capacity planning for you. +* **{private-location}s**: {private-location}s allow you to run monitors from your own premises. +To use {private-location}s you must create a {private-location} before continuing. +For step-by-step instructions, refer to <<synthetics-private-location,Monitor resources on private networks>>. + +include::../transclusion/synthetics/global-managed-paid-for.asciidoc[] + +[discrete] +[[synthetics-get-started-ui-add-a-lightweight-monitor]] +== Add a lightweight monitor + +To use the UI to add a lightweight monitor: + +. Go to **Synthetics** in your Observability project. +. Click **Create monitor**. +. Set the monitor type to **HTTP Ping**, **TCP Ping**, or **ICMP Ping**. +. In _Locations_, select one or more locations. ++ +[NOTE] +==== +If you don't see any locations listed, refer to the +<<synthetics-troubleshooting-no-locations,troubleshooting guide>> for guidance. +==== ++ +[NOTE] +==== +If you've <<synthetics-private-location,added a {private-location}>>, +you'll see your the {private-location} in the list of _Locations_. + +[role="screenshot"] +image::images/private-locations-monitor-locations.png[Screenshot of Monitor locations options including a {private-location}] +==== +. Set the _Frequency_, and configure the monitor as needed. +. Click **Advanced options** to see more ways to configure your monitor. +. (Optional) Click **Run test** to verify that the test is valid. +. Click **Create monitor**. ++ +[role="screenshot"] +image::images/synthetics-get-started-ui-lightweight.png[Synthetics Create monitor UI] + +[discrete] +[[synthetics-get-started-ui-add-a-browser-monitor]] +== Add a browser monitor + +You can also create a browser monitor in the UI using an **Inline script**. + +An inline script contains a single journey that you manage individually. +Inline scripts can be quick to set up, but can also be more difficult to manage. +Each browser monitor configured using an inline script can contain only _one_ journey, +which must be maintained directly in the UI. + +If you depend on external packages, have your journeys next to your code repository, +or want to embed and manage more than one journey from a single monitor configuration, +use a <<synthetics-get-started-project,Synthetics project>> instead. + +To use the UI to add a browser monitor: + +. Click **Create monitor**. +. Set the monitor type to **Multistep**. +. In _Locations_, select one or more locations. ++ +[NOTE] +==== +If you don't see any locations listed, refer to the +<<synthetics-troubleshooting-no-locations,troubleshooting guide>> for guidance. +==== +. Set the _Frequency_. +. Add steps to the **Script editor** code block directly. +The `journey` keyword isn't required, and variables like `page` and `params` will be part of your script's scope. +You cannot `import` any dependencies when using inline browser monitors. ++ +[role="screenshot"] +image::images/synthetics-ui-inline-script.png[Configure a synthetic monitor using an inline script] ++ +[NOTE] +==== +Alternatively, you can use the **Script recorder** option. +You can use the Elastic Synthetics Recorder to interact with a web page, export +journey code that reflects all the actions you took, and upload the results in the UI. +For more information, refer to <<synthetics-recorder,Use the Synthetics Recorder>>. +==== +. Click **Advanced options** to see more ways to configure your monitor. ++ +** Use **Data options** to add context to the data coming from your monitors. +** Use the **Synthetics agent options** to provide fine-tuned configuration for the synthetics agent. +Read more about available options in <<synthetics-command-reference,Use the Synthetics CLI>>. +. (Optional) Click **Run test** to verify that the test is valid. +. Click **Create monitor**. + +[discrete] +[[synthetics-get-started-ui-view-in-your-observability-project]] +== View in your Observability project + +Navigate to **Synthetics** in your Observability project, where you can see screenshots of each run, +set up alerts in case of test failures, and more. + +If a test does fail (shown as `down` in the Synthetics UI), you'll be able to view the step script that failed, +any errors, and a stack trace. +For more information, refer to <<synthetics-analyze-journeys,Analyze data from synthetic monitors>>. + +[NOTE] +==== +When a monitor is created or updated, the first run might not occur immediately, but the time it takes for the first run to occur will be less than the monitor's configured frequency. For example, if you create a monitor and configure it to run every 10 minutes, the first run will occur within 10 minutes of being created. After the first run, the monitor will begin running regularly based on the configured frequency. You can run a manual test if you want to see the results more quickly. +==== + +[discrete] +[[synthetics-get-started-ui-next-steps]] +== Next steps + +Learn more about: + +* <<synthetics-create-test,Writing user journeys>> to use as inline scripts +* Using the <<synthetics-recorder,Synthetics Recorder>> +* <<synthetics-lightweight,Configuring lightweight monitors>> diff --git a/docs/en/serverless/synthetics/synthetics-get-started.asciidoc b/docs/en/serverless/synthetics/synthetics-get-started.asciidoc new file mode 100644 index 0000000000..48daa73a99 --- /dev/null +++ b/docs/en/serverless/synthetics/synthetics-get-started.asciidoc @@ -0,0 +1,41 @@ +[[synthetics-get-started]] += Get started + +preview:[] + +To set up a synthetic monitor, you need to configure the monitor, run it, and send data back to Elastic. +After setup is complete, the data will be available in your Observability project to view, analyze, and alert on. + +There are two ways to set up a synthetic monitor: + +* Synthetics project +* The Synthetics UI + +Read more about each option below, and choose the approach that works best for you. + +[discrete] +[[synthetics-get-started-synthetics-project]] +== Synthetics project + +With a Synthetics project, you write tests in an external version-controlled Node.js project +using YAML for lightweight monitors and JavaScript or TypeScript for browser monitors. +Then, you use the `@elastic/synthetics` NPM library's `push` command to create +monitors in your Observability project. + +This approach works well if you want to create both browser monitors and lightweight +monitors. It also allows you to configure and update monitors using a GitOps workflow. + +Get started in <<synthetics-get-started-project,Create monitors in a Synthetics project>>. + +image::images/synthetics-get-started-projects.png[Diagram showing which pieces of software are used to configure monitors, create monitors, and view results when using Synthetics projects.] + +[discrete] +[[synthetics-get-started-synthetics-ui]] +== Synthetics UI + +You can create monitors directly in the user interface. +This approach works well if you want to create and manage your monitors in the browser. + +Get started in <<synthetics-get-started-ui,Create monitors in the Synthetics UI>>. + +image::images/synthetics-get-started-ui.png[Diagram showing which pieces of software are used to configure monitors, create monitors, and view results when using the Synthetics UI.] diff --git a/docs/en/serverless/synthetics/synthetics-intro.asciidoc b/docs/en/serverless/synthetics/synthetics-intro.asciidoc new file mode 100644 index 0000000000..596df3f415 --- /dev/null +++ b/docs/en/serverless/synthetics/synthetics-intro.asciidoc @@ -0,0 +1,66 @@ +[[monitor-synthetics]] += Synthetic monitoring + +preview:[] + +[NOTE] +==== +The Synthetics UI is for viewing result data from monitors created and managed +directly in the <<synthetics-get-started-ui,Synthetics UI>> or managed externally +using a <<synthetics-get-started-project,Synthetics project>>. +This can include both lightweight and browser-based monitors, and can include monitors +running from either Elastic's global managed testing infrastructure or from +<<synthetics-private-location,{private-location}s>>. +==== + +Synthetics periodically checks the status of your services and applications. +Monitor the availability of network endpoints and services using the following types of monitors: + +* <<monitor-synthetics-lightweight-https-tcp-and-icmp-monitors,Lightweight HTTP/S, TCP, and ICMP monitors>> +* <<monitor-synthetics-browser-monitors,Browser monitors>> + +[role="screenshot"] +image::images/synthetics-monitor-page.png[Synthetics UI] + +[discrete] +[[monitor-synthetics-lightweight-https-tcp-and-icmp-monitors]] +== Lightweight HTTP/S, TCP, and ICMP monitors + +You can monitor the status of network endpoints using the following lightweight checks: + +// lint ignore v4 v6 + +|=== +| | + +| **HTTP monitor** +| Monitor your website. The HTTP monitor checks to make sure specific endpoints return the correct status code and display the correct text. + +| **ICMP monitor** +| Check the availability of your hosts. The ICMP monitor uses ICMP (v4 and v6) Echo Requests to check the network reachability of the hosts you are pinging. This will tell you whether the host is available and connected to the network, but doesn't tell you if a service on the host is running or not. + +| **TCP monitor** +| Monitor the services running on your hosts. The TCP monitor checks individual ports to make sure the service is accessible and running. +|=== + +To set up your first monitor, refer to <<synthetics-get-started,Get started>>. + +[discrete] +[[monitor-synthetics-browser-monitors]] +== Browser monitors + +Real browser synthetic monitoring enables you to test critical actions and requests that an end-user would make +on your site at predefined intervals and in a controlled environment. +Synthetic monitoring extends traditional end-to-end testing techniques because it allows your tests to run continuously on the cloud. +The result is rich, consistent, and repeatable data that you can trend and alert on. + +For example, you can test popular user journeys, like logging in, adding items to a cart, and checking +out — actions that need to work for your users consistently. + +You can run an automated Synthetics project on a real Chromium browser and +view each synthetic monitoring journey in your Observability project side-by-side with your other monitors. + +Alerting helps you detect degraded performance or broken actions before your users do. +By receiving alerts early, you can fix issues before they impact your bottom line or customer experience. + +To set up your first monitor, refer to <<synthetics-get-started,Get started>>. diff --git a/docs/en/serverless/synthetics/synthetics-journeys.asciidoc b/docs/en/serverless/synthetics/synthetics-journeys.asciidoc new file mode 100644 index 0000000000..c17c18f510 --- /dev/null +++ b/docs/en/serverless/synthetics/synthetics-journeys.asciidoc @@ -0,0 +1,23 @@ +[[synthetics-journeys]] += Scripting browser monitors + +preview:[] + +Browser monitors are a type of synthetic monitor. +Synthetic monitoring extends traditional end-to-end testing techniques because it allows your tests to run continuously on the cloud. +With synthetic monitoring, you can assert that your application continues to work after a deployment by reusing +the same journeys that you used to validate the software on your machine. + +You can use synthetic monitors to detect bugs caused by invalid states you couldn't predict and didn't write tests for. +Synthetic monitors can also help you catch bugs in features that don't get much traffic by allowing you to periodically simulate users' actions. + +Start by learning the basics of synthetic monitoring, including how to: + +* <<synthetics-create-test,Write a synthetic test>> +* <<synthetics-test-locally,Test locally>> +* <<synthetics-monitor-use,Configure individual browser monitors>> +* <<synthetics-params-secrets,Work with params and secrets>> +* <<synthetics-recorder,Use the Synthetics Recorder>> + +[role="screenshot"] +image::images/synthetic-monitor-lifecycle.png[Diagram of the lifecycle of a synthetic monitor: write a test, test it locally, create a monitor, manage a monitor, delete a monitor] diff --git a/docs/en/serverless/synthetics/synthetics-lightweight.asciidoc b/docs/en/serverless/synthetics/synthetics-lightweight.asciidoc new file mode 100644 index 0000000000..8112f66d2b --- /dev/null +++ b/docs/en/serverless/synthetics/synthetics-lightweight.asciidoc @@ -0,0 +1,230 @@ +[[synthetics-lightweight]] += Configure lightweight monitors + +preview:[] + +Monitor the status of network endpoints using the following lightweight checks: + +* **HTTP**: Monitor your website. The HTTP monitor checks to make sure specific endpoints return the correct +status code and display the correct text. +* **ICMP**: Check the availability of your hosts. The ICMP monitor uses ICMP (v4 and v6) Echo +Requests to check the network reachability of the hosts you are pinging. This will tell you whether the +host is available and connected to the network, but doesn't tell you if a service on the host is running or +not. +* **TCP**: Monitor the services running on your hosts. The TCP monitor checks individual ports +to make sure the service is accessible and running. + +Lightweight monitors can be configured using either the <<synthetics-lightweight-ui,Synthetics UI>> +or a <<synthetics-lightweight-synthetics-project,Synthetics project>>. + +[discrete] +[[synthetics-lightweight-ui]] +== Synthetics UI + +To use the UI, go to **Synthetics** in your Observability project to create and configure monitors. +For step-by-step instructions, refer to <<synthetics-get-started-ui,Create monitors in the Synthetics UI>>. + +[role="screenshot"] +image::images/synthetics-get-started-ui-lightweight.png[Synthetics Create monitor UI] + +[discrete] +[[synthetics-lightweight-synthetics-project]] +== Synthetics project + +To use YAML files to create lightweight monitors in a Synthetics project, <<synthetics-get-started-project,set up the Synthetics project>> +and configure monitors in YAML files in the `lightweight` directory. + +In each YAML file, define a set of `monitors` to check your remote hosts. +Each `monitor` item is an entry in a YAML list and begins with a dash (`-`). +You can define the type of monitor to use, the hosts to check, and other +optional settings. + +The following example configures three monitors checking via the `http`, `icmp`, and `tcp` +protocols and demonstrates how to use TCP Echo response verification: + +[source,yaml] +---- +heartbeat.monitors: +- type: http + name: Todos Lightweight + id: todos-lightweight + urls: "https://elastic.github.io/synthetics-demo/" + schedule: '@every 1m' +- type: icmp + id: ping-myhost + name: My Host Ping + hosts: "myhost" + schedule: '@every 5m' +- type: tcp + id: myhost-tcp-echo + name: My Host TCP Echo + hosts: "myhost:777" # default TCP Echo Protocol + check.send: "Check" + check.receive: "Check" + schedule: '@every 60s' +---- + +There are some common monitor configuration options that are the same for all lightweight monitor types. +For a complete list, refer to <<synthetics-lightweight-common-options,Common options>>. + +Each monitor type also has additional configuration options that are specific to that type. +Refer to: + +* <<synthetics-lightweight-http,HTTP options>> +* <<synthetics-lightweight-icmp,ICMP options>> +* <<synthetics-lightweight-tcp,TCP options>> + +The `tcp` and `http` monitor types both support SSL/TLS and some proxy settings. + +[discrete] +[[synthetics-lightweight-common-options]] +=== Common options + +You can specify the following options when defining a synthetic monitor in any location. +These options are the same for all monitors. Each monitor type has additional configuration +options that are specific to that monitor type. + +// Reference table + +include::../transclusion/synthetics/reference/lightweight-config/common.asciidoc[] + +[discrete] +[[synthetics-lightweight-http]] +=== HTTP options + +The options described here configure Synthetics to connect via HTTP and +optionally verify that the host returns the expected response. + +Valid options for HTTP monitors include <<synthetics-lightweight-common-options,all common options>> +and the following HTTP-specific options: + +// Reference table + +include::../transclusion/synthetics/reference/lightweight-config/http.asciidoc[] + +[discrete] +[[synthetics-lightweight-icmp]] +=== ICMP options + +The options described here configure Synthetics to use ICMP (v4 and v6) Echo +Requests to check the configured hosts. On most platforms you must execute +Synthetics with elevated permissions to perform ICMP pings. + +On Linux, regular users may perform pings if the right file capabilities are set. Run +`sudo setcap cap_net_raw+eip /path/to/heartbeat` to grant Synthetics ping capabilities on Linux. +Alternatively, you can grant ping permissions to the user being used to run Synthetics. +To grant ping permissions in this way, run `sudo sysctl -w net.ipv4.ping_group_range='myuserid myuserid'`. + +Other platforms may require Synthetics to run as root or administrator to execute pings. + +Valid options for ICMP monitors include <<synthetics-lightweight-common-options,all common options>> +and the following ICMP-specific options: + +// Reference table + +include::../transclusion/synthetics/reference/lightweight-config/icmp.asciidoc[] + +[discrete] +[[synthetics-lightweight-tcp]] +=== TCP options + +The options described here configure Synthetics to connect via TCP and +optionally verify the endpoint by sending and/or receiving a custom payload. + +Valid options for TCP monitors include <<synthetics-lightweight-common-options,all common options>> +and the following TCP-specific options: + +// Reference table + +include::../transclusion/synthetics/reference/lightweight-config/tcp.asciidoc[] + +[discrete] +[[synthetics-lightweight-data-types]] +=== Data types reference + +Values of configuration settings are interpreted as required by Synthetics. +If a value can't be correctly interpreted as the required type - for example a +string is given when a number is required - Synthetics will fail to start up. + +[discrete] +[[synthetics-lightweight-data-bool]] +==== Boolean + +Boolean values can be either `true` or `false`. Alternative names for `true` are +`yes` and `on`. Instead of `false` the values `no` and `off` can be used. + +[source,yaml] +---- +enabled: true +disabled: false +---- + +[discrete] +[[synthetics-lightweight-data-numbers]] +==== Number + +Number values require you to enter the number _without_ single or +double quotes. + +[source,yaml] +---- +integer: 123 +negative: -1 +float: 5.4 +---- + +[NOTE] +==== +Some settings only support a restricted number range. +==== + +[discrete] +[[synthetics-lightweight-data-string]] +==== String + +In http://www.yaml.org[YAML], multiple styles of string definitions are supported: +double-quoted, single-quoted, unquoted. + +The double-quoted style is specified by surrounding the string with `"`. This +style provides support for escaping unprintable characters using `\`, but comes +at the cost of having to escape `\` and `"` characters. + +The single-quoted style is specified by surrounding the string with `'`. This +style supports no escaping (use `''` to quote a single quote). Only printable +characters can be used when using this form. + +Unquoted style requires no quotes, but does not support any escaping and can't +include any symbol that has a special meaning in YAML. + +[NOTE] +==== +Single-quoted style is recommended when defining regular expressions, +event format strings, windows file paths, or non-alphabetical symbolic characters. +==== + +[discrete] +[[synthetics-lightweight-data-duration]] +==== Duration + +Durations require a numeric value with optional fraction and required unit. +Valid time units are `ns`, `us`, `ms`, `s`, `m`, `h`. Sometimes features based +on durations can be disabled by using zero or negative durations. + +[source,yaml] +---- +duration1: 2.5s +duration2: 6h +duration_disabled: -1s +---- + +[discrete] +[[synthetics-lightweight-data-regex]] +==== Regular expression + +Regular expressions are special strings that are compiled into regular +expressions at load time. + +As regular expressions and YAML use `\` for escaping +characters in strings, it's highly recommended to use single quoted strings when +defining regular expressions. When single quoted strings are used, the `\` character +is not interpreted by YAML parser as an escape symbol. diff --git a/docs/en/serverless/synthetics/synthetics-manage-monitors.asciidoc b/docs/en/serverless/synthetics/synthetics-manage-monitors.asciidoc new file mode 100644 index 0000000000..ae21b393b2 --- /dev/null +++ b/docs/en/serverless/synthetics/synthetics-manage-monitors.asciidoc @@ -0,0 +1,89 @@ +[[synthetics-manage-monitors]] += Manage monitors + +preview:[] + +After you've <<synthetics-get-started,created a synthetic monitor>>, +you'll need to manage that monitor over time. This might include updating +or permanently deleting an existing monitor. + +[TIP] +==== +If you're using a Synthetics project to manage monitors, you should also set up a workflow that uses +<<synthetics-projects-best-practices,best practices for managing monitors effectively>> +in a production environment. +==== + +[discrete] +[[manage-monitors-config]] +== Update a monitor + +You can update a monitor's configuration, for example, changing the interval at which +the monitor runs a test. + +You can also update the journey used in a browser monitor. +For example, if you update the UI used in your application, you may want to update +your journey's selectors and assertions. + +include::../transclusion/synthetics/tab-widgets/manage-monitors-update-monitor-widget.asciidoc[] + +[discrete] +[[manage-monitors-delete]] +== Delete a monitor + +Eventually you might want to delete a monitor altogether. +For example, if the user journey you were validating no longer exists. + +include::../transclusion/synthetics/tab-widgets/manage-monitors-delete-monitor-widget.asciidoc[] + +Alternatively, you can temporarily disable a monitor by updating the monitor's +configuration in your journey's code or in the Synthetics UI using the _Enabled_ toggle. + +[discrete] +[[synthetics-projects-best-practices]] +== Implement best practices for Synthetics projects + +[IMPORTANT] +==== +This is only relevant to monitors created using a Synthetics project. +==== + +After you've <<synthetics-get-started-project,set up a Synthetics project>>, +there are some best practices you can implement to manage the Synthetics project effectively. + +[discrete] +[[synthetics-version-control]] +=== Use version control + +First, it's recommended that you version control all files in Git. +If your Synthetics project is not already in a version controlled directory add it +and push it to your Git host. + +[discrete] +[[synthetics-workflow]] +=== Set up recommended workflow + +While it can be convenient to run the `push` command directly from your workstation, +especially when setting up a new Synthetics project, it is not recommended for production environments. + +Instead, we recommended that you: + +. Develop and test changes locally. +. Create a pull request for all config changes. +. Have your CI service automatically verify the PR by running `npx @elastic/synthetics .` ++ +Elastic's synthetics runner can output results in a few different formats, +including JSON and JUnit (the standard format supported by most CI platforms). ++ +If any of your journeys fail, it will yield a non-zero exit code, which most CI systems pick up as a failure by default. +. Have a human approve the pull request. +. Merge the pull request. +. Have your CI service automatically deploy the change by running `npx @elastic/synthetics push` after changes are merged. + +The exact implementation details will depend on the CI system and Git host you use. +You can reference the sample GitHub configuration file that is included in the `.github` +directory when you create a new Synthetics project. + +// or find an example in the + +// [elastic/synthetics-demo](https://github.com/elastic/synthetics-demo/blob/main/.github/workflows/run-synthetics.yml) repository. diff --git a/docs/en/serverless/synthetics/synthetics-manage-retention.asciidoc b/docs/en/serverless/synthetics/synthetics-manage-retention.asciidoc new file mode 100644 index 0000000000..856191b009 --- /dev/null +++ b/docs/en/serverless/synthetics/synthetics-manage-retention.asciidoc @@ -0,0 +1,76 @@ +[[synthetics-manage-retention]] += Manage data retention + +preview:[] + +When you set up a synthetic monitor, data from the monitor is saved in +{ref}/data-streams.html[{es} data streams], +an append-only structure in {es}. + +There are six data streams recorded by synthetic monitors: `http`, `tcp`, `icmp`, `browser`, `browser.network`, `browser.screenshot`. +Elastic will retain data from each data stream for some time period, +and the default time period varies by data stream. +If you want to reduce the amount of storage required or store data for longer, +you can customize how long to retain data for each data stream. + +[discrete] +[[synthetics-manage-retention-synthetics-data-streams]] +== Synthetics data streams + +There are six data streams recorded by synthetic monitors: + +|=== +| Data stream| Data includes| Default retention period| + +| `http` +| The URL that was checked, the status of the check, and any errors that occurred +| 1 year +| + +| `tcp` +| The URL that was checked, the status of the check, and any errors that occurred +| 1 year +| + +| `icmp` +| The URL that was checked, the status of the check, and any errors that occurred +| 1 year +| + +| `browser` +| The URL that was checked, the status of the check, and any errors that occurred +| 1 year +| + +| `browser.screenshot` +| Binary image data used to construct a screenshot and metadata with information related to de-duplicating this data +| 14 days +| + +| `browser.network` +| Detailed metadata around requests for resources required by the pages being checked +| 14 days +| +|=== + +All types of checks record core metadata. +Browser-based checks store two additional types of data: network and screenshot documents. +These browser-specific indices are usually many times larger than the core metadata. +The relative sizes of each vary depending on the sites being +checked with network data usually being the larger of the two by a significant factor. + +[discrete] +[[synthetics-manage-retention-customize-data-stream-lifecycles]] +== Customize data stream lifecycles + +If Synthetics browser data streams are storing data longer than necessary, +you can opt to retain data for a shorter period. + +To find Synthetics data streams: + +. Navigate to **Project settings** → **Management** → **Index Management** → **Data Streams**. +. Filter the list of data streams for those containing the term `synthetics`. ++ +.. In the UI there will be three types of browser data streams: `synthetics-browser-*`, `synthetics-browser.network-*`, and `synthetics-browser.screenshot-*`. + +Then, you can refer to {fleet-guide}/data-streams-ilm-tutorial.html[Tutorial: Customize data retention for integrations] to learn how to apply a custom {ilm-init} policy to the browser data streams. diff --git a/docs/en/serverless/synthetics/synthetics-monitor-use.asciidoc b/docs/en/serverless/synthetics/synthetics-monitor-use.asciidoc new file mode 100644 index 0000000000..382abc95e4 --- /dev/null +++ b/docs/en/serverless/synthetics/synthetics-monitor-use.asciidoc @@ -0,0 +1,61 @@ +[[synthetics-monitor-use]] += Configure individual browser monitors + +++++ +<titleabbrev>Configure individual monitors</titleabbrev> +++++ + +preview:[] + +[NOTE] +==== +This is only relevant for monitors that are created and managed using a <<synthetics-get-started-synthetics-project,Synthetics project>>. +For more information on configuring browser monitors added in the UI, +refer to <<synthetics-get-started-ui,Create monitors in the Synthetics UI>>. +==== + +After <<synthetics-create-test,writing synthetic journeys>>, you can use `monitor.use` +to configure the browser monitors that will run your tests. + +You'll need to set a few configuration options: + +* **Give your monitor a name.** Provide a human readable name and a unique ID for the monitor. This will appear in your Observability project where you can view and manage monitors after they're created. +* **Set the schedule.** Specify the interval at which your tests will run. +* **Specify where the monitors should run.** You can run monitors on Elastic's global managed testing infrastructure +or <<synthetics-private-location,create a {private-location}>> to run monitors from your own premises. +* **Set other options as needed.** There are several other options you can set to customize your implementation including params, tags, screenshot options, throttling options, and more. + +Configure each monitor directly in your `journey` code using `monitor.use`. +The `monitor` API allows you to set unique options for each journey's monitor directly through code. +For example: + +[source,js] +---- +import { journey, step, monitor, expect } from '@elastic/synthetics'; + +journey('Ensure placeholder is correct', ({ page, params }) => { + monitor.use({ + id: 'example-monitor', + schedule: 10, + throttling: { + download: 10, + upload: 5, + latency: 100, + }, + }); + step('Load the demo page', async () => { + await page.goto('https://elastic.github.io/synthetics-demo/'); + }); + step('Assert placeholder text', async () => { + const placeholderValue = await page.getAttribute( + 'input.new-todo', + 'placeholder' + ); + expect(placeholderValue).toBe('What needs to be done?'); + }); +}); +---- + +For each journey, you can specify its `schedule` and the `locations` in which it runs. +When those options are not set, Synthetics will use the default values in the global configuration file. +For more details, refer to <<synthetics-configuration,Configure a Synthetics project>>. diff --git a/docs/en/serverless/synthetics/synthetics-params-secrets.asciidoc b/docs/en/serverless/synthetics/synthetics-params-secrets.asciidoc new file mode 100644 index 0000000000..dc1231f5eb --- /dev/null +++ b/docs/en/serverless/synthetics/synthetics-params-secrets.asciidoc @@ -0,0 +1,187 @@ +[[synthetics-params-secrets]] += Work with params and secrets + +preview:[] + +// lint disable params + +Params allow you to use dynamically defined values in your synthetic monitors. +For example, you may want to test a production website with a particular +demo account whose password is only known to the team managing the synthetic monitors. + +For more information about security-sensitive use cases, refer to <<synthetics-secrets-sensitive>>. + +[discrete] +[[synthetics-params-secrets-define]] +== Define params + +Param values can be declared by any of the following methods: + +* In the _Global parameters_ tab of the <<synthetics-settings-global-parameters,Synthetics Settings page in an Observability project>>. +* Declaring a default value for the parameter in a <<synthetics-dynamic-configs,configuration file>>. +* Passing the `--params` <<synthetics-cli-params,CLI argument>>. + +[NOTE] +==== +If you are creating and managing synthetic monitors using a +<<synthetics-get-started-project,Synthetics project>>, you can also use regular environment +variables via the standard node `process.env` global object. +==== + +The values in the configuration file are read in the following order: + +. **Global parameters in an Observability project**: The _Global parameters_ set using the +Observability project's UI are read first. +. **Configuration file**: Then the _Global parameters_ are merged with any parameters defined in a configuration file. +If a parameter is defined in both the Observability project **and** a Synthetics project configuration file, +the value in the configuration file will be used. +. **CLI**: Then the parameters defined in the configuration are merged with any parameters passed to the CLI `--params` argument. +If a parameter is defined in a Synthetics project configuration file **and** using the CLI argument, +the value defined using the CLI will be used. +When running a script using the CLI, _Global parameters_ defined in the Observability project have no impact +on the test because it won't have access to the Observability project. + +[discrete] +[[synthetics-params-secrets-global-parameters-in-your-observability-project]] +=== Global parameters in your Observability project + +From any page in the Observability project's **Synthetics** section: + +. Go to **Settings**. +. Go to the **Global parameters** tab. +. Define parameters. + +[role="screenshot"] +image::images/synthetics-params-secrets-kibana-define.png[Global parameters tab on the Synthetics Settings page in an Observability project] + +[discrete] +[[synthetics-dynamic-configs]] +=== Synthetics project config file + +Use a `synthetics.config.js` or `synthetics.config.ts` file to define variables required by your tests. +This file should be placed in the root of your Synthetics project. + +[source,js] +---- +export default (env) => { + let my_url = "http://localhost:8080"; + if (env === "production") { + my_url = "https://elastic.github.io/synthetics-demo/" + } + return { + params: { + my_url, + }, + }; +}; +---- + +The example above uses the `env` variable, which corresponds to the value of the `NODE_ENV` environment variable. + +[discrete] +[[synthetics-cli-params]] +=== CLI argument + +To set parameters when running <<synthetics-command-reference,`npx @elastic/synthetics` on the command line>>, +use the `--params` or `-p` flag. The provided map is merged over any existing variables defined in the `synthetics.config.{js,ts}` file. + +For example, to override the `my_url` parameter, you would run: + +[source,sh] +---- +npx @elastic/synthetics . --params '{"my_url": "http://localhost:8080"}' +---- + +[discrete] +[[synthetics-params-secrets-use]] +== Use params + +You can use params in both lightweight and browser monitors created in +either a Synthetics project or the Synthetics UI in your Observability project. + +[discrete] +[[synthetics-params-secrets-in-a-synthetics-project]] +=== In a Synthetics project + +For lightweight monitors in a Synthetics project, wrap the name of the param in `${}` (for example, `${my_url}`). + +[source,yaml] +---- +- type: http + name: Todos Lightweight + id: todos-lightweight + urls: ["${my_url}"] + schedule: '@every 1m' +---- + +In browser monitors, parameters can be referenced via the `params` property available within the +argument to a `journey`, `before`, `beforeAll`, `after`, or `afterAll` callback function. + +Add `params.` before the name of the param (for example, `params.my_url`): + +[source,js] +---- +beforeAll(({params}) => { + console.log(`Visiting ${params.my_url}`) +}) + +journey("My Journey", ({ page, params }) => { + step('launch app', async () => { + await page.goto(params.my_url) <1> + }) +}) +---- + +<1> If you are using TypeScript, replace `params.my_url` with `params.my_url as string`. + +[discrete] +[[synthetics-params-secrets-use-ui]] +=== In the UI + +To use a param in a lightweight monitor that is created in the Synthetics UI, +wrap the name of the param in `${}` (for example, `${my_url}`). + +[role="screenshot"] +image::images/synthetics-params-secrets-kibana-use-lightweight.png[Use a param in a lightweight monitor created in the Synthetics UI] + +To use a param in a browser monitor that is created in the Synthetics UI, +add `params.` before the name of the param (for example, `params.my_url`). + +[role="screenshot"] +image::images/synthetics-params-secrets-kibana-use-browser.png[Use a param in a browser monitor created in the Synthetics UI] + +[discrete] +[[synthetics-secrets-sensitive]] +== Working with secrets and sensitive values + +Your synthetics scripts may require the use of passwords or other sensitive secrets that are not known until runtime. + +[WARNING] +==== +Params are viewable in plain-text by administrators and other users with `all` privileges for +the Synthetics app. +Also note that synthetics scripts have no limitations on accessing these values, and a malicious script author could write a +synthetics journey that exfiltrates `params` and other data at runtime. +Do **not** use truly sensitive passwords (for example, an admin password or a real credit card) +in **any** synthetics tools. +Instead, set up limited demo accounts, or fake credit cards with limited functionality. +If you want to limit access to parameters, ensure that users who are not supposed to access those values +do not have `all` privileges for the Synthetics app, and that any scripts that use those values +do not leak them in network requests or screenshots. +==== + +If you are managing monitors with a Synthetics project, you can use environment variables +in your `synthetics.config.ts` or `synthetics.config.js` file. + +The example below uses `process.env.MY_URL` to reference a variable named `MY_URL` +defined in the environment and assigns its value to a param. That param can then +be used in both lightweight and browser monitors that are managed in the Synthetics project: + +[source,js] +---- +export default { + params: { + my_url: process.env.MY_URL + } +}; +---- diff --git a/docs/en/serverless/synthetics/synthetics-private-location.asciidoc b/docs/en/serverless/synthetics/synthetics-private-location.asciidoc new file mode 100644 index 0000000000..0ef50ed2e0 --- /dev/null +++ b/docs/en/serverless/synthetics/synthetics-private-location.asciidoc @@ -0,0 +1,171 @@ +[[synthetics-private-location]] += Monitor resources on private networks + +preview:[] + +To monitor resources on private networks you can either: + +* Allow Elastic's global managed infrastructure to access your private endpoints. +* Use {agent} to create a {private-location}. + +{private-location}s via Elastic Agent require only outbound connections from your network, +while allowing Elastic's global managed infrastructure to access a private endpoint requires +inbound access, thus posing an additional risk that users must assess. + +[discrete] +[[monitor-via-access-control]] +== Allow access to your private network + +To give Elastic's global managed infrastructure access to a private endpoint, use IP address filtering, HTTP authentication, or both. + +To grant access via IP, use https://manifest.synthetics.elastic-cloud.com/v1/ip-ranges.json[this list of egress IPs]. +The addresses and locations on this list may change, so automating updates to +filtering rules is recommended. IP filtering alone will allow all users of Elastic's global managed infrastructure access to your endpoints, if this +is a concern consider adding additional protection via user/password authentication via a proxy like nginx. + +[discrete] +[[monitor-via-private-agent]] +== Monitor via a private agent + +{private-location}s allow you to run monitors from your own premises. +Before running a monitor on a {private-location}, you'll need to: + +* <<synthetics-private-location-fleet-agent,Set up {agent}>>. +* <<synthetics-private-location-connect,Connect {fleet} to your Observability project>> and enroll an {agent} in {fleet}. +* <<synthetics-private-location-add,Add a {private-location}>> in the Synthetics UI. + +[IMPORTANT] +==== +{private-location}s running through {agent} must have a direct connection to {es}. +Do not configure any ingest pipelines, or output via Logstash as this will prevent Synthetics from working properly and is not supported. +==== + +[discrete] +[[synthetics-private-location-fleet-agent]] +== Set up {agent} + +Start by setting up {agent} and creating an agent policy**. For more information on agent policies and creating them, refer to {fleet-guide}/agent-policy.html#create-a-policy[{agent} policy]. + +[IMPORTANT] +==== +A {private-location} should be set up against an agent policy that runs on a single {agent}. +The {agent} must be **enrolled in Fleet** {(private-location}s cannot be set up using **standalone** {agents}). +Do _not_ run the same agent policy on multiple agents being used for {private-location}s, as you may +end up with duplicate or missing tests. {private-location}s do not currently load balance tests across +multiple {agents}. See <<synthetics-private-location-scaling,Scaling {private-location}s>> for information on increasing the capacity +within a {private-location}. + +By default {private-location}s are configured to allow two simultaneous browser tests and an unlimited number of lightweight checks. +As a result, if more than two browser tests are assigned to a particular {private-location}, there may be a delay to run them. +==== + +[discrete] +[[synthetics-private-location-connect]] +== Connect to your Observability project + +After setting up {fleet}, you'll connect {fleet} to the your Observability project +and enroll an {agent} in {fleet}. + +Elastic provides Docker images that you can use to run {fleet} and an {agent} more easily. +For monitors running on {private-location}s, you _must_ use the `elastic-agent-complete` +Docker image to create a self-hosted {agent} node. The standard {ecloud} or self-hosted +{agent} will not work. + +[IMPORTANT] +==== +The `elastic-agent-complete` Docker image is the only way to have all available options that you see in the UI. +==== + +ifeval::["{release-state}" == "unreleased"] +Version {version} has not yet been released. +endif::[] + +ifeval::["{release-state}" != "unreleased"] +To pull the Docker image run: + +[source,sh] +---- +docker pull docker.elastic.co/elastic-agent/elastic-agent-complete:{version} +---- +endif::[] + +Then enroll and run an {agent}. +You'll need an enrollment token and the URL of the {fleet-server}. +You can use the default enrollment token for your policy or create new policies +and {fleet-guide}/fleet-enrollment-tokens.html[enrollment tokens] as needed. + +For more information on running {agent} with Docker, refer to +{fleet-guide}/elastic-agent-container.html[Run {agent} in a container]. + +ifeval::["{release-state}" == "unreleased"] +Version {version} has not yet been released. +endif::[] + +ifeval::["{release-state}" != "unreleased"] +[source,sh] +---- +docker run \ + --env FLEET_ENROLL=1 \ + --env FLEET_URL={fleet_server_host_url} \ + --env FLEET_ENROLLMENT_TOKEN={enrollment_token} \ + --cap-add=NET_RAW \ + --cap-add=SETUID \ + --rm docker.elastic.co/elastic-agent/elastic-agent-complete:{version} +---- +endif::[] + +[IMPORTANT] +==== +The `elastic-agent-complete` Docker image requires additional capabilities to operate correctly. Ensure +`NET_RAW` and `SETUID` are enabled on the container. +==== + +[NOTE] +==== +You may need to set other environment variables. +Learn how in {fleet-guide}/agent-environment-variables.html[{agent} environment variables guide]. +==== + +[discrete] +[[synthetics-private-location-add]] +== Add a {private-location} + +When the {agent} is running you can add a new {private-location} in your Observability project's **Synthetics** section: + +. Go to **Settings**. +. Go to the **{private-location}s** tab. +. Click **Add location**. +. Give your new location a unique _Location name_ and select the _Agent policy_ you created above. +. Click **Save**. + +[IMPORTANT] +==== +It is not currently possible to use custom CAs for synthetics browser tests in private locations without following a workaround. +To learn more about the workaround, refer to the following GitHub issue: +https://github.com/elastic/synthetics/issues/717[elastic/synthetics#717]. +==== + +[discrete] +[[synthetics-private-location-scaling]] +== Scaling {private-location}s + +By default {private-location}s are configured to allow two simultaneous browser tests, and an unlimited number of lightweight checks. +These limits can be set via the environment variables `SYNTHETICS_LIMIT_{TYPE}`, where `{TYPE}` is one of `BROWSER`, `HTTP`, `TCP`, and `ICMP` +for the container running the {agent} docker image. + +It is critical to allocate enough memory and CPU capacity to handle configured limits. +Start by allocating at least 2 GiB of memory and two cores per browser instance to ensure consistent +performance and avoid out-of-memory errors. Then adjust as needed. Resource requirements will vary depending on workload. +Much less memory is needed for lightweight monitors. Start by allocating at least 512MiB of memory and two cores for +lightweight checks. Then increase allocated memory and CPU based on observed usage patterns. + +These limits are for simultaneous tests, not total tests. For example, if +60 browser tests were scheduled to run once per hour and each took 1 minute to run, that would fully occupy one execution slot. +However, it is a good practice to set up execution slots with extra capacity. A good starting point would be to over-allocate by +a factor of 5. In the previous example that would mean allocating 5 slots. + +[discrete] +[[synthetics-private-location-next]] +== Next steps + +Now you can add monitors to your {private-location} in <<synthetics-get-started-ui,the Synthetics UI>> or using the <<synthetics-get-started-project,Elastic Synthetics library's `push` method>>. diff --git a/docs/en/serverless/synthetics/synthetics-recorder.asciidoc b/docs/en/serverless/synthetics/synthetics-recorder.asciidoc new file mode 100644 index 0000000000..67e4bb4799 --- /dev/null +++ b/docs/en/serverless/synthetics/synthetics-recorder.asciidoc @@ -0,0 +1,147 @@ +[[synthetics-recorder]] += Use the Synthetics Recorder + +preview:[] + +[IMPORTANT] +==== +As with any script recording technology, the Elastic Synthetics Recorder should be used as a tool to help create the main structure of the script. For simpler sites, you may be able to use the Synthetics Recorder's output directly to create a synthetic monitor, but for more complex and dynamic sites, or to limit flakiness, you'll likely need to edit its output before using it to create a monitor. +==== + +You can use the Synthetics Recorder to <<synthetics-create-test,write a synthetic test>> by interacting with a web page and exporting journey code that reflects all the actions you took. + +[role="screenshot"] +image::images/synthetics-create-test-script-recorder.png[Elastic Synthetics Recorder after recording a journey and clicking Export] + +[discrete] +[[synthetics-recorder-set-up]] +== Set up + +For information on how to download the Elastic Synthetics Recorder, go to the https://github.com/elastic/synthetics-recorder/blob/main/docs/DOWNLOAD.md[download page]. + +[discrete] +[[synthetics-recorder-record-a-journey]] += Record a journey + +To record a journey: + +. Enter a starting URL in the search box. This URL will be the starting point of the journey script the recorder will create. +. Click **Start** or press Enter on your keyboard. This will launch a Chromium window open to the page you specified and start recording. +. Start interacting with the browser. This can include clicking on text, navigation, focusing on inputs like buttons and text fields, and more. +. (Optional) You can click **Pause** to temporarily stop recording actions while you continue to interact with the browser. Click again to start recording actions again. Note: It's especially important to <<synthetics-recorder-test-the-journey,test the journey>> if you paused recording at any point. +. When you're done interacting with the browser window, click **Stop** or close the browser to stop recording. + +[discrete] +[[synthetics-recorder-edit-a-journey]] += Edit a journey + +Once you've started recording, you can use the Synthetics Recorder UI to edit steps and individual actions before generating the journey code. +You can also edit the journey after you've stopped recording. + +[discrete] +[[synthetics-recorder-name-steps]] +== Name steps + +Naming steps can help make the resulting journey code easier to understand. +If you provide a step name, the name will be used in both the UI and the resulting code. +If you don't name steps, the UI will show "Step 1", "Step 2", and so on, and the resulting code will use the first action in the step as the step text. + +To edit a step name: + +. Hover over the current step name and click the pencil icon that appears. +. Edit the text in the text box. +. Click Return or Enter on your keyboard to save the updated name. + +[discrete] +[[synthetics-recorder-split-into-multiple-steps]] +== Split into multiple steps + +Steps represent groups of actions that should be completed in a specific order. +Breaking a journey into steps can make it easier to read the resulting code. +It can also make it easier to interpret results in the Synthetics UI since each step is +displayed individually in the UI along with screenshots for convenient debugging and error tracking. + +By default, the Synthetics Recorder will group all actions in a single step, +but you can break actions into any number of steps. + +To add a step: + +. Click the plus icon between two actions to create a new step. +. (Optional) Consider naming the step. + +Use the trash can icon to delete the step divider, adding the actions from the deleted step into the previous step. + +[discrete] +[[synthetics-recorder-edit-or-delete-recorded-actions]] +== Edit or delete recorded actions + +You can fine-tune a journey by editing actions that were generated by the recorder. +You can't change the type of command (for example, "click" or "navigate"), but you can change the value that is passed to the command. + +To edit an action: + +. Hover over an action and click the pencil icon that appears. +. Edit the value as needed. +. Click **Save**. + +To delete an action: + +. Hover over the action you want to delete and click the three dots for more options. +. Click **Delete action**. + +[IMPORTANT] +==== +If you changed or deleted any actions to ensure the journey still works, it's especially important to <<synthetics-recorder-test-the-journey,test the journey>>. +==== + +[discrete] +[[synthetics-recorder-add-assertions]] +== Add assertions + +Assertions can play an important role in effective synthetic journeys by making determinations about the state of the page you are testing. +This can include checking if an element is visible or checking the contents of a text field. +You can't generate an assertion just from interacting with the browser window. +Instead, you can add assertions between generated actions. + +To add an assertion: + +. Find the generated action that should be done right before you want to assert a condition. +. Hover over that action and click the three dots for more options. +. Click **Add assertion**. This will add a new "assert" action in the UI. +. Provide the type of assertion, selector, and value. +. Click **Save**. + +[IMPORTANT] +==== +If you added any assertions after you've finished recording to ensure the journey still works, it's especially important to <<synthetics-recorder-test-the-journey,test the journey>>. +==== + +[discrete] +[[synthetics-recorder-test-the-journey]] += Test the journey + +At any point during or after the recording process concludes, you can test your script. + +When you click the **Test** button, Elastic Synthetics will run the journey. +As the test runs, the recorder will display results on a per-step basis. +If there are any errors that prevent the journey from running, the recorder will display the relevant error message to help you debug. + +[IMPORTANT] +==== +If you paused recording, updated actions, or added assertions manually in the recorder it is especially important that you test the journey to verify that the actions work in sequence. +==== + +[discrete] +[[synthetics-recorder-export]] += Export + +When you are satisfied with journey you've created, you can export it from the recorder. + +Click **Export** to view the final journey code. +From there you can use the code by: + +* Copy and pasting code containing all steps into a new or existing <<synthetics-get-started-project,Synthetics project>> or an <<synthetics-get-started-ui,inline monitor>>. +* Click **Export** to save a JavaScript file containing all steps. + +You can also check **Export as project** and either copy and paste or **Export** +to get the full journey code including `journey` and imports for all dependencies. diff --git a/docs/en/serverless/synthetics/synthetics-scale-and-architect.asciidoc b/docs/en/serverless/synthetics/synthetics-scale-and-architect.asciidoc new file mode 100644 index 0000000000..d46529f5aa --- /dev/null +++ b/docs/en/serverless/synthetics/synthetics-scale-and-architect.asciidoc @@ -0,0 +1,24 @@ +[[synthetics-scale-and-architect]] += Scale and architect a Synthetics deployment + +++++ +<titleabbrev>Scale and architect a deployment</titleabbrev> +++++ + +preview:[] + +Use these advanced considerations when using Elastic Synthetics +for large and complex use cases. + +[discrete] +[[synthetics-tagging]] +== Manage large numbers of Synthetic monitors with tags + +When managing larger numbers of synthetic monitors, use tags to keep them organized. +Many of the views in the Synthetics UI are tag-aware and can group data by tag. + +[discrete] +[[synthetics-custom-dashboards]] +== Create custom dashboards + +If we don't provide a UI for your exact needs, you can use <<dashboards,dashboards>> to build custom visualizations. diff --git a/docs/en/serverless/synthetics/synthetics-security-encryption.asciidoc b/docs/en/serverless/synthetics/synthetics-security-encryption.asciidoc new file mode 100644 index 0000000000..83e8466450 --- /dev/null +++ b/docs/en/serverless/synthetics/synthetics-security-encryption.asciidoc @@ -0,0 +1,29 @@ +[[synthetics-security-encryption]] += Synthetics Encryption and Security + +preview:[] + +Elastic Synthetics was designed with security in mind encrypting both persisted and transmitted data. +This page catalogs the points within Elastic Synthetics where data is either stored or transmitted in an encrypted fashion. + +[discrete] +[[synthetics-security-encryption-synthetics-ui]] +== Synthetics UI + +Data is stored in {kibana-ref}/xpack-security-secure-saved-objects.html[Kibana Secure Saved Objects], +with sensitive fields encrypted. These fields include your script source, params, and global params. + +[discrete] +[[synthetics_service]] +== Synthetics Service + +The Global Elastic Synthetics Service performs all communication of sensitive data (both internally, and with Kibana) over encrypted connections +and encrypts all data persisted to disk as well. + +[discrete] +[[synthetics_private_locations]] +== Synthetics Private Locations + +In Kibana configuration for private locations is stored in two places, Synthetics saved objects which always encrypt sensitive fields using {kibana-ref}/xpack-security-secure-saved-objects.html[Kibana Secure Saved Objects] and also in Fleet, which uses unencrypted saved objects restricted by user permissions. For Elastic Cloud customers all data is secured on disk regardless of whether additional saved object encryption is present. See our https://www.elastic.co/cloud/security[Cloud Security Statement] for more information. We recommend that self-managed customers encrypt disks for their Elasticsearch instances if this is a concern. + +All data is encrypted in transit. See {fleet-guide}/_elastic_agent_configuration_encryption.html[Elastic Agent configuration encryption] for more details. diff --git a/docs/en/serverless/synthetics/synthetics-settings.asciidoc b/docs/en/serverless/synthetics/synthetics-settings.asciidoc new file mode 100644 index 0000000000..5e927abb6a --- /dev/null +++ b/docs/en/serverless/synthetics/synthetics-settings.asciidoc @@ -0,0 +1,118 @@ +[[synthetics-settings]] += Configure Synthetics settings + +preview:[] + +There are several Synthetics settings you can adjust in your Observability project. + +[discrete] +[[synthetics-settings-alerting]] +== Alerting + +Alerting enables you to detect complex conditions using **rules** across Observability apps +and send a notification using **connectors**. + +When you create a new synthetic monitor, new default synthetics rules will be applied. +To edit the default rules: + +. Click **Alerts and rules** in the top bar. +. Select a rule to open a panel where you can edit the rule's configuration: ++ +** **Monitor status rule** for receiving notifications for errors and outages. +** **TLS certificate rule** for receiving notifications when one or more of your HTTP or TCP +lightweight monitors has a TLS certificate expiring within a specified threshold or when +it exceeds an age limit. + +However, the automatically created Synthetics internal alert is intentionally preconfigured, +and some configuration options can't be changed. +For example, you can't change how often it checks the rule. + +If you need specific alerting behavior, set up a different rule. +To view all existing rules or create a new rule: + +. Click **Alerts and rules** in the top bar. +. Click **Manage rules** to go to the _Rules_ page. + +On the _Rules_ page, you can manage the default synthetics rules including snoozing rules, +disabling rules, deleting rules, and more. + +[role="screenshot"] +image::images/synthetics-settings-disable-default-rules.png[Rules page with default Synthetics rules] + +[NOTE] +==== +You can enable and disable default alerts for individual monitors in a few ways: + +* In the UI when you <<synthetics-get-started-ui,create a monitor>>. +* In the UI _after_ a monitor is already created, on the **Monitors** page +or on the **Edit monitor** page for the monitor. +* In a Synthetics project when <<synthetics-lightweight,configuring a lightweight monitor>>. +==== + +In the **Alerting** tab on the Synthetics Settings page, you can add and configure connectors. +If you are running in Elastic Cloud, then an SMTP connector will automatically be configured, +allowing you to easily set up email alerts. +Read more about all available connectors in <<create-anomaly-alert-rule,Action types>>. + +[role="screenshot"] +image::images/synthetics-settings-alerting.png[Alerting tab on the Synthetics Settings page in an Observability project] + +[discrete] +[[synthetics-settings-private-locations]] +== {private-location}s + +{private-location}s allow you to run monitors from your own premises. + +In the **{private-location}s** tab, you can add and manage {private-location}s. +After you <<synthetics-private-location-fleet-agent,Set up {agent}>> and <<synthetics-private-location-connect,Connect to your Observability project>>, +this is where you will add the {private-location} so you can specify it as the location for +a monitor created using the Synthetics UI or a Synthetics project. + +[role="screenshot"] +image::images/synthetics-settings-private-locations.png[{private-location}s tab on the Synthetics Settings page in an Observability project] + +[discrete] +[[synthetics-settings-global-parameters]] +== Global parameters + +Global parameters can be defined once and used across the configuration of lightweight and browser-based monitors. + +In the **Global parameters** tab, you can define variables and parameters. +This is one of several methods you can use to define variables and parameters. +To learn more about the other methods and which methods take precedence over others, see <<synthetics-params-secrets,Work with params and secrets>>. + +[role="screenshot"] +image::images/synthetics-settings-global-parameters.png[Global parameters tab on the Synthetics Settings page in an Observability project] + +[discrete] +[[synthetics-settings-data-retention]] +== Data retention + +When you set up a synthetic monitor, data from the monitor is saved in {ref}/data-streams.html[Elasticsearch data streams], +an append-only structure in Elasticsearch. +You can customize how long synthetics data is stored by creating your own index lifecycle policy +and attaching it to the relevant custom Component Template in Stack Management. + +In the **Data retention** tab, use the links to jump to the relevant policy for each data stream. +Learn more about the data included in each data stream in <<synthetics-manage-retention,Manage data retention>>. + +[role="screenshot"] +image::images/synthetics-settings-data-retention.png[Data retention tab on the Synthetics Settings page in an Observability project] + +[discrete] +[[synthetics-settings-api-keys]] +== Project API keys + +Project API keys are used to push monitors created and managed in a Synthetics project remotely from a CLI or CD pipeline. + +In the **Project API keys** tab, you can generate API keys to use with your Synthetics project. +Learn more about using API keys in <<synthetics-get-started-project,Create monitors with a Synthetics project>>. + +[IMPORTANT] +==== +To create a Project API key, you must be logged in as a user with +<<synthetics-feature-roles,Editor>> access. +==== + +[role="screenshot"] +image::images/synthetics-settings-api-keys.png[Project API keys tab on the Synthetics Settings page in an Observability project] diff --git a/docs/en/serverless/synthetics/synthetics-troubleshooting.asciidoc b/docs/en/serverless/synthetics/synthetics-troubleshooting.asciidoc new file mode 100644 index 0000000000..20c047c2ea --- /dev/null +++ b/docs/en/serverless/synthetics/synthetics-troubleshooting.asciidoc @@ -0,0 +1,133 @@ +[[synthetics-troubleshooting]] += Troubleshooting Synthetics + +++++ +<titleabbrev>Troubleshooting</titleabbrev> +++++ + +preview:[] + +[discrete] +[[synthetics-troubleshooting-local-debugging]] +== Local debugging + +For debugging synthetic tests locally, you can set an environment variable, +`DEBUG=synthetics`, to capture Synthetics agent logs when using the +<<synthetics-command-reference,Synthetics CLI>>. + +[discrete] +[[synthetics-troubleshooting-common-issues]] +== Common issues + +[discrete] +[[synthetics-troubleshooting-no-agent-running]] +=== No results from a monitor configured to run on a {private-location} + +If you have created a {private-location} and configured a monitor to run on that {private-location}, +but don't see any results for that monitor in the Synthetics UI, make sure there is an agent +configured to run against the agent policy. + +[NOTE] +==== +If you attempt to assign an agent policy to a {private-location} _before_ configuring an agent to run +against the agent policy, you will see a note in the Synthetics UI that the selected agent policy +has no agents. +==== + +When creating a {private-location}, you have to: + +. <<synthetics-private-location-fleet-agent,Set up {agent}>>. +. <<synthetics-private-location-connect,Connect {fleet} to your Observability project>> and enroll an {agent} in {fleet}. +. <<synthetics-private-location-add,Add a {private-location}>> in the Synthetics UI. + +If you do not complete the second item, no agents will be configured to run against the agent policy, and +any monitors configured to run on that {private-location} won't be able to run so there will be no results +in the Synthetics UI. + +To fix this, make sure there is an agent configured to run against the agent policy. + +[discrete] +[[synthetics-troubleshooting-no-direct-es-connection]] +=== No results from a monitor + +If you have configured a monitor but don't see any results for that monitor in the Synthetics UI, whether running them from Elastic's global managed testing infrastructure or from {private-location}s, ensure Synthetics has a direct connection to {es}. + +Do not configure any ingest pipelines or output via Logstash as this will prevent Synthetics from working properly and is not supported. + +[discrete] +[[synthetics-troubleshooting-missing-browser-schedules]] +=== Browser monitor configured to run on a {private-location} not running to schedule + +If you have browser monitors configured to run on a {private-location} but notice one or more of them are not running as scheduled, this could be because: + +* The time it takes for your monitor to run is longer than the frequency you have set +* There may be too many monitors trying to run concurrently, causing some of them to skip their scheduled run + +You may also see a message in the logs such as `2 tasks have missed their schedule deadlines by more than 1 second in the last 15s`. These will be visible from inside the Agent diagnostic ZIP file, and the numbers and time periods may be different in your logs. + +Start by identifying the cause of the issue. First, check if the time it takes the monitor to run is less than the scheduled frequency: + +. Go to the Synthetics UI. +. Click the monitor, then click **Go to monitor**. +. Go to the <<synthetics-analyze-overview,Overview tab>> to see the _Avg. duration_. You can also view the duration for individual runs in the <<synthetics-analyze-individual-monitors-history,History tab>>. +. Compare the duration to the scheduled frequency. If the duration is _greater than_ the scheduled frequency, for example if the monitor that takes 90 seconds to run and its scheduled frequency is 1 minute, the next scheduled run will not occur because the current one is still running so you may see results for every other scheduled run. ++ +To fix this, you can either: + +* Change the frequency so the monitor runs less often. +* Refactor the monitor so it can run in a shorter amount of time. + +If the duration is _less than_ the scheduled frequency or the suggestion above does not fix the issue, then there may be too many browser monitors attempting to run on the {private-location}. Due to the additional hardware overhead of running browser monitors, we limit each {private-location} to only run two browser monitors at the same time. Depending on how many browser monitors you have configured to run on the {private-location} and their schedule, the {private-location} may not be able to run them all because it would require more than two browser tests to be running simultaneously. + +To fix this issue, you can either: + +* Increase the number of concurrent browser monitors allowed (as described in <<synthetics-private-location-scaling,Scaling Private Locations>>), paying attention to the scaling and hardware requirements documented. +* Create multiple {private-location}s and spread your browser monitors across them more evenly (effectively horizontally scaling your {private-location}s). + +[discrete] +[[synthetics-troubleshooting-no-locations]] +=== No locations are available + +When using {ecloud}, if there are no options available in the _Locations_ dropdown when you +try to create a monitor in the Synthetics UI _or_ if no locations are listed when using the +<<elastic-synthetics-locations-command,`location` command>>, it might be because you do not have permission to +use Elastic managed locations _and_ there are no <<monitor-via-private-agent,Private Locations>> +available yet. + +There are a few ways to fix this: + +* If you have <<synthetics-feature-roles,Editor>> access, you can <<monitor-via-private-agent,create a new Private Location>>. Then try creating the monitor again. +* If you do _not_ have the right privileges to create a Private Location, you can ask an <<synthetics-feature-roles,Admin>> to create a Private Location or give you the necessary privileges so you can <<monitor-via-private-agent,create a new Private Location>>. Then try creating the monitor again. + +// * If you want to create a monitor to run on Elastic's global managed infrastructure, ask an <DocLink slug="/serverless/observability/synthetics-feature-roles">Admin</DocLink> to update <DocLink slug="/serverless/observability/synthetics-feature-roles" section="to-restrict-using-elastics-global-managed-infrastructure">`Synthetics and Uptime` sub-feature privileges</DocLink> for the role you're currently assigned. Then try creating the monitor again. + +//// +/* ### You do not have permission to use Elastic managed locations + +If you try to create or edit a monitor hosted on Elastic's global managed infrastructure but see a note that you do not have permission to use Elastic managed locations, an administrator has restricted the use of public locations. + +To fix this you can either: + +* Ask an <DocLink slug="/serverless/observability/synthetics-feature-roles">Admin</DocLink> to update + <DocLink slug="/serverless/observability/synthetics-feature-roles" section="to-restrict-using-elastics-global-managed-infrastructure">`Synthetics and Uptime` sub-feature privileges</DocLink> for the role you're + currently assigned or assign you a role that allows using Elastic's global managed infrastructure. + +* Use a <DocLink slug="/serverless/observability/synthetics-private-location" section="monitor-via-a-private-agent">Private Location</DocLink>. */ +//// + +[discrete] +[[synthetics-troubleshooting-get-help]] +== Get help + +[discrete] +[[synthetics-troubleshooting-support]] +=== Elastic Support + +include::../transclusion/support.asciidoc[] + +[discrete] +[[synthetics-troubleshooting-discussion]] +=== Discussion forum + +For other questions and feature requests, visit our +{forum}/c/observability/synthetics/75[discussion forum]. diff --git a/docs/en/serverless/technical-preview-limitations.asciidoc b/docs/en/serverless/technical-preview-limitations.asciidoc new file mode 100644 index 0000000000..78c2ef5515 --- /dev/null +++ b/docs/en/serverless/technical-preview-limitations.asciidoc @@ -0,0 +1,9 @@ +[[observability-technical-preview-limitations]] += Technical preview limitations + +:description: Review the limitations that apply to Elastic Observability projects in technical preview. +:keywords: serverless, observability + +preview:[] + +Currently, the maximum ingestion rate for the Managed Intake Service (APM and OpenTelemetry ingest) is 11.5 MB/s of uncompressed data (roughly 1TB/d uncompressed equivalent). Ingestion at a higher rate may experience rate limiting or ingest failures. diff --git a/docs/en/serverless/technical-preview-limitations.mdx b/docs/en/serverless/technical-preview-limitations.mdx index 2cb71aac11..b4309fb55f 100644 --- a/docs/en/serverless/technical-preview-limitations.mdx +++ b/docs/en/serverless/technical-preview-limitations.mdx @@ -5,6 +5,6 @@ description: Review the limitations that apply to Elastic Observability projects tags: [ 'serverless', 'observability' ] --- -<DocBadge template="technical preview" /> +<p><DocBadge template="technical preview" /></p> Currently, the maximum ingestion rate for the Managed Intake Service (APM and OpenTelemetry ingest) is 11.5 MB/s of uncompressed data (roughly 1TB/d uncompressed equivalent). Ingestion at a higher rate may experience rate limiting or ingest failures. \ No newline at end of file diff --git a/docs/en/serverless/transclusion/apm/guide/about/go.asciidoc b/docs/en/serverless/transclusion/apm/guide/about/go.asciidoc new file mode 100644 index 0000000000..7a0ff7dc5e --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/about/go.asciidoc @@ -0,0 +1,43 @@ + + +**Elastic APM Go agent** + +The Elastic APM Go agent enables you to trace the execution of operations in your https://golang.org/[Go] +applications. +It has built-in support for popular frameworks and toolkits, +like http://www.gorillatoolkit.org/[Gorilla] and https://gin-gonic.com/[Gin], +as well as support for instrumenting Go's built-in https://golang.org/pkg/net/http/[net/http], +https://golang.org/pkg/database/sql/[database/sql] drivers. + +The Agent includes instrumentation modules for supported technologies, +each providing middleware or wrappers for recording interesting events, such as incoming HTTP requests, outgoing HTTP requests, and database queries. + +To collect data about incoming HTTP requests, install router middleware for one of the supported web frameworks. +Incoming requests will be recorded as transactions, along with any related panics or errors. + +To collect data for outgoing HTTP requests, instrument an `http.Client` or `http.Transport` using `module/apmhttp`. +To collect data about database queries, use `module/apmsql`, +which provides instrumentation for well-known database drivers. + +In order to connect transactions with related spans and errors, and propagate traces between services (distributed tracing), +the agent relies on Go's built-in https://golang.org/pkg/context/[context] package: +transactions and spans are stored in context objects. +For example, for incoming HTTP requests, in-flight trace data will be recorded in the `context` object accessible through +https://golang.org/pkg/net/http/#Request.Context[net/http.Context]. + +In addition to capturing events like those mentioned here, +the agent also collects system and application metrics at regular intervals. +This collection happens in a background goroutine that is automatically started when the agent is initialized. + +**Learn more** + +If you're ready to give Elastic APM a try, see <<apm-get-started,Get started with traces and APM>>. + +See the {apm-go-ref}/introduction.html[Go agent reference] for full documentation, including: + +* {apm-go-ref}/supported-tech.html[Supported technologies] +* {apm-go-ref}/getting-started.html[Set up] +* {apm-go-ref}/configuration.html[Configuration reference] +* {apm-go-ref}/api.html[API reference] + +include::../../../../partials/apm-agent-warning.asciidoc[] diff --git a/docs/en/serverless/transclusion/apm/guide/about/java.asciidoc b/docs/en/serverless/transclusion/apm/guide/about/java.asciidoc new file mode 100644 index 0000000000..b9423327c6 --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/about/java.asciidoc @@ -0,0 +1,25 @@ + + +**Elastic APM Java agent** + +The Elastic APM Java agent auto-instruments supported technologies and records interesting events, +like spans for database queries and transactions for incoming HTTP requests. +To do this, it leverages the capability of the JVM to instrument the bytecode of classes. +This means that for the supported technologies, there are no code changes required. + +Spans are grouped in transactions—by default, one for each incoming HTTP request. +But it's possible to create custom transactions not associated with an HTTP request. +Transactions and Spans are sent to Elastic, where they're transformed, stored, and ready to be visualized. + +**Learn more** + +If you're ready to give Elastic APM a try, see <<apm-get-started,Get started with traces and APM>>. + +See the {apm-java-ref}/intro.html[Java agent reference] for full documentation, including: + +* {apm-java-ref}/supported-technologies-details.html[Supported technologies] +* {apm-java-ref}/setup.html[Set up] +* {apm-java-ref}/configuration.html[Configuration reference] +* {apm-java-ref}/apis.html[API reference] + +include::../../../../partials/apm-agent-warning.asciidoc[] diff --git a/docs/en/serverless/transclusion/apm/guide/about/net.asciidoc b/docs/en/serverless/transclusion/apm/guide/about/net.asciidoc new file mode 100644 index 0000000000..321026b365 --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/about/net.asciidoc @@ -0,0 +1,27 @@ + + +**Elastic APM .NET agent** + +The Elastic APM .NET agent auto-instruments supported technologies and records interesting events, like HTTP requests and database queries. +To do this, it uses built-in capabilities of the instrumented frameworks like +https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.diagnosticsource?view=netcore-3.0[Diagnostic Source], +an HTTP module for IIS, or +https://docs.microsoft.com/en-us/dotnet/api/system.data.entity.infrastructure.interception.idbcommandinterceptor?view=entity-framework-6.2.0[IDbCommandInterceptor] for Entity Framework. +This means that for the supported technologies, there are no code changes required beyond enabling auto-instrumentation. + +The Agent automatically registers callback methods for built-in Diagnostic Source events. +With this, the supported frameworks trigger Agent code for relevant events to measure their duration and collect metadata, like DB statements, as well as HTTP related information, like the URL, parameters, and headers. +These events, called Transactions and Spans, are sent to Elastic, where they're transformed, stored, and ready to be visualized. + +**Learn more** + +If you're ready to give Elastic APM a try, see <<apm-get-started,Get started with traces and APM>>. + +See the {apm-dotnet-ref}/intro.html[.NET agent reference] for full documentation, including: + +* {apm-dotnet-ref}/supported-technologies.html[Supported technologies] +* {apm-dotnet-ref}/setup.html[Set up] +* {apm-dotnet-ref}/configuration.html[Configuration reference] +* {apm-dotnet-ref}/public-api.html[API reference] + +include::../../../../partials/apm-agent-warning.asciidoc[] diff --git a/docs/en/serverless/transclusion/apm/guide/about/node.asciidoc b/docs/en/serverless/transclusion/apm/guide/about/node.asciidoc new file mode 100644 index 0000000000..a3bfe0e611 --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/about/node.asciidoc @@ -0,0 +1,25 @@ + + +**Elastic APM Node.js agent** + +The Elastic APM Node.js agent auto-instruments supported frameworks and records interesting events, +like HTTP requests and database queries. To do this, it patches modules as they are loaded to capture when module functions and callbacks are called. Additionally, there are some cases where a module will be patched to allow tracing context to be propagated through the asynchronous continuation. +This means that for the supported technologies, there are no code changes required. + +The Agent automatically links module function calls to callback calls to measure their duration and metadata (like the DB statement), +as well as HTTP-related information (like the URL, parameters, and headers). + +These events, called Transactions and Spans, are sent to Elastic, where they're transformed, stored, and ready to be visualized. + +**Learn more** + +If you're ready to give Elastic APM a try, see <<apm-get-started,Get started with traces and APM>>. + +See the {apm-node-ref}/intro.html[Node.js agent reference] for full documentation, including: + +* {apm-node-ref}/supported-technologies.html[Supported technologies] +* {apm-node-ref}/set-up.html[Set up] +* {apm-node-ref}/advanced-setup.html[Configuration reference] +* {apm-node-ref}/api.html[API reference] + +include::../../../../partials/apm-agent-warning.asciidoc[] diff --git a/docs/en/serverless/transclusion/apm/guide/about/php.asciidoc b/docs/en/serverless/transclusion/apm/guide/about/php.asciidoc new file mode 100644 index 0000000000..387185df71 --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/about/php.asciidoc @@ -0,0 +1,19 @@ + + +**Elastic APM PHP agent** + +The Elastic APM PHP agent measures application performance and tracks errors. +This extension must be installed in your PHP environment. + +**Learn more** + +If you're ready to give Elastic APM a try, see <<apm-get-started,Get started with traces and APM>>. + +See the {apm-php-ref}/intro.html[PHP agent reference] for full documentation, including: + +* {apm-php-ref}/supported-technologies.html[Supported technologies] +* {apm-php-ref}/setup.html[Set up] +* {apm-php-ref}/configuration.html[Configuration reference] +* {apm-php-ref}/public-api.html[API reference] + +include::../../../../partials/apm-agent-warning.asciidoc[] diff --git a/docs/en/serverless/transclusion/apm/guide/about/python.asciidoc b/docs/en/serverless/transclusion/apm/guide/about/python.asciidoc new file mode 100644 index 0000000000..3fcae6605c --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/about/python.asciidoc @@ -0,0 +1,31 @@ + + +**Elastic APM Python agent** + +The Elastic APM Python agent has built-in support for Django and Flask performance metrics and error logging, as well as generic support of other WSGI frameworks for error logging. + +It instruments your application to collect APM events in a few different ways: + +To collect data about incoming requests and background tasks, the Agent integrates with supported technologies to make use of hooks and signals provided by the framework. +These framework integrations require limited code changes in your application. + +To collect data from database drivers, HTTP libraries, and so on, +Elastic APM agents instrument certain functions and methods in these libraries. +Instrumentations are set up automatically and do not require any code changes. + +In addition to APM and error data, +the Python agent also collects system and application metrics in regular intervals. +This collection happens in a background thread that is started by the agent. + +**Learn more** + +If you're ready to give Elastic APM a try, see <<apm-get-started,Get started with traces and APM>>. + +See the {apm-py-ref}/getting-started.html[Python agent reference] for full documentation, including: + +* {apm-py-ref}/supported-technologies.html[Supported technologies] +* {apm-py-ref}/set-up.html[Set up] +* {apm-py-ref}/configuration.html[Configuration reference] +* {apm-py-ref}/api.html[API reference] + +include::../../../../partials/apm-agent-warning.asciidoc[] diff --git a/docs/en/serverless/transclusion/apm/guide/about/ruby.asciidoc b/docs/en/serverless/transclusion/apm/guide/about/ruby.asciidoc new file mode 100644 index 0000000000..98f9d14edc --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/about/ruby.asciidoc @@ -0,0 +1,25 @@ + + +**Elastic APM Ruby agent** + +The Elastic APM Ruby agent auto-instruments supported technologies and records interesting events, +like HTTP requests and database queries. To do this, it uses relevant public APIs when they are provided by the libraries. Otherwise, it carefully wraps the necessary internal methods. +This means that for the supported technologies, there are no code changes required. + +The APM agent automatically keeps track of queries to your data stores to measure their duration and metadata (like the DB statement), +as well as HTTP-related information (like the URL, parameters, and headers). + +These events, called Transactions and Spans, are sent to Elastic, where they're transformed, stored, and ready to be visualized. + +**Learn more** + +If you're ready to give Elastic APM a try, see <<apm-get-started,Get started with traces and APM>>. + +See the {apm-ruby-ref}/introduction.html[Ruby agent reference] for full documentation, including: + +* {apm-ruby-ref}/supported-technologies.html[Supported technologies] +* {apm-ruby-ref}/set-up.html[Set up] +* {apm-ruby-ref}/configuration.html[Configuration reference] +* {apm-ruby-ref}/api.html[API reference] + +include::../../../../partials/apm-agent-warning.asciidoc[] diff --git a/docs/en/serverless/transclusion/apm/guide/diagrams/apm-otel-architecture.asciidoc b/docs/en/serverless/transclusion/apm/guide/diagrams/apm-otel-architecture.asciidoc new file mode 100644 index 0000000000..808f874435 --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/diagrams/apm-otel-architecture.asciidoc @@ -0,0 +1,513 @@ +// ++++ + +// <div style="width:100%;margin-bottom:30px" > + +// <!-- This SVG was created in Figma. Find the source in the obs-docs team space. --> + +// <svg viewBox="0 0 1089 653" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + +// <rect x="506" y="182.744" width="577" height="344.513" rx="7" fill="white" fill-opacity="0.5" stroke="#69707D" stroke-width="2" stroke-linejoin="round" stroke-dasharray="4 4"/> + +// <text fill="#343741" xml:space="preserve" style="white-space: pre" font-family="Inter" font-size="24" font-weight="bold" letter-spacing="0em"><tspan x="710.083" y="166.505">Elastic Observability</tspan></text> + +// <rect x="900" y="198.722" width="166.474" height="310.56" rx="7" fill="#0077CC" fill-opacity="0.24" stroke="#69707D" stroke-width="2" stroke-linejoin="round"/> + +// <text fill="#343741" xml:space="preserve" style="white-space: pre" font-family="Inter" font-size="24" letter-spacing="0em"><tspan x="942.418" y="243.275">Kibana </tspan><tspan x="906.711" y="272.275">Observability </tspan><tspan x="953.844" y="301.275">apps</tspan></text> + +// <rect x="712" y="198.722" width="166.474" height="310.56" rx="7" fill="#0077CC" fill-opacity="0.24" stroke="#69707D" stroke-width="2" stroke-linejoin="round"/> + +// <text fill="#343741" xml:space="preserve" style="white-space: pre" font-family="Inter" font-size="24" letter-spacing="0em"><tspan x="718.465" y="242.918">Elasticsearch</tspan></text> + +// <rect x="524" y="198.722" width="166.474" height="310.56" rx="7" fill="#0077CC" fill-opacity="0.24" stroke="#69707D" stroke-width="2" stroke-linejoin="round"/> + +// <text fill="#343741" xml:space="preserve" style="white-space: pre" font-family="Inter" font-size="24" letter-spacing="0em"><tspan x="568.539" y="243.275">Elastic </tspan><tspan x="571.715" y="280.275">Agent</tspan></text> + +// <rect x="534" y="297.583" width="146" height="194.723" rx="7" fill="white" fill-opacity="0.5" stroke="#69707D" stroke-width="2" stroke-linejoin="round" stroke-dasharray="4 4"/> + +// <text fill="#343741" xml:space="preserve" style="white-space: pre" font-family="Inter" font-size="24" letter-spacing="0em"><tspan x="580.212" y="341.381">APM </tspan><tspan x="545.22" y="378.381">Integration</tspan></text> + +// <g clip-path="url(#clip0_19_150)"> + +// <path fill-rule="evenodd" clip-rule="evenodd" d="M676 173.756H673.238C669.793 173.756 667 170.625 667 166.763V156.78H676V173.756Z" fill="#F04E98"/> + +// <path fill-rule="evenodd" clip-rule="evenodd" d="M676 173.756H685V149.789H676V173.756Z" fill="#343741"/> + +// <path fill-rule="evenodd" clip-rule="evenodd" d="M697 173.756H688V141.801L689.973 141.825C693.866 141.872 697 145.527 697 150.017V164.085V173.756Z" fill="#0077CC"/> + +// </g> + +// <g clip-path="url(#clip1_19_150)"> + +// <path fill-rule="evenodd" clip-rule="evenodd" d="M1009.25 402.435H954.562V428.648C964.023 428.648 972.905 431.079 980.666 435.304L1009.25 402.435Z" fill="#F04E98"/> + +// <path fill-rule="evenodd" clip-rule="evenodd" d="M954.562 428.648V465.32L980.666 435.304C972.905 431.079 964.023 428.648 954.562 428.648Z" fill="#343741"/> + +// <mask id="mask0_19_150" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="957" y="438" width="52" height="35"> + +// <path fill-rule="evenodd" clip-rule="evenodd" d="M957.154 438.815H1008.15V472.336H957.154V438.815Z" fill="white"/> + +// </mask> + +// <g mask="url(#mask0_19_150)"> + +// <path fill-rule="evenodd" clip-rule="evenodd" d="M986.305 438.815L959.519 469.62L957.154 472.337H1008.15C1005.36 458.567 997.352 446.699 986.305 438.815Z" fill="#00BFB3"/> + +// </g> + +// </g> + +// <g clip-path="url(#clip2_19_150)"> + +// <path fill-rule="evenodd" clip-rule="evenodd" d="M928 347.512V360.493C932.971 360.493 937 364.517 937 369.481H950C950 357.348 940.15 347.512 928 347.512Z" fill="#0077CC"/> + +// <path fill-rule="evenodd" clip-rule="evenodd" d="M940 351.071V369.481H950C950 361.77 946.019 354.992 940 351.071Z" fill="#343741"/> + +// <path fill-rule="evenodd" clip-rule="evenodd" d="M940 337.526V347.587C947.74 351.835 953 360.055 953 369.481H956V353.503C956 344.679 948.837 337.526 940 337.526Z" fill="#00BFB3"/> + +// </g> + +// <g clip-path="url(#clip3_19_150)"> + +// <mask id="mask1_19_150" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="968" y="355" width="28" height="16"> + +// <path fill-rule="evenodd" clip-rule="evenodd" d="M968 355.57H996V370.479H968V355.57Z" fill="white"/> + +// </mask> + +// <g mask="url(#mask1_19_150)"> + +// <path fill-rule="evenodd" clip-rule="evenodd" d="M986 358.496C983.238 358.496 980.738 357.378 978.929 355.57L968 366.485V370.479H996V358.496L993.071 355.57C991.262 357.378 988.762 358.496 986 358.496Z" fill="#F04E98"/> + +// </g> + +// <path fill-rule="evenodd" clip-rule="evenodd" d="M982.465 352.041L978.929 355.571C980.738 357.378 983.238 358.496 986 358.496C988.762 358.496 991.262 357.378 993.071 355.571L989.535 352.041C987.583 350.09 984.417 350.09 982.465 352.041Z" fill="#343741"/> + +// <path fill-rule="evenodd" clip-rule="evenodd" d="M980.343 349.922C981.855 348.413 983.864 347.582 986 347.582C988.137 347.582 990.146 348.413 991.657 349.922L994.864 353.124C995.586 351.743 996 350.176 996 348.51C996 342.995 991.523 338.524 986 338.524C980.478 338.524 976 342.995 976 348.51C976 350.176 976.414 351.743 977.137 353.124L980.343 349.922Z" fill="#FEC514"/> + +// </g> + +// <g filter="url(#filter0_d_19_150)"> + +// <path d="M17 620.128L415 620.128" stroke="black" stroke-linecap="round"/> + +// </g> + +// <text fill="black" xml:space="preserve" style="white-space: pre" font-family="Inter" font-size="20" font-weight="100" letter-spacing="0em"><tspan x="149" y="648.256">Edge machines</tspan></text> + +// <text transform="translate(423 628.117)" fill="black" xml:space="preserve" style="white-space: pre" font-family="Inter" font-size="20" font-weight="100" letter-spacing="0em"><tspan x="0" y="19.2559">Protocol</tspan></text> + +// <g filter="url(#filter1_d_19_150)"> + +// <path d="M505 620.128L1084 620.128" stroke="black" stroke-linecap="round"/> + +// </g> + +// <g filter="url(#filter2_d_19_150)"> + +// <path d="M435 620L487 620" stroke="black" stroke-linecap="round"/> + +// </g> + +// <text fill="black" xml:space="preserve" style="white-space: pre" font-family="Inter" font-size="20" font-weight="100" letter-spacing="0em"><tspan x="685" y="647.373">Hosted on Elastic Cloud</tspan></text> + +// <g clip-path="url(#clip4_19_150)"> + +// <path fill-rule="evenodd" clip-rule="evenodd" d="M1006 348.51H1038V338.523H1006V348.51Z" fill="#F04E98"/> + +// <path fill-rule="evenodd" clip-rule="evenodd" d="M1025 370.479H1038V361.492H1025V370.479Z" fill="#0077CC"/> + +// <path d="M1016 348.51H1038C1038 354.025 1033.53 358.496 1028.01 358.496H1016V348.51Z" fill="#343741"/> + +// </g> + +// <g clip-path="url(#clip5_19_150)"> + +// <path fill-rule="evenodd" clip-rule="evenodd" d="M572 424.278H642V402.432H572V424.278Z" fill="#F04E98"/> + +// <path fill-rule="evenodd" clip-rule="evenodd" d="M613.562 472.336H642V452.676H613.562V472.336Z" fill="#0077CC"/> + +// <path d="M593.875 424.278H642V426.123C642 437.168 633.046 446.123 622 446.123H593.875V424.278Z" fill="#343741"/> + +// </g> + +// <g clip-path="url(#clip6_19_150)"> + +// <path fill-rule="evenodd" clip-rule="evenodd" d="M762.188 437.386C762.188 440.409 762.612 443.325 763.334 446.123H805.938C810.77 446.123 814.688 442.211 814.688 437.386C814.688 432.558 810.77 428.648 805.938 428.648H763.334C762.612 431.444 762.188 434.362 762.188 437.386Z" fill="#343741"/> + +// <mask id="mask2_19_150" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="765" y="402" width="60" height="21"> + +// <path fill-rule="evenodd" clip-rule="evenodd" d="M765.783 402.435H824.485V422.095H765.783V402.435Z" fill="white"/> + +// </mask> + +// <g mask="url(#mask2_19_150)"> + +// <path fill-rule="evenodd" clip-rule="evenodd" d="M821.083 419.17C822.306 418.045 823.444 416.837 824.487 415.542C818.071 407.558 808.234 402.435 797.187 402.435C783.36 402.435 771.46 410.467 765.783 422.095H813.617C816.387 422.095 819.049 421.044 821.083 419.17Z" fill="#FEC514"/> + +// </g> + +// <mask id="mask3_19_150" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="765" y="452" width="60" height="21"> + +// <path fill-rule="evenodd" clip-rule="evenodd" d="M765.783 452.677H824.485V472.336H765.783V452.677Z" fill="white"/> + +// </mask> + +// <g mask="url(#mask3_19_150)"> + +// <path fill-rule="evenodd" clip-rule="evenodd" d="M813.617 452.677H765.783C771.462 464.302 783.36 472.337 797.187 472.337C808.234 472.337 818.071 467.212 824.487 459.23C823.443 457.932 822.306 456.725 821.083 455.6C819.049 453.723 816.387 452.677 813.617 452.677Z" fill="#00BFB3"/> + +// </g> + +// </g> + +// <rect x="6" y="100.859" width="396" height="165.764" rx="7" fill="white" fill-opacity="0.5" stroke="#69707D" stroke-width="2" stroke-linejoin="round" stroke-dasharray="4 4"/> + +// <rect x="185" y="110.845" width="203" height="48.9284" rx="7" fill="#0077CC" fill-opacity="0.24" stroke="#69707D" stroke-width="2" stroke-linejoin="round"/> + +// <text fill="#343741" xml:space="preserve" style="white-space: pre" font-family="Inter" font-size="24" letter-spacing="0em"><tspan x="256.215" y="144.037">API/SDK</tspan></text> + +// <rect x="185" y="187.737" width="203" height="67.9017" rx="7" fill="#FEC514" stroke="#69707D" stroke-width="2" stroke-linejoin="round"/> + +// <text fill="#343741" xml:space="preserve" style="white-space: pre" font-family="Inter" font-size="24" letter-spacing="0em"><tspan x="236.262" y="215.915">Elastic APM </tspan><tspan x="270.562" y="244.915">agent</tspan></text> + +// <text fill="black" xml:space="preserve" style="white-space: pre" font-family="Inter" font-size="24" font-weight="bold" letter-spacing="0em"><tspan x="31.8555" y="25.2273">OpenTelemetry API/SDK with </tspan><tspan x="90.4141" y="54.2273">Elastic APM agents</tspan></text> + +// <rect x="28" y="128" width="74" height="41" fill="url(#pattern0)"/> + +// <g clip-path="url(#clip7_19_150)"> + +// <path fill-rule="evenodd" clip-rule="evenodd" d="M224.86 218.821C225.605 219.887 226.003 221.157 226 222.457C225.994 223.763 225.588 225.035 224.838 226.104C224.089 227.171 223.031 227.984 221.806 228.432C222.163 229.411 222.193 230.479 221.892 231.476C221.59 232.474 220.974 233.347 220.134 233.966C219.295 234.582 218.278 234.908 217.237 234.894C216.195 234.881 215.187 234.529 214.364 233.892C213.254 235.446 211.678 236.608 209.864 237.209C208.052 237.81 206.094 237.818 204.277 237.232C202.458 236.645 200.873 235.496 199.751 233.95C198.627 232.402 198.022 230.537 198.024 228.624C198.024 228.047 198.077 227.47 198.184 226.902C196.955 226.462 195.893 225.652 195.145 224.584C194.395 223.514 193.995 222.238 194 220.931C194.007 219.626 194.413 218.353 195.163 217.284C195.913 216.217 196.972 215.405 198.198 214.958C197.836 213.978 197.802 212.908 198.101 211.907C198.4 210.907 199.016 210.03 199.856 209.408C200.696 208.79 201.714 208.462 202.758 208.474C203.801 208.487 204.812 208.84 205.636 209.478C206.838 207.803 208.577 206.588 210.566 206.037C212.553 205.487 214.669 205.635 216.56 206.456C218.454 207.278 220.009 208.722 220.967 210.548C221.927 212.377 222.235 214.478 221.84 216.505C223.062 216.947 224.117 217.756 224.86 218.821ZM206.58 219.478L213.582 222.685L220.648 216.481C220.75 215.969 220.801 215.448 220.8 214.926C220.801 213.236 220.261 211.59 219.26 210.228C218.261 208.869 216.852 207.865 215.24 207.363C213.629 206.863 211.9 206.894 210.308 207.449C208.714 208.006 207.34 209.058 206.388 210.452L205.214 216.561L206.581 219.477L206.58 219.478ZM199.333 226.909C199.112 227.996 199.121 229.118 199.36 230.202C199.599 231.286 200.062 232.308 200.72 233.202C201.724 234.566 203.14 235.572 204.76 236.072C206.378 236.571 208.113 236.537 209.71 235.975C211.309 235.412 212.685 234.352 213.636 232.949L214.802 226.856L213.247 223.875L206.217 220.669L199.332 226.908L199.333 226.909ZM204.088 215.9L199.288 214.765L199.29 214.763C199.012 213.993 198.99 213.154 199.226 212.371C199.462 211.587 199.945 210.9 200.602 210.411C201.259 209.925 202.057 209.664 202.875 209.668C203.693 209.672 204.488 209.941 205.14 210.434L204.088 215.9ZM198.872 215.91C197.833 216.254 196.927 216.91 196.277 217.79C195.626 218.67 195.262 219.73 195.237 220.825C195.212 221.92 195.525 222.995 196.135 223.905C196.744 224.814 197.619 225.513 198.64 225.902L205.373 219.81L204.138 217.164L198.872 215.91ZM217.158 233.733C216.33 233.732 215.527 233.456 214.873 232.949L215.91 227.503L220.71 228.626C220.92 229.2 220.988 229.815 220.91 230.421C220.831 231.026 220.608 231.604 220.259 232.106C219.912 232.606 219.449 233.016 218.909 233.299C218.369 233.583 217.768 233.732 217.158 233.733ZM215.848 226.245L221.128 227.481C222.183 227.125 223.099 226.448 223.75 225.546C224.402 224.642 224.756 223.558 224.763 222.444C224.763 221.371 224.436 220.323 223.827 219.438C223.219 218.555 222.355 217.878 221.352 217.497L214.448 223.559L215.848 226.245Z" fill="white"/> + +// <path d="M206.58 219.478L213.582 222.685L220.648 216.481C220.75 215.969 220.801 215.448 220.8 214.926C220.801 213.236 220.261 211.59 219.26 210.228C218.261 208.869 216.852 207.865 215.24 207.363C213.629 206.863 211.9 206.894 210.308 207.449C208.713 208.006 207.34 209.058 206.388 210.452L205.214 216.561L206.581 219.477L206.58 219.478Z" fill="#FEC514"/> + +// <path d="M199.333 226.909C199.112 227.996 199.121 229.118 199.36 230.202C199.599 231.286 200.062 232.308 200.72 233.202C201.724 234.566 203.14 235.572 204.76 236.072C206.378 236.571 208.113 236.537 209.71 235.975C211.309 235.412 212.685 234.352 213.636 232.949L214.802 226.856L213.247 223.875L206.217 220.669L199.332 226.908L199.333 226.909Z" fill="#00BFB3"/> + +// <path d="M199.288 214.765L204.088 215.9L205.14 210.434C204.488 209.941 203.693 209.672 202.875 209.668C202.057 209.664 201.259 209.925 200.602 210.411C199.945 210.9 199.462 211.587 199.226 212.371C198.99 213.154 199.012 213.993 199.29 214.763" fill="#F04E98"/> + +// <path d="M198.872 215.91C197.833 216.254 196.927 216.911 196.277 217.79C195.626 218.67 195.262 219.73 195.237 220.825C195.212 221.92 195.525 222.995 196.135 223.905C196.744 224.814 197.619 225.513 198.64 225.902L205.373 219.81L204.138 217.164L198.872 215.91Z" fill="#1BA9F5"/> + +// <path d="M214.873 232.949C215.527 233.456 216.33 233.732 217.158 233.733C217.768 233.732 218.369 233.583 218.909 233.299C219.449 233.016 219.912 232.606 220.259 232.105C220.608 231.604 220.831 231.026 220.91 230.421C220.988 229.815 220.92 229.2 220.71 228.626L215.91 227.503L214.873 232.949Z" fill="#93C90E"/> + +// <path d="M215.848 226.245L221.128 227.481C222.183 227.125 223.099 226.448 223.75 225.546C224.402 224.642 224.756 223.558 224.763 222.444C224.763 221.371 224.436 220.323 223.827 219.438C223.219 218.555 222.355 217.878 221.352 217.497L214.448 223.559L215.848 226.245Z" fill="#0077CC"/> + +// </g> + +// <rect x="195" y="119.832" width="32" height="31.9551" fill="url(#pattern1)"/> + +// <rect x="7" y="372.478" width="396" height="69.8989" rx="7" fill="white" fill-opacity="0.5" stroke="#69707D" stroke-width="2" stroke-linejoin="round" stroke-dasharray="4 4"/> + +// <rect x="186" y="382.463" width="203" height="48.9284" rx="7" fill="#0077CC" fill-opacity="0.24" stroke="#69707D" stroke-width="2" stroke-linejoin="round"/> + +// <text fill="#343741" xml:space="preserve" style="white-space: pre" font-family="Inter" font-size="24" letter-spacing="0em"><tspan x="257.215" y="415.655">API/SDK</tspan></text> + +// <text fill="black" xml:space="preserve" style="white-space: pre" font-family="Inter" font-size="24" font-weight="bold" letter-spacing="0em"><tspan x="69" y="325.781">OpenTelemetry Agents</tspan></text> + +// <rect x="196" y="391.449" width="32" height="31.9551" fill="url(#pattern2)"/> + +// <rect x="51" y="401.533" width="37" height="37" transform="rotate(-35.5889 51 401.533)" fill="url(#pattern3)"/> + +// <rect x="12" y="528.258" width="396" height="69.8989" rx="7" fill="white" fill-opacity="0.5" stroke="#69707D" stroke-width="2" stroke-linejoin="round" stroke-dasharray="4 4"/> + +// <rect x="24" y="538.244" width="370" height="48.9284" rx="7" fill="#0077CC" fill-opacity="0.24" stroke="#69707D" stroke-width="2" stroke-linejoin="round"/> + +// <text fill="#343741" xml:space="preserve" style="white-space: pre" font-family="Inter" font-size="24" letter-spacing="0em"><tspan x="149.094" y="571.436">OTLP Collector</tspan></text> + +// <text fill="black" xml:space="preserve" style="white-space: pre" font-family="Inter" font-size="24" font-weight="bold" letter-spacing="0em"><tspan x="56" y="512.519">OpenTelemetry Collectors</tspan></text> + +// <rect x="109" y="545.233" width="32" height="31.9551" fill="url(#pattern4)"/> + +// <text fill="black" xml:space="preserve" style="white-space: pre" font-family="Inter" font-size="20" font-weight="300" letter-spacing="0em"><tspan x="16.0996" y="355.782">Click </tspan><tspan x="108.814" y="355.782"> to see all supported languages</tspan></text> + +// <text fill="black" xml:space="preserve" style="white-space: pre" font-family="Inter" font-size="20" font-weight="300" letter-spacing="0em" text-decoration="underline"><tspan x="67.1152" y="355.782"><a href="https://opentelemetry.io/docs/instrumentation/">here</a></tspan></text> + +// <text fill="black" xml:space="preserve" style="white-space: pre" font-family="Inter" font-size="20" font-weight="300" letter-spacing="0em"><tspan x="0.378906" y="86.1616">Available in Java, .NET, Node.js, and Python</tspan></text> + +// <path d="M286 186.737L291.774 176.737H280.226L286 186.737ZM285 160.774V177.737H287V160.774H285Z" fill="#69707D"/> + +// <path d="M533 337.525L513 325.978V349.072L533 337.525ZM387 224.687H446V220.687H387V224.687ZM454 232.687V327.525H458V232.687H454ZM466 339.525H515V335.525H466V339.525ZM454 327.525C454 334.153 459.373 339.525 466 339.525V335.525C461.582 335.525 458 331.944 458 327.525H454ZM446 224.687C450.418 224.687 454 228.268 454 232.687H458C458 226.059 452.627 220.687 446 220.687V224.687Z" fill="#69707D"/> + +// <g clip-path="url(#clip8_19_150)"> + +// <path fill-rule="evenodd" clip-rule="evenodd" d="M468.86 276.74C469.605 277.806 470.003 279.075 470 280.376C469.994 281.681 469.588 282.953 468.838 284.022C468.089 285.09 467.031 285.902 465.806 286.35C466.163 287.329 466.193 288.397 465.892 289.395C465.59 290.392 464.974 291.266 464.134 291.884C463.295 292.5 462.278 292.826 461.237 292.813C460.195 292.799 459.187 292.448 458.364 291.811C457.254 293.365 455.678 294.526 453.864 295.128C452.052 295.728 450.094 295.736 448.277 295.151C446.458 294.564 444.873 293.414 443.751 291.868C442.627 290.32 442.022 288.456 442.024 286.543C442.024 285.965 442.077 285.388 442.184 284.82C440.955 284.381 439.893 283.571 439.145 282.503C438.395 281.432 437.995 280.156 438 278.85C438.007 277.544 438.413 276.272 439.163 275.203C439.913 274.136 440.972 273.324 442.198 272.876C441.836 271.897 441.802 270.826 442.101 269.826C442.4 268.825 443.016 267.948 443.856 267.327C444.696 266.708 445.714 266.38 446.758 266.393C447.801 266.405 448.812 266.758 449.636 267.397C450.838 265.721 452.577 264.507 454.566 263.956C456.553 263.406 458.669 263.554 460.56 264.374C462.454 265.196 464.009 266.64 464.967 268.466C465.927 270.295 466.235 272.396 465.84 274.423C467.062 274.865 468.117 275.675 468.86 276.74ZM450.58 277.397L457.582 280.603L464.648 274.399C464.75 273.887 464.801 273.366 464.8 272.844C464.801 271.155 464.261 269.509 463.26 268.147C462.261 266.787 460.852 265.783 459.24 265.282C457.629 264.782 455.9 264.812 454.308 265.368C452.714 265.924 451.34 266.977 450.388 268.37L449.214 274.48L450.581 277.396L450.58 277.397ZM443.333 284.827C443.112 285.915 443.121 287.037 443.36 288.12C443.599 289.204 444.062 290.226 444.72 291.12C445.724 292.484 447.14 293.49 448.76 293.99C450.378 294.489 452.113 294.455 453.71 293.894C455.309 293.331 456.685 292.27 457.636 290.868L458.802 284.774L457.247 281.794L450.217 278.587L443.332 284.826L443.333 284.827ZM448.088 273.819L443.288 272.683L443.29 272.681C443.012 271.911 442.99 271.073 443.226 270.289C443.462 269.505 443.945 268.818 444.602 268.33C445.259 267.843 446.057 267.582 446.875 267.587C447.693 267.591 448.488 267.859 449.14 268.353L448.088 273.819ZM442.872 273.829C441.833 274.172 440.927 274.829 440.277 275.708C439.626 276.589 439.262 277.649 439.237 278.743C439.212 279.838 439.525 280.914 440.135 281.824C440.744 282.732 441.619 283.431 442.64 283.821L449.373 277.728L448.138 275.082L442.872 273.829ZM461.158 291.652C460.33 291.65 459.527 291.375 458.873 290.868L459.91 285.421L464.71 286.545C464.92 287.118 464.988 287.734 464.91 288.339C464.831 288.945 464.608 289.523 464.259 290.024C463.912 290.525 463.449 290.935 462.909 291.218C462.369 291.501 461.768 291.65 461.158 291.652ZM459.848 284.163L465.128 285.4C466.183 285.043 467.099 284.367 467.75 283.464C468.402 282.561 468.756 281.476 468.763 280.363C468.763 279.289 468.436 278.241 467.827 277.357C467.219 276.474 466.355 275.797 465.352 275.416L458.448 281.477L459.848 284.163Z" fill="white"/> + +// <path d="M450.58 277.397L457.582 280.603L464.648 274.399C464.75 273.887 464.801 273.366 464.8 272.844C464.801 271.155 464.261 269.509 463.26 268.147C462.261 266.787 460.852 265.783 459.24 265.282C457.629 264.782 455.9 264.812 454.308 265.368C452.713 265.924 451.34 266.977 450.388 268.37L449.214 274.48L450.581 277.396L450.58 277.397Z" fill="#FEC514"/> + +// <path d="M443.333 284.827C443.112 285.915 443.121 287.037 443.36 288.121C443.599 289.204 444.062 290.226 444.72 291.121C445.724 292.484 447.14 293.49 448.76 293.99C450.378 294.489 452.113 294.455 453.71 293.894C455.309 293.331 456.685 292.27 457.636 290.868L458.802 284.774L457.247 281.794L450.217 278.587L443.332 284.826L443.333 284.827Z" fill="#00BFB3"/> + +// <path d="M443.288 272.683L448.088 273.819L449.14 268.352C448.488 267.859 447.693 267.591 446.875 267.586C446.057 267.582 445.259 267.843 444.602 268.329C443.945 268.818 443.462 269.505 443.226 270.289C442.99 271.073 443.012 271.911 443.29 272.681" fill="#F04E98"/> + +// <path d="M442.872 273.829C441.833 274.172 440.927 274.829 440.277 275.708C439.626 276.589 439.262 277.649 439.237 278.743C439.212 279.838 439.525 280.914 440.135 281.824C440.744 282.732 441.619 283.431 442.64 283.821L449.373 277.728L448.138 275.082L442.872 273.829Z" fill="#1BA9F5"/> + +// <path d="M458.873 290.868C459.527 291.374 460.33 291.65 461.158 291.652C461.768 291.65 462.369 291.501 462.909 291.218C463.449 290.934 463.912 290.525 464.259 290.024C464.608 289.523 464.831 288.945 464.91 288.339C464.988 287.734 464.92 287.118 464.71 286.545L459.91 285.421L458.873 290.868Z" fill="#93C90E"/> + +// <path d="M459.848 284.163L465.128 285.399C466.183 285.043 467.099 284.366 467.75 283.464C468.402 282.56 468.756 281.476 468.763 280.363C468.763 279.289 468.436 278.241 467.827 277.357C467.219 276.474 466.355 275.797 465.352 275.416L458.448 281.477L459.848 284.163Z" fill="#0077CC"/> + +// </g> + +// <path d="M534 407.926L514 396.379V419.473L534 407.926ZM388.5 409.926H516V405.926H388.5V409.926Z" fill="#69707D"/> + +// <path d="M394 563.208H446C451.523 563.208 456 558.731 456 553.208V408.426" stroke="#69707D" stroke-width="4"/> + +// <rect x="438" y="391.449" width="32" height="31.9551" fill="white"/> + +// <rect x="438" y="391.449" width="32" height="31.9551" fill="url(#pattern5)"/> + +// <path d="M57.4724 198C56.0143 198.007 54.6218 198.136 53.3963 198.359C49.7862 199.017 49.1308 200.394 49.1308 202.934V206.288H57.6614V207.406H45.9296C43.4502 207.406 41.2795 208.943 40.6005 211.867C39.8173 215.219 39.7826 217.311 40.6005 220.811C41.2069 223.416 42.6548 225.273 45.1342 225.273H48.0672V221.252C48.0672 218.347 50.5033 215.785 53.3963 215.785H61.9164C64.2885 215.785 66.1818 213.771 66.1818 211.313V202.934C66.1818 200.549 64.2315 198.757 61.9167 198.359C60.4513 198.108 58.9308 197.993 57.4724 198V198ZM52.8592 200.698C53.7405 200.698 54.4598 201.452 54.4598 202.38C54.4598 203.304 53.7405 204.052 52.8595 204.052C51.9751 204.052 51.2586 203.304 51.2586 202.38C51.2586 201.452 51.9751 200.698 52.8592 200.698V200.698Z" fill="url(#paint0_linear_19_150)"/> + +// <path d="M67.8961 206.727V210.605C67.8961 213.612 65.4114 216.142 62.578 216.142H54.075C51.7458 216.142 49.8182 218.188 49.8182 220.58V228.896C49.8182 231.263 51.8245 232.655 54.075 233.334C56.7696 234.147 59.3537 234.294 62.5777 233.334C64.7211 232.698 66.8344 231.416 66.8344 228.896V225.568H58.3314V224.459H71.0908C73.5651 224.459 74.4872 222.688 75.3476 220.031C76.2363 217.295 76.1985 214.664 75.3476 211.155C74.7361 208.628 73.5683 206.727 71.0908 206.727H67.8961ZM63.1136 227.787C63.9963 227.787 64.7113 228.529 64.7113 229.446C64.7113 230.367 63.9963 231.115 63.1136 231.115C62.2341 231.115 61.5166 230.367 61.5166 229.446C61.5166 228.529 62.2341 227.787 63.1136 227.787Z" fill="url(#paint1_linear_19_150)"/> + +// <path opacity="0.444" d="M69.4545 239.455C69.4545 240.033 68.2477 240.588 66.0996 240.997C63.9514 241.406 61.0379 241.636 58 241.636C54.9621 241.636 52.0485 241.406 49.9004 240.997C47.7523 240.588 46.5454 240.033 46.5454 239.455C46.5454 238.876 47.7523 238.321 49.9004 237.912C52.0485 237.503 54.9621 237.273 58 237.273C61.0379 237.273 63.9514 237.503 66.0996 237.912C68.2477 238.321 69.4545 238.876 69.4545 239.455V239.455Z" fill="url(#paint2_radial_19_150)"/> + +// <rect x="108" y="195" width="44" height="44" fill="url(#pattern6)"/> + +// <rect x="13" y="407.457" width="41.5122" height="23" transform="rotate(-36.0975 13 407.457)" fill="url(#pattern7)"/> + +// <path d="M107.464 397.844C106.718 398.389 106.051 398.973 105.505 399.544C103.896 401.224 104.072 402.175 105.016 403.478L106.264 405.2L110.643 402.028L111.059 402.602L105.036 406.965C103.763 407.887 103.22 409.483 103.959 411.237C104.804 413.249 105.564 414.336 107.285 415.829C108.565 416.941 109.999 417.355 111.272 416.433L112.778 415.343L111.282 413.278C110.202 411.787 110.5 409.566 111.985 408.49L116.359 405.322C117.577 404.439 117.8 402.701 116.886 401.439L113.77 397.138C112.883 395.913 111.216 395.719 109.879 396.375C109.033 396.791 108.21 397.298 107.464 397.844V397.844ZM106.099 400.944C106.551 400.616 107.201 400.736 107.546 401.212C107.89 401.687 107.799 402.338 107.346 402.666C106.892 402.995 106.246 402.877 105.903 402.403C105.558 401.927 105.645 401.273 106.099 400.944V400.944Z" fill="url(#paint3_linear_19_150)"/> + +// <path d="M116.061 398.448L117.503 400.439C118.621 401.982 118.287 404.205 116.832 405.259L112.467 408.421C111.271 409.287 111.042 411.054 111.932 412.282L115.024 416.552C115.904 417.767 117.452 417.735 118.86 417.247C120.545 416.662 121.927 415.777 123.225 414.085C124.089 412.961 124.697 411.518 123.76 410.224L122.522 408.515L118.157 411.677L117.744 411.108L124.295 406.363C125.565 405.442 125.38 404.191 124.834 402.506C124.273 400.772 123.275 399.435 121.533 397.95C120.279 396.88 118.973 396.338 117.701 397.26L116.061 398.448ZM121.437 411.038C121.89 410.71 122.533 410.825 122.874 411.295C123.217 411.768 123.128 412.418 122.675 412.747C122.223 413.074 121.577 412.956 121.234 412.484C120.893 412.013 120.986 411.365 121.437 411.038Z" fill="url(#paint4_linear_19_150)"/> + +// <path opacity="0.444" d="M129.032 414.67C129.247 414.967 128.834 415.701 127.883 416.71C126.932 417.718 125.522 418.92 123.962 420.05C122.403 421.179 120.821 422.145 119.566 422.734C118.311 423.322 117.485 423.486 117.27 423.189C117.055 422.892 117.468 422.158 118.419 421.15C119.37 420.141 120.78 418.939 122.34 417.809C123.899 416.68 125.48 415.714 126.735 415.125C127.99 414.537 128.816 414.373 129.032 414.67V414.67Z" fill="url(#paint5_radial_19_150)"/> + +// <rect x="135.317" y="406.092" width="26.7839" height="25.7569" transform="rotate(-33.1845 135.317 406.092)" fill="url(#pattern8)"/> + +// <rect x="102" y="123" width="58" height="58" fill="url(#pattern9)"/> + +// <defs> + +// <filter id="filter0_d_19_150" x="12.5" y="619.628" width="407" height="9" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> + +// <feFlood flood-opacity="0" result="BackgroundImageFix"/> + +// <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/> + +// <feOffset dy="4"/> + +// <feGaussianBlur stdDeviation="2"/> + +// <feComposite in2="hardAlpha" operator="out"/> + +// <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/> + +// <feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_19_150"/> + +// <feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_19_150" result="shape"/> + +// </filter> + +// <filter id="filter1_d_19_150" x="500.5" y="619.628" width="588" height="9" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> + +// <feFlood flood-opacity="0" result="BackgroundImageFix"/> + +// <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/> + +// <feOffset dy="4"/> + +// <feGaussianBlur stdDeviation="2"/> + +// <feComposite in2="hardAlpha" operator="out"/> + +// <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/> + +// <feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_19_150"/> + +// <feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_19_150" result="shape"/> + +// </filter> + +// <filter id="filter2_d_19_150" x="430.5" y="619.5" width="61" height="9" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> + +// <feFlood flood-opacity="0" result="BackgroundImageFix"/> + +// <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/> + +// <feOffset dy="4"/> + +// <feGaussianBlur stdDeviation="2"/> + +// <feComposite in2="hardAlpha" operator="out"/> + +// <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/> + +// <feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_19_150"/> + +// <feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_19_150" result="shape"/> + +// </filter> + +// <pattern id="pattern0" patternContentUnits="objectBoundingBox" width="1" height="1"> + +// <use xlink:href="#image0_19_150" transform="matrix(0.000244141 0 0 0.000440644 0 -0.00519841)"/> + +// </pattern> + +// <pattern id="pattern1" patternContentUnits="objectBoundingBox" width="1" height="1"> + +// <use xlink:href="#image1_19_150" transform="translate(0 -0.00070325) scale(0.0005)"/> + +// </pattern> + +// <pattern id="pattern2" patternContentUnits="objectBoundingBox" width="1" height="1"> + +// <use xlink:href="#image1_19_150" transform="translate(0 -0.00070325) scale(0.0005)"/> + +// </pattern> + +// <pattern id="pattern3" patternContentUnits="objectBoundingBox" width="1" height="1"> + +// <use xlink:href="#image2_19_150" transform="scale(0.001)"/> + +// </pattern> + +// <pattern id="pattern4" patternContentUnits="objectBoundingBox" width="1" height="1"> + +// <use xlink:href="#image1_19_150" transform="translate(0 -0.00070325) scale(0.0005)"/> + +// </pattern> + +// <pattern id="pattern5" patternContentUnits="objectBoundingBox" width="1" height="1"> + +// <use xlink:href="#image1_19_150" transform="translate(0 -0.00070325) scale(0.0005)"/> + +// </pattern> + +// <pattern id="pattern6" patternContentUnits="objectBoundingBox" width="1" height="1"> + +// <use xlink:href="#image3_19_150" transform="scale(0.000488281)"/> + +// </pattern> + +// <pattern id="pattern7" patternContentUnits="objectBoundingBox" width="1" height="1"> + +// <use xlink:href="#image0_19_150" transform="matrix(0.000244141 0 0 0.000440644 0 -0.00519841)"/> + +// </pattern> + +// <pattern id="pattern8" patternContentUnits="objectBoundingBox" width="1" height="1"> + +// <use xlink:href="#image3_19_150" transform="matrix(0.000488281 0 0 0.00050775 0 -0.0199362)"/> + +// </pattern> + +// <pattern id="pattern9" patternContentUnits="objectBoundingBox" width="1" height="1"> + +// <use xlink:href="#image2_19_150" transform="scale(0.001)"/> + +// </pattern> + +// <linearGradient id="paint0_linear_19_150" x1="39.9999" y1="198" x2="60.1826" y2="214.671" gradientUnits="userSpaceOnUse"> + +// <stop stop-color="#5A9FD4"/> + +// <stop offset="1" stop-color="#306998"/> + +// </linearGradient> + +// <linearGradient id="paint1_linear_19_150" x1="62.909" y1="229.166" x2="55.6262" y2="219.218" gradientUnits="userSpaceOnUse"> + +// <stop stop-color="#FFD43B"/> + +// <stop offset="1" stop-color="#FFE873"/> + +// </linearGradient> + +// <radialGradient id="paint2_radial_19_150" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(58 239.454) rotate(-90) scale(2.18171 9.7629)"> + +// <stop stop-color="#B8B8B8" stop-opacity="0.498"/> + +// <stop offset="1" stop-color="#7F7F7F" stop-opacity="0"/> + +// </radialGradient> + +// <linearGradient id="paint3_linear_19_150" x1="98.4939" y1="404.341" x2="115.055" y2="405.395" gradientUnits="userSpaceOnUse"> + +// <stop stop-color="#5A9FD4"/> + +// <stop offset="1" stop-color="#306998"/> + +// </linearGradient> + +// <linearGradient id="paint4_linear_19_150" x1="121.845" y1="411.822" x2="114.407" y2="409.423" gradientUnits="userSpaceOnUse"> + +// <stop stop-color="#FFD43B"/> + +// <stop offset="1" stop-color="#FFE873"/> + +// </linearGradient> + +// <radialGradient id="paint5_radial_19_150" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(123.151 418.929) rotate(-125.918) scale(1.38304 6.18893)"> + +// <stop stop-color="#B8B8B8" stop-opacity="0.498"/> + +// <stop offset="1" stop-color="#7F7F7F" stop-opacity="0"/> + +// </radialGradient> + +// <clipPath id="clip0_19_150"> + +// <rect width="32" height="31.9551" fill="white" transform="translate(666 141.801)"/> + +// </clipPath> + +// <clipPath id="clip1_19_150"> + +// <rect width="70" height="69.9017" fill="white" transform="translate(948 402.434)"/> + +// </clipPath> + +// <clipPath id="clip2_19_150"> + +// <rect width="32" height="31.9551" fill="white" transform="translate(926 337.525)"/> + +// </clipPath> + +// <clipPath id="clip3_19_150"> + +// <rect width="32" height="31.9551" fill="white" transform="translate(966 338.524)"/> + +// </clipPath> + +// <clipPath id="clip4_19_150"> + +// <rect width="32" height="31.9551" fill="white" transform="translate(1006 338.524)"/> + +// </clipPath> + +// <clipPath id="clip5_19_150"> + +// <rect width="70" height="69.9017" fill="white" transform="translate(572 402.434)"/> + +// </clipPath> + +// <clipPath id="clip6_19_150"> + +// <rect width="70" height="69.9017" fill="white" transform="translate(760 402.434)"/> + +// </clipPath> + +// <clipPath id="clip7_19_150"> + +// <rect width="32" height="31.9551" fill="white" transform="translate(194 205.711)"/> + +// </clipPath> + +// <clipPath id="clip8_19_150"> + +// <rect width="32" height="31.9551" fill="white" transform="translate(438 263.629)"/> + +// </clipPath> + +// <image id="image0_19_150" width="4096" height="2293" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAEAAAAAj1CAYAAADjzX4UAAAAAXNSR0IArs4c6QAAIABJREFUeF7s3HuQ3Wd5H/DnPbsrY2OBvNqVjC/aXens2giSJijEGdoSLqlDMc3UmQ6XAKVg7sEYY2MsIWyMhG1sY4gde0qGumUIY0iA0jQzQClkaC7NAIICibD3oj0ry7Kt3ZXwTcja3d/bcZq2gdiWdnUuv3POx//q/J7L53n/0sjfFP4jQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEWi6QWj6BAQgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIEQAOARECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBEggIACjBEYxAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQEAHgDBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgBAICAEpwBCMQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEBAN4AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAogYAAgBIcwQgECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQEAAgDdAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgRKICAAoARHMAIBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEBAA4A0QIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIESCAgAKMERjECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAQAeAMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKAEAgIASnAEIxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQEA3gABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECiBgACAEhzBCAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAQACAN0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBEogIACgBEcwAgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQEADgDRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgRIICAAowRGMQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBAB4AwQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoAQCAgBKcAQjECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAQDeAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQKIGAAIASHMEIBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBAAIA3QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIESiAgAKAERzACAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAQAOANECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBEggIACjBEYxAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQEAHgDBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgBAICAEpwBCMQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEBAN4AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAogYAAgBIcwQgECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQEAAgDdAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgRKICAAoARHMAIBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEBAA4A0QIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIESCAgAKMERjECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAQAeAMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKAEAgIASnAEIxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQEA3gABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECiBgACAEhzBCAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAQACAN0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBEogIACgBEcwAgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQEADgDRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgRIICAAowRGMQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBAB4AwQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoAQCAgBKcAQjECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAQDeAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQKIGAAIASHMEIBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBAAIA3QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIESiAgAKAERzACAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAQAOANECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBEggIACjBEYxAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQEAHgDBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgBAICAEpwBCMQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEBAN4AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAogYAAgBIcwQgECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQEAAgDdAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgRKICAAoARHMAIBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEBAA4A0QIECAAAECBAgQIECAAAECBAi0rUCO6IktWyqxa9diishtu4jBCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgEBECADwDAgQIECBAgAABAgQIECBAgACBthPYf8YZp/T1nXJuRHpWJVdOibR472MLPePP2j8+Lwig7c5pYAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE/l5AAICnQIAAAQIECBAgQIAAAQIECBAg0HYC8xuqm3Ml/WFEnBsRqyJiMnJ8ZiH1fPZZtbtqbbeQgQkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIBARAgA8AwIECBAgQIAAAQIECBAgQIAAgbYSyBGVueHqC1OkP/uHg6eI+Yh066re4vbVk5OzbbWUYQkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQICAAwBsgQIAAAQIECBAgQIAAAQIECBBoN4G8ZUvfgbmHX9GT8pd+fvYcMZFS2rl4+GlfPP2BHz7abruZlwABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACB7hZI3b2+7QkQIECAAAECBAgQIECAAAECBNpNIG/evGr2kaP/ulJJn3+i2XPkr1Ry3tk/sOY7adeuhXbbz7wECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECHSvgACA7r29zQkQIECAAAECBAgQIECAAAECbSmQI3oOjlRfmnP6SkRUfn6JFPlQpLgjL1Q+PrBv/N62XNLQBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAh0pYAAgK48u6UJECBAgAABAgQIECBAgAABAu0tMDtUfV5K6asRMfhEm+SIqRSxMz9S+eLg3N0Pt/e2pidAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoFsEBAB0y6XtSYAAAQIECBAgQIAAAQIECBDoIIH5DdXNRSXdmSJ+8UnWWoqIbxYp7RjsX/3XadeuhQ5a3yoECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECHSogACADj2stQgQIECAAAECBAgQIECAAAECnSxw4KxN1UpP5d9Hipc+6Z4pHkk5vrAUC1vX1Wr3d7KH3QgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQ6AwBAQCdcUdbECBAgAABAgQIECBAgAABAgS6SmD+zOpZubdybaT8+mMs/mARcdXi0Uc/dcb+/Ye7CsmyBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi0nYAAgLY7mYEJECBAgAABAgQIECBAgAABAgQeOvPctUdXFe+NnLcdh8b3llLeum568hspYuk4fu8nBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQaImAAICWsGtKgAABAgQIECBAgAABAgQIECBwIgL3r1//9N6TV//biHT7MeukWMw5fSGW0mWD99y9/5i/9wMCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi0SEAAQIvgtSVAgAABAgQIECBAgAABAgQIEFi5QI6oHBwZfWkUcWdOsfY4Ki2kFDv6pyd2poh8HL/3EwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECDRdQABA08k1JECAAAECBAgQIECAAAECBAgQqIfA7MaNv1LJlTtyTr9wnPXui0jvHKiNf/k4f+9nBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQaKqAAICmcmtGgAABAgQIECBAgAABAgQIECBQL4G5odFnp5RuzpFfdrw1c07fjMXFdwzeu2f8eL/xOwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECDRLQABAs6T1IUCAAAECBAgQIECAAAECBAgQqKvA/o0bN6wqeq6OiDctp3DK+eb7nr5q63N37z66nO/8lgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAo0WEADQaGH1CRAgQIAAAQIECBAgQIAAAQIEGiLw0Lnnrl14bOk9Ocf2ZTVIcc9Szm9ZX5v82rK+82MCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAg0WEAAQIOBlSdAgAABAgQIECBAgAABAgQIEGiMwD1nnXXyKb0nvz6nuC1y9C6jy1JEfCb15kvWTk4+tIzv/JQAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQINFRAA0FBexQkQIECAAAECBAgQIECAAAECBBopMD9SPT/ndEdEnLnMPrM5x3sGZiY+lyKKZX7r5wQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEGiIgACAhrAqSoAAAQIECBAgQIAAAQIECBAg0AyB+eHqrxU5/X5KsWWZ/RYi4k/T0eKStfun7lnmt35OgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBhggIAGgIq6IECBAgQIAAAQIECBAgQIAAAQLNEJjfUH1O0ZM+mnJcsNx+KWI+53T1ob7iU6OTk48t93u/J0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQL0FBADUW1Q9AgQIECBAgAABAgQIECBAgACBpgnsHxkZ6ou+D6acL1pu0xRxNEd8ayml962fHv/Bcr/3ewIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECNRbQABAvUXVI0CAAAECBAgQIECAAAECBAgQaJrA9PDwmlOj9z0p0tUra5oO5YhbB9au3pl27VpYWQ1fESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoD4CAgDq46gKAQIECBAgQIAAAQIECBAgQIBACwRyRM/sUPUNlRS3RqRTVjBCkSK+myvpXQN7xr+zgu99QoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgboJCACoG6VCBAgQIECAAAECBAgQIECAAAECrRCYGxr97Uj5toh0+kr6p4gHi5T/w5GFI9vP3rfvpyup4RsCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAjUQ0AAQD0U1SBAgAABAgQIECBAgAABAgQIEGiZwPyG0X+RU3w8UjxnhUPkiPjuUk9x6fqpqb9cYQ2fESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBA4IQFBACcMKECBAgQIECAAAECBAgQIECAAAECrRSYGx49LyI+GhG/fgJzHIgUtxYn931i3e7dj5xAHZ8SIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgxQICAFZM50MCBAgQIECAAAECBAgQIECAAIEyCNy3ofqcvkraEREXrnSelGIx5/hmT85XnjYz+f2V1vEdAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIETkRAAMCJ6PmWAAECBAgQIECAAAECBAgQIECg5QIHN27eUBQLV0fEm05kmBwxnSJdM1Ab//SJ1PEtAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEViogAGClcr4jQIAAAQIECBAgQIAAAQIECBAohcCDZ23uX+xZ2JpTXH5CA6VYTDl/sadI29bsndhzQrV8TIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgRUICABYAZpPCBAgQIAAAQIECBAgQIAAAQIEyiOQN29edfDI4rtykT8SEU87kclyxA+jiA8M7p340xOp41sCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAisREAAwErUfEOAAAECBAgQIECAAAECBAgQIFAqgbmR6utyTjeliPUnMlhO8UhE/uRSJd9w+tTUgROp5VsCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgsV0AAwHLF/J4AAQIECBAgQIAAAQIECBAgQKB0AodGqr+1lNMNEXHOiQ6XI/5H0VNsWz819ZcnWsv3BAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQWI6AAIDlaPktAQIECBAgQIAAAQIECBAgQIBAKQVmh6svSpGuj4jzTnTAHPn+lNK1i4dPvuP0B3746InW8z0BAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTYfWpPAAAgAElEQVQIECBAgAABAgQIECBAgAABAgSOV0AAwPFK+R0BAgQIECBAgAABAgQIECBAgEBpBWaHqs97/H/aj4jfrM+Q6b9Uepa2909N/U196qlCgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBYwsIADi2kV8QIECAAAECBAgQIECAAAECBAiUXOCBs6ubenvSjhzxmnqMmiJqS0W+YnDv5JdSxFI9aqpBgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBYwkIADiWkD8nQIAAAQIECBAgQIAAAQIECBAovcDD1ergkcX04RTx9noMmyMeSzluXLXY84ln3HvXfD1qqkGAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFjCQgAOJaQPydAgAABAgQIECBAgAABAgQIECi9QN6ypW9u/uHtKfIHIqKnTgN/KXJsH5iZ+HGd6ilDgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBpxQQAOCBECBAgAABAgQIECBAgAABAgQIdITA/PDoJTniwxHxjDot9OMUxXv7a1NfTxFLdaqpDAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBJ5UQACAx0GAAAECBAgQIECAAAECBAgQINARAvNDY2/OKXZE5NPrsVCOOJwif7gnFj95Wq32k3rUVIMAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJPJSAAwPsgQIAAAQIECBAgQIAAAQIECBDoCIHZ4dHXRMTOFLGxXguliM/1LOXta+6ZnKpXTXUIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECDwZAICALwNAgQIECBAgAABAgQIECBAgACBjhA4OFL9V0UR10ZKz63XQjnihznFxYPTE3+RIop61VWHAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECTyQgAMC7IECAAAECBAgQIECAAAECBAgQ6AiBuaFzXpJTcV2K+NV6LZQjHk0pXZlXpU8P3n33w/Wqqw4BAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSeSEAAgHdBgAABAgQIECBAgAABAgQIECDQEQJzw6PnRaTrIvKL67lQiviPJ/fmq06ZnNxXz7pqESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBA4OcFBAB4EwQIECBAgAABAgQIECBAgAABAh0hcP/Zm57b01u5PuW4oL4L5V1FpDcP1iZ+kCJyfWurRoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgf8vIADAayBAgAABAgQIECBAgAABAgQIEOgIgUMjzx5azAs3pEivrPNCh1OR39B/6qo/Sbt3H61zbeUIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECDw/wQEAHgMBAgQIECAAAECBAgQIECAAAECHSHwcLU6eHQx3ZAj/l29F0opbuo72nP9M+69a77etdUjQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIDA/xUQAOAtECBAgAABAgQIECBAgAABAgQIdITA/jO2nLKq78EbIqV3RkRd/94rR/5qT6V4W/+ePXs7AssSBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAiUUqCu/xC6lBsaigABAgQIECBAgAABAgQIECBAoCsEckSaG65eHZGuSBEn13fpVOvJxW//3szkDz4UUdS3tmoECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBD4PwICALwEAgQIECBAgAABAgQIECBAgACBjhGYHRq7LKW8LSL667xUThEXPRQLd47UakfqXFs5AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI/J2AAAAPgQABAgQIECBAgAABAgQIECBAoGME5odH35pzXBUpzqz3Uinnj6WeYkf/nj0P1ru2egQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHhcQACAd0CAAAECBAgQIECAAAECBAgQINAxAgc3Vl9bFOmaiNjUgKW+VcTCq9fVavc3oLaSBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQEADgDRAgQIAAAQIECBAgQIAAAQIECHSOwNzQ2IWR8s6I2NyAre45qcgvO3Xv5I9TRG5AfSUJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEOhygdTl+1ufAAECBAgQIECAAAECBAgQIECggwQODI29vCflj+SIX2rEWktFesO6wdV3pl27FhpRX00CBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBLpbQABAd9/f9gQIECBAgAABAgQIECBAgACBjhKYGzrnJZGK6yPi+Y1YLKf8sYXHDl91xv79hxtRX00CBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBLpbQABAd9/f9gQIECBAgAABAgQIECBAgACBjhKYH9r0gqKSbkg5/dNGLJYi/luqLL2yf8+eBxtRX00CBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBLpbQABAd9/f9gQIECBAgAABAgQIECBAgACBjhKY3bBpS1QqN6WIFzVmsXRfTunFg9N3j0dEbkwPVQkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQ6FYBAQDdenl7EyBAgAABAgQIECBAgAABAgQ6UGB+Q/U5uZJujojzG7VezvHagZmJz6WIolE91CVAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoDsFBAB0591tTYAAAQIECBAgQIAAAQIECBDoSIGfnF3dtNCbfi/luKBRC6YcN/XPTFyZIpYa1UNdAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgS6U0AAQHfe3dYECBAgQIAAAQIECBAgQIAAgY4UmK9Wz8qL6ZaIuLBhC6b4xtr+Z/zLtGvXQsN6KEyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQFcKCADoyrNbmgABAgQIECBAgAABAgQIECDQmQIPjY0NPHa0uC1FemUDN5xf6s3nrZ+cnGpgD6UJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEOhCAQEAXXh0KxMgQIAAAQIECBAgQIAAAQIEOlXgroFzVg88Pd8eKb+ukTvmSK8ZrI1/rpE91CZAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoPsEBAB0381tTIAAAQIECBAgQIAAAQIECBDoWIHvbtnSN3Lw4dtyzhdFRKVRi+acPzY4M3l5o+qrS4AAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAdwoIAOjOu9uaAAECBAgQIECAAAECBAgQINCRAjkizQ+Pfjwi3hERqxq1ZI741mBt4kWNqq8uAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQLdKSAAoDvvbmsCBAgQIECAAAECBAgQIECAQMcKzA2PXReRL46IpzdqyRzp0VxZ/OV1e/ZMNKqHugQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIdJ+AAIDuu7mNCRAgQIAAAQIECBAgQIAAAQIdLTA3NLojUlwSEasbuWiR8qvWTU/+USN7qE2AAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQHcJCADornvblgABAgQIECBAgAABAgQIECDQ8QIHRka3V3J6b0Q+rZHLphQ3rZ2eeF8je6hNgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEB3CQgA6K5725YAAQIECBAgQIAAAQIECBAg0PECc0Nj2yLlyyKiv5HLViL9WX9t/CWN7KE2AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQLdJSAAoLvubVsCBAgQIECAAAECBAgQIECAQMcLzA2PXRmRL4+ItY1cNud49Gmr4vmrJyZ+3Mg+ahMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg0D0CAgC659Y2JUCAAAECBAgQIECAAAECBAh0hcDsyOjlKcf7ImJdgxdeWIriletrU19ucB/lCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBDoEgEBAF1yaGsSIECAAAECBAgQIECAAAECBLpFYH5k7LKc8xWNDgBIKS0WRb5ucGbiqm6xtScBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAo0VEADQWF/VCRAgQIAAAQIECBAgQIAAAQIEmiwwP1y9NEd6f0Ssb3DrIkX6Yn9t/FUpIje4l/IECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECHSBgACALjiyFQkQIECAAAECBAgQIECAAAEC3SQwPzx6SY58ZUQ6vcF750jpb1JP8c/WTk4+1OBeyhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg0AUCAgC64MhWJECAAAECBAgQIECAAAECBAh0k8DcyOjFkWNrRDyr0XunSIeKpcXzB+/Z891G91KfAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIHOFxAA0Pk3tiEBAgQIECBAgAABAgQIECBAoKsE5obGfjelvDVHnNmExR+uRLytvzZxZxN6aUGAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQIcLCADo8ANbjwABAgQIECBAgAABAgQIECDQbQJzw9V3RErbIsdZjd49R/w0In90sDZ5TaN7qU+AAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQOcLCADo/BvbkAABAgQIECBAgAABAgQIECDQVQKzw6NvSxEfiIizm7D4Qo7444HaxOtSRG5CPy0IECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEOhgAQEAHXxcqxEgQIAAAQIECBAgQIAAAQIEulFgfmTsLTnn7RGxoQn7FxH5+32LR85/5r59B5vQTwsCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBDpYQABABx/XagQIECBAgAABAgQIECBAgACBbhSYHzrnopzyByPyUJP2vzcq6cKBPePfaVI/bQgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQ6FABAQAdelhrESBAgAABAgQIECBAgAABAgS6VWB+ePSNOeKqiBhuhkGOmM2RLl5XG/98M/rpQYAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBA5woIAOjc29qMAAECBAgQIECAAAECBAgQINCVAgeGqhdVUnwwIg01CeDByHHjwMzER5rUTxsCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBDpUQABAhx7WWgQIECBAgAABAgQIECBAgACBbhU4ODz6thzxgRxxdjMMcsSRFPG5gdrEG5vRTw8CBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBDpXQABA597WZgQIECBAgAABAgQIECBAgACBrhSYGxl7V+S8NSLOaBJAERHfWewpfuv0qakDTeqpDQECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECHSggAKADj2olAgQIECBAgAABAgQIECBAgEA3C8wPVy/Nkd4fEeub6DARKb1uYHr8203sqRUBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAh0mIACgww5qHQIECBAgQIAAAQIECBAgQIBAtwvMDY9eERGXR8Rg0yxy7CtSunxdbfzzTeupEQECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECHScgAKDjTmohAgQIECBAgAABAgQIECBAgEB3C8wNVbdFSpdFRH8TJeaLSDetq41f38SeWhEgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg0GECAgA67KDWIUCAAAECBAgQIECAAAECBAh0u8DscPXqFOnSiHhmEy0Op4jPrK1NvL2JPbUiQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKDDBAQAdNhBrUOAAAECBAgQIECAAAECBAgQ6HaBuaHRnZHi3RGxuokWRY74ixx9r1pX231/E/tqRYAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBABwkIAOigY1qFAAECBAgQIECAAAECBAgQIEAgYm549PqIuDgiTmmuR/pRpHjzwPT4t5vbVzcCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBDpFQABAp1zSHgQIECBAgAABAgQIECBAgAABAn8nMDsy9rHI+XdTxEnNJEkRe6LI71+7d/ILzeyrFwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECnSMgAKBzbmkTAgQIECBAgAABAgQIECBAgACBiJgbGr0lUrw9IvqaDPJATunGwenxjzW5r3YECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECHSIgACADjmkNQgQIECAAAECBAgQIECAAAECBCJyRJofHr09It4aEZWmmqR4JIr8n2ozz3zvr8Suhab21owAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgY4QEADQEWe0BAECBAgQIECAAAECBAgQIECAwOMCOaIyNzL2Bynni5otkiKWIsdXVx0p3rT6gakDze6vHwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEC7S8gAKD9b2gDAgQIECBAgAABAgQIECBAgACBvxfIW7b0zc8/9MmIeGNrUNJfpaJ469q9k3/bmv66EiBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECDQzgICANr5emYnQIAAAQIECBAgQIAAAQIECBD4GYGfbNhw2lLlpNtzxKtbQ5N/FEV678Deif/emv66EiBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECDQzgICANr5emYnQIAAAQIECBAgQIAAAQIECBD4GYG5s8bOjN58a0Rc2AqaHLEncr5qcGbys63orycBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAu0tIACgve9negIECBAgQIAAAQIECBAgQIAAgX8gcOCsTdWevsonco4LWgOT708RH11bm/xEa/rrSoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAOwsIAGjn65mdAAECBAgQIECAAAECBAgQIEDgZwQObjz3F4qlpZsjxW+0iOahiHzbQG1yW4v6a0uAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQBsLCABo4+MZnQABAgQIECBAgAABAgQIECBA4GcF5kbGfjXlfGOOeGGLbJYipzuLw73vWDe7+5EWzaAtAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJtKiAAoE0PZ2wCBAgQIECAAAECBAgQIECAAIF/LDA7XP31SqTrc8SvtconRf7K0eh957Nqd9VaNYO+BAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi0p4AAgPa8m6kJECBAgAABAgQIECBAgAABAgSeQODA8KaXVaJybUT8cquAUsSf9xTFpWv2Tu1q1Qz6EiBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECDQngICANrzbqYmQIAAAQIECBAgQIAAAQIECBB4AoG5obELI+UdEfGcVgHliP9ViZ4r19bu+lqrZtCXAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIH2FBAA0J53MzUBAgQIECBAgAABAgQIECBAgMATCMwOjf5OVOKalKPaMqAckznyhwZnJj/bshk0JkCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgLQUEALTl2QxNgAABAgQIECBAgAABAgQIECDwRAIHRqoXVXK6KiI2tE4o3R+RrxuoTdzSuhl0JkCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgHQUEALTj1cxMgAABAgQIECBAgAABAgQIECDwhAJzI5velXPaniKtbxVRjni0kuPmtTMTjwcR+I8AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQLHLSAA4Lip/JAAAQIECBAgQIAAAQIECBAgQKDsArMjo+9LOW2NyKe1ctac0x8eWeq95Ox9uw+2cg69CRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBoLwEBAO11L9MSIECAAAECBAgQIECAAAECBAg8hcDscPXqFOmKiDillVA58p/kxXzZun1Tk62cQ28CBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBNpLQABAe93LtAQIECBAgAABAgQIECBAgAABAk8ikCMqB4fHbsqRL209Uv5mb5GvWLN3alfrZzEBAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQLtIiAAoF0uZU4CBAgQIECAAAECBAgQIECAAIGnFDg0PLymSKtuzDm/uQRU30uRt62tTX6tBLMYgQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBNhEQANAmhzImAQIECBAgQIAAAQIECBAgQIDAUwvMb9p0dixVbsgRr265VY7JnOKqwdrEnS2fxQAECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECLSNgACAtjmVQQkQIECAAAECBAgQIECAAAECBJ5KYH5DdXPRkz6acryiBFIHIqcPD8yM31aCWYxAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgECbCAgAaJNDGZMAAQIECBAgQIAAAQIECBAgQOCpBeaGR8+LSNdF5BeXwOpI5LjpUF/eOTo5+VgJ5jECAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJtICAAoA2OZEQCBAgQIECAAAECBAgQIECAAIFjC8xtHP2NKOLaiHj+sX/dlF/ccVJPsXX11NSBpnTThAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEJw1IKwAACAASURBVCBAgACBthcQAND2J7QAAQIECBAgQIAAAQIECBAgQIDA4wJzQ2MXppR35ojNZRBJKb5YpKVtg3v2jJdhHjMQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIFB+AQEA5b+RCQkQIECAAAECBAgQIECAAAECBI5DYG6k+vrIaWdEbDiOnzf8JynFN3KkbQPT499ueDMNCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBDoCAEBAB1xRksQIECAAAECBAgQIECAAAECBAjMjYxeHDl2RMQzS6Lx/SKKbetqU18tyTzGIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECg5AICAEp+IOMRIECAAAECBAgQIECAAAECBAgcWyBv2dI3N//wByqRt+WIvmN/0fhf5IipSspb105P/nHju+lAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEAnCAgA6IQr2oEAAQIECBAgQIAAAQIECBAg0OUCh4aH1yxF34ci4t0RUZa/87ovIm0dqI1/usvPY30CBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBI5ToCz/GPo4x/UzAgQIECBAgAABAgQIECBAgAABAv9YYG5s7Mw4mndExBtL5PNg5LxtYGby9hLNZBQCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBEosIACgxMcxGgECBAgQIECAAAECBAgQIECAwPEJzI6cc06KYmfk+DfH90UTfpVjsYi45sDT+2547u7dR5vQUQsCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBNpcQABAmx/Q+AQIECBAgAABAgQIECBAgAABAhE/Gao+bzGlayPiN8vkkXPc1NOztLN/z54HyzSXWQgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQKKeAAIBy3sVUBAgQIECAAAECBAgQIECAAAECyxA4NDL6wiKn63LkFyzjs8b/NKXbl2Lhw+unpx9ofDMdCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBodwEBAO1+QfMTIECAAAECBAgQIECAAAECBAjEwY2jryiKuCEinl0qjpw+0xvp6jUzd0+Xai7DECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBQSgEBAKU8i6EIECBAgAABAgQIECBAgAABAgSWIzA3Un1d5MqNEfn05XzXhN/+55OKvH313sndTeilBQECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECbS4gAKDND2h8AgQIECBAgAABAgQIECBAgEC3C0wPDz/t1NR3ceTYkSJOKpnH1/NSZdvgPXd/t2RzGYcAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgRIKCAAo4VGMRIAAAQIECBAgQIAAAQIECBAgcPwC91Wrg6sWK1tz5EuP/6um/fJ/VlJ6f//0+J83raNGBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi0rYAAgLY9ncEJECBAgAABAgQIECBAgAABAgQeF/jJhtGNiyl9KFJ+fflE8o+WIt63vjb5tfLNZiICBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBMomIACgbBcxDwECBAgQIECAAAECBAgQIECAwLIEDo2M/ZMi52tzxMuX9WETfpwi9uRIlw3Uxr/chHZaECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECDQ5gICANr8gMYnQIAAAQIECBAgQIAAAQIECHS7wIGRsX9eyfnGiDivhBYHKhHv6a9N3FnC2YxEgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEDJBAQAlOwgxiFAgAABAgQIECBAgAABAgQIEFiewIGhsZenlG9JEZuW92Uzfp0P50iXDtQmPpUiimZ01IMAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgfYVEADQvrczOQECBAgQIECAAAECBAgQIECg6wVyRM/8yNjvRM63RMSaEoIUlcjbHl08csvZ+/b9tITzGYkAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgRIJCAAo0TGMQoAAAQIECBAgQIAAAQIECBAgsDyBvHnzqfOHj74rIu2MiJ7lfd2sX+freoujN67Zu/dQszrqQ4AAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAewoIAGjPu5maAAECBAgQIECAAAECBAgQIEAgIg4MD5+eou/9KeI9pQXJ+fdzLFw7ODNzX2lnNBgBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAqUQEABQijMYggABAgQIECBAgAABAgQIECBAYCUCD5xd3dTTm66JHK9dyfdN+ubTvblyzZqZu6eb1E8bAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTaVEAAQJseztgECBAgQIAAAQIECBAgQIAAAQIRB0fO+cUiFzdGxPkl9vhS5Ng+MDPx4xLPaDQCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBEogIACgBEcwAgECBAgQIECAAAECBAgQIECAwMoE5oc2vSBS5bYc8Usrq9CUr76ec75ycGbye03ppgkBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAm0rIACgbU9ncAIECBAgQIAAAQIECBAgQIBAdwv8UUTPi0eqF6Sc/iAi1pdY46+XcnHZ+pmpvyrxjEYjQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKAEAgIASnAEIxAgQIAAAQIECBAgQIAAAQIECCxfIG/efOrc4aNvSZFujIie5Vdo2hd/G7ny7oGZu7/ZtI4aESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECDQlgICANrybIYmQIAAAQIECBAgQIAAAQIECBC4f9Omdb1Llcsi4oqSa+zPKb99cHryv5Z8TuMRIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINBiAQEALT6A9gQIECBAgAABAgQIECBA4H+zc+fRdZ/lncCf915JThxIiCU5QXEs2ZZsx8PSqctQppQGugEtpS3QaSG0JU2HNSSBJGRPSEIIk4V0SFgKlJatlALdgJmhzGk6FBjKUgaGJJautTiOS2xJdkJIbEv3vnPock4Pk8XWvbq6v/v7/P97lu/n9V/3yA8BAgSWJnBgdHTT4kJcHym9eGkd2lWV5iPHWQMz43/WronmECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBQTAEHAIr5brYmQIAAAQIECBAgQIAAAQIECJReYP+GzU9t5PzuHPHjHY7xvdTIZ/bvqn2iw/e0HgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECKyzgAMAKP4DxBAgQIECAAAECBAgQIECAAAECSxOYX7/lJxqVxp9ExClL69CeqhxxKCL99uD0+MfaM9EUAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSKKuAAQFFfzt4ECBAgQIAAAQIECBAgQIAAgRIL3L1u3bGre1e/LOf8+xHR2b9x5VyPHK/o31X7cIrIJX420QkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeAyBzv7jaM9HgAABAgQIECBAgAABAgQIECBA4GEEdp+ytf+Ynvp5keLSIgClnH73WzNDf/jsuH2xCPvakQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBlRFwAGBl3E0lQIAAAQIECBAgQIAAAQIECBBoQmDulNF1uSeui5Re3kSb9pXm/Nr9vfH+sVrtUPuGmkSAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQNEEHAAo2ovZlwABAgQIECBAgAABAgQIECBAIPZu3DiWGtX3pYhnFYEjRz5vYPHge9Lu3Q8VYV87EiBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECCwMgIOAKyMu6kECBAgQIAAAQIECBAgQIAAAQJLFMgRaXbjlu2pUf9ERBpeYpu2llVSXLh4bO+71t5xxwNtHWwYAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQKFEnAAoFDPZVkCBAgQIECAAAECBAgQIECAAIG8bVvf/AP1X2pUGh9OEasKIZLiskqq37pmcvK+QuxrSQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEVkTAAYAVYTeUAAECBAgQIECAAAECBAgQIEBgqQJzo6PH58XKayPydUvt0e66HOnqg4s9v3fq7jvm2z3bPAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEiiPgAEBx3sqmBAgQIECAAAECBAgQIECAAAECEfG90dHBQwvp+khxZnFA8vULPXHzE2u1fcXZ2aYECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECLRbwAGAdoubR4AAAQIECBAgQIAAAQIECBAg0JTA3KZNpzYW0x+nlH6iqUZtLE4p37QY9RtOmpq6t41jjSJAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoGACDgAU7MGsS4AAAQIECBAgQIAAAQIECBAos8DHI6o/PTz6Hxop/UWKGCyMRY535Ebl+sG7d+wpzM4WJUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECg7QIOALSd3EACBAgQIECAAAECBAgQIECAAIGlCkyNjBzzuNx3Rkr5PRFRWWqfFah7d+rJb+mv1XavwGwjCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAoiIADAAV5KGsSIECAAAECBAgQIECAAAECBAhE7Nuy5fFxKL85RT6vYB5/UE09V584dedMwfa2LgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECbRRwAKCN2EYRIECAAAECBAgQIECAAAECBAg0J7D7lK39q3oXP5wiPbe5Tm2uzvlDizlddfKuick2TzaOAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIECCTgAUKDHsioBAgQIECBAgAABAgQIECBAoMwCOSLt2bBl86pc/1xEWl8kixz5T3KlcfnaycmJIu1tVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE2ivgAEB7vU0jQIAAAQIECBAgQIAAAQIECBBYokCOqM4Nb/6lSI0/jUjVJbZZkbIU8alGqlwyOLVjx4osYCgBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAoUQcACgEM9kSQIECBAgQIAAAQIECBAgQIAAgbxtW9/sA4sXpUp+c+E0cnw65fym/l21Owq3u4UJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEGibgAMAbaM2iAABAgQIECBAgAABAgQIECBAoBmBu9etO3Z1zzF/lCO9pJk+K1T7ucVK/fyTJye/vULzjSVAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoAACDgAU4JGsSIAAAQIECBAgQIAAAQIECBAgEHHXwJbHDzyu8ZWIOK14Hvlvqqly3olT4/+neLvbmAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBdgk4ANAuaXMIECBAgAABAgQIECBAgAABAgSaEti7YexZlRx/21STFSrOOX8xIl4/OFP7xgqtYCwBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgUQcACgAI9kRQIECBAgQIAAAQIECBAgQIAAgYh9I2OvTBHvLqJFjvhCzvmctTO1fyji/nYmQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKA9Ag4AtMfZFAIECBAgQIAAAQIECBAgQIAAgSYF5kbG3p8jzmyyzYqUp4gvVHI+50QHAFbE31ACBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECRRFwAKAoL2VPAgQIECBAgAABAgQIECBAgECJBfLQ9tWzffd/KUU8tYgMKae/a0TjnMGZ2jeKuL+dCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBoj4ADAO1xNoUAAQIECBAgQIAAAQIECBAgQKAJgfmNm5+ZG/l/5oi+JtqsZOntjYjz1k5PfHMllzCbAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIHOFnAAoLPfx3YECBAgQIAAAQIECBAgQIAAAQIRsW947IKU4r8UFiPF5+tReeNJUzu+VdgMFidAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYNkFHABYdmIDCBAgQIAAAQIECBAgQIAAAQIEmhHIEZX5kbE/zRG/2kyflaxNkf5bNBoX9O+qfWcl9zCbAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIHOFnAAoLPfx3YECBAgQIAAAQIECBAgQIAAgdILzK7bfEr05K9ExCkFxviryPGmgZmJOwucweoECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECCyzgAMAywysPQECBAgQIECAAAECBAgQIECAQHMC+0c2/XI9Kn/WXJeVrU4Rn2qkyiWDUzt2rOwmphMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg0MkCDgB08uvYjQABAgQIECBAgAABAgQIECBAIGZHRq+LSBcXmSJF+ni9snjZ2snJiSLnsDsBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAssr4ADA8vrqToAAAQIECBAgQIAAAQIECBAg0ITAnqHtq/tW3f+XkeOnm2iz4qU54qONer7ipLtrO1d8GQsQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINCxAg4AdOzTWIwAAQIECBAgQIAAAQIECBAgQGD/hs1PXcz5cylibcE1/mgxV9588syOqYLnsD4BAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAsso4ADAMuJqTYAAAQIECBAgQIAAAQIECBAg0JzA3PDomTml2yLimOY6rWx1zun9C5WFa4ampmZWdhPTCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBDoZAEHADr5dexGgAABAgQIECBAgAABAgQIECi5wN7hzbdVUv7diOgtOMW700J+S/89td0Fz2F9AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSWUcABgGXE1ZoAAQIECBAgQIAAAQIECBAgQGDpAt/dtGltT7366Yi8PSIqS+/UAZUp35oXq28dvHvHng7YxgoECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECHSogAMAHfow1iJAgAABAgQIECBAgAABAgQIlF1gdtOm50S98scRsbboFjnyLTkW37Z2evq7Rc9ifwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIElk/AAYDls9WZAAECBAgQIECAAAECBAgQIECgCYF9G8bOTzmuiIjHN9GmI0pTjhsWeho3nrxz596OWMgSBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAh0pIADAB35LJYiQIAAAQIECBAgQIAAAQIECJRbIG/f3js3d99HUqQX5oi+4mvkt/Ydrtx8/J7x2eJnkYAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgeUScABguWT1JUCAAAECBAgQIECAAAECBAgQWLLA7MjY0yPi4xGxfslNOqgwRbq6Z/HB3zth9+75DlrLKgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIdJiAAwAd9iDWIUCAAAECBAgQIECAAAECBAgQiJgfGXtVznFNTjHQDR4pxxWVtPCOE6enD3RDHhkIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEFgeAQcAlsdVVwIECBAgQIAAAQIECBAgQIAAgSUK5G3b+ua/v3hbTvmlEbF6iW06qqwR6ZL7ehq3jdVq93fUYpYhQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKCjBBwA6KjnsAwBAgQIECBAgAABAgQIECBAgMD+DZufupjzB1PEkyOiK36/yikuqD947LtOvvdb3/fCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeCSBrvgDas9LgAABAgQIECBAgAABAgQIECDQPQKzG0ZfHpGuixzruiVVjnzewcWD7zl19+6HuiWTHAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQItF7AAYDWm+pIgAABAgQIECBAgAABAgQIECCwRIGPR1SfMzJ2c85xZkrxuCW26byynF63v7fxvrFa7VDnLWcjAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQ6RcABgE55CXsQIECAAAECBAgQIECAAAECBAjE/NDG9fXeykdTSv8xIrrlt6t6yvk/f2um9sFnRyx6ZgIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECDySQLf8EbUXJkCAAAECBAgQIECAAAECBAgQ6AKBueGxF+VKXB85Rrsgzr9GuL+RKr87OLXjT1NE7qJcohAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg0GIBBwBaDKodAQIECBAgQIAAAQIECBAgQIDA0gTy6Oiq+cXKJRH5tTmif2ldOrJqT6USr1wzOfHpjtzOUgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIdIyAAwAd8xQWIUCAAAECBAgQIECAAAECBAiUW+DA+rGNi5W4JUU8N0f0dpHGjmjE6wZ2TXy+izKJQoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIDAMgg4ALAMqFoSIECAAAECBAgQIECAAAECBAgcvcDe4c3Pr0R+W6R40tFXd3BFjq83Kum8tVPjX+jgLa1GgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEAHCDgA0AGPYAUCBAgQIECAAAECBAgQIECAAIGIvcNjl1ZTnJcj+rvM4/aopAsHJse/2mW5ukvfVAAAIABJREFUxCFAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoMUCDgC0GFQ7AgQIECBAgAABAgQIECBAgACBoxfYP7J1pB71m1PEL+WI6tF36OCKHJ+uVKuXrJm869sdvKXVCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBDoAAEHADrgEaxAgAABAgQIECBAgAABAgQIECi7wPzw5ufllK/LET/SbRY54mNRqV85ODk53m3Z5CFAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoLUCDgC01lM3AgQIECBAgAABAgQIECBAgACBoxTYMzS0uq9v9TkR6byIGDzK8o7/POX83lRtXLtmcnJXxy9rQQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEVlTAAYAV5TecAAECBAgQIECAAAECBAgQIEBgdnjstEjprRH5BRFR6TaRHPnt9Wq+/uSdO/d2WzZ5CBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBorYADAK311I0AAQIECBAgQIAAAQIECBAgQOAoBeY3jv1izuktOeenHGVpIT5Pka6OnsZN/bXa/YVY2JIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKyYgAMAK0ZvMAECBAgQIECAAAECBAgQIECAwM6NG084vtFzXop8bkSc0IUiOaW4cL6a3zFWqx3qwnwiESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECDQQgEHAFqIqRUBAgQIECBAgAABAgQIECBAgMDRCdy7YcNTKo2e61KKXzi6yoJ8neOBlOL1/dMTHyjIxtYkQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGAFBRwAWEF8owkQIECAAAECBAgQIECAAAECZRa4KqLyupEtL8jReGuKOK1LLe6tRDp3zfT4x7o0n1gECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECLRQwAGAFmJqRYAAAQIECBAgQIAAAQIECBAgcOQC9w9tHjjc13hDjjgnRVp95JXF+TJHTKaovGFgesdfFGdrmxIgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgsFICDgCslLy5BAgQIECAAAECBAgQIECAAIGSC+wdGfuRasRbcsTzu5cifzulOL9/qva57s0oGQECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECrRJwAKBVkvoQIECAAAECBAgQIECAAAECBAgcsUCO03vmh+95YSPF21LEpiMuLN6HX66k9KY1U+NfKN7qNiZAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoN0CDgC0W9w8AgQIECBAgAABAgQIECBAgACB2DsycnLKPedXUjo7R/R1LUmKz0dKlwxMjn+1azMKRoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAywQcAGgZpUYECBAgQIAAAQIECBAgQIAAAQJHKrBv/abtqVK5MSJOP9KaYn6X/qJSrV+2ZufO/1vM/W1NgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEA7BRwAaKe2WQQIECBAgAABAgQIECBAgAABApFHRo6Zi95fj4ibImJNN5PkiD/O1cYVa3furHVzTtkIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEGiNgAMArXHUhQABAgQIECBAgAABAgQIECBA4AgF5jduXJ9z5fKc01lHWFLYz1LE7zfqlTcP3r1jT2FDWJwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbYJOADQNmqDCBAgQIAAAQIECBAgQIAAAQIEckTaO7zpGdVUeW9EbOt2kZTSzZV8+JoTp6cPdHtW+QgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQaF7AAYDmDXUgQIAAAQIECBAgQIAAAQIECBA4QoG50dHjYyHOyildHxG9R1hW1M8ORY5r+nvzjalWO1TUEPYmQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKB9Ag4AtM/aJAIECBAgQIAAAQIECBAgQIBA6QUODG/ZsJjy2yPyC0uAsTendNnA1Pj7UkQuQV4RCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBoUsABgCYBlRMgQIAAAQIECBAgQIAAAQIECByZQB4dXbV3If1CNcWtEfHEI6sq8ldpPHK+eGBm4lNFTmF3AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTaJ+AAQPusTSJAgAABAgQIECBAgAABAgQIlFpgz9Dmgb6+fFlEnB0RlRJgfKWaKxefOLPjb0qQVUQCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBFog4ABACxC1IECAAAECBAgQIECAAAECBAgQeHSBqyIqZ68fPS1X0gci4mll8EqR/ns9Ny5ZO1P7hzLklZEAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgeYFHABo3lAHAgQIECBAgAABAgQIECBAgACBxxDI69YdO9e7+syU8805oq8MYDniYz1RvfjE6bumy5BXRgIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEmhdwAKB5Qx0IECBAgAABAgQIECBAgAABAgQeQ+C+ddvWLPQsvjsiv6QMWCmikVN+1/fy4mUbpqcPlCGzjAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQINC/gAEDzhjoQIECAAAECBAgQIECAAAECBAg8ikCOqM5t2vJTUa9/NCKdVBKs+3KOawdnJm4sSV4xCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBogYADAC1A1IIAAQIECBAgQIAAAQIECBAgQOCRBaZGRo45LvqurES+qCxOKWJXRFzVPz3xgbJklpMAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgeYFHABo3lAHAgQIECBAgAABAgQIECBAgACBRxHYMzQ00Nd33Kcj4ullgUqRvt1IjcsGp2p/WZbMchIgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg0LyAAwDNG+pAgAABAgQIECBAgAABAgQIECDwCAI5Is0Nj/1KpPhkmZByjr9r5MpFJ+3a8cUy5ZaVAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIHmBBwAaM5PNQECBAgQIECAAAECBAgQIECAwKMI7B3c9rjKcQsfjIhfKRNUjvhsynH+wMzEnWXKLSsBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAs0JOADQnJ9qAgQIECBAgAABAgQIECBAgACBRxGYG9n03IjKR3LEmrJApYhGzumjq3rqb3z8zp17y5JbTgIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEmhdwAKB5Qx0IECBAgAABAgQIECBAgAABAgQeRmBqZOSY42PVLTkarywZ0IM5x20Dx/Velu6443DJsotLgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEATAg4ANIGnlAABAgQIECBAgAABAgQIECBA4JEF9q3fuj1VGp+IyCMlc7o3R75+cLp2S8lyi0uAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQJMCDgA0CaicAAECBAgQIECAAAECBAgQIEDg4QXmRjZflSNfWTafnGNnI+erTtpV+3DZsstLgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBzAg4ANOenmgABAgQIECBAgAABAgQIECBA4GEEvju8ZUM1NT6VIn6kbEA54puNyBedNF37H2XLLi8BAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAs0JOADQnJ9qAgQIECBAgAABAgQIECBAgACBhxGYHxl9dSPSLRHRVzagHPGFyPncwZnaN8qWXV4CBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBJoTcACgOT/VBAgQIECAAAECBAgQIECAAAECPySwb3j4iZH63pcinhsRlbIB5YjPLlTqrx6anNxVtuzyEiBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECDQnIADAM35qSZAgAABAgQIECBAgAABAgQIEPghgbn1oy/OlXhHRDq5bDgp4nAjpw8drD949qm7dz9UtvzyEiBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECDQnIADAM35qSZAgAABAgQIECBAgAABAgQIEPg3AnOjo8dHvXJTI+eXp4hVZcNJkfY3It4xMD1+VYrIZcsvLwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECzQk4ANCcn2oCBAgQIECAAAECBAgQIECAAIF/I7BveMuzIzXekyJGI6KMvz3dEzlfNzBTe6d/GAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEDhagTL+EfbRGvmeAAECBAgQIECAAAECBAgQIEDgCAX2jWx+c4p8bkQcf4Ql3fbZXRHp4oHp8T/vtmDyECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECCw/AIOACy/sQkECBAgQIAAAQIECBAgQIAAgVIIHDh1dNNiJT4WKf1oRFRKEfqHQqZIX1qoV1958t13/t8y5peZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIHmBBwAaM5PNQECBAgQIECAAAECBAgQIECAwL8IzI2MnZMjLomItWVESSkt5hyfOdwXZw2Nj8+W0UBmAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSaE3AAoDk/1QQIECBAgAABAgQIECBAgAABAhExv3Hrk3OjfmuO+ImIqJYU5b6I9K7+6fFLUkQuqYHYBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAg0IeAAQBN4SgkQIECAAAECBAgQIECAAAECBP7pf7qn2ZGxV6aIyyLilBKb3JMjrh6cnvj9EhuIToAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAEwIOADSBp5QAAQIECBAgQIAAAQIECBAgQCBidmTz1sj5hpTi53JEX4lNdqQUZ/dPTfx1iQ1EJ0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgCQEHAJrAU0qAAAECBAgQIECAAAECBAgQKLtAjqjOjYy9PEdckSI2lNgjR8RXG4v1M9bunpwosYPoBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAg0IeAAQBN4SgkQIECAAAECBAgQIECAAAECZRfYu2nTaKpXrk4RvxwRx5bY42Dk/MnvpcWzNkxPHyyxg+gECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECDQh4ABAE3hKCRAgQIAAAQIECBAgQIAAAQJlFvja9u29w3P3vzgirkwRW8psEZH354hbBqdrV5fbQXoCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBJoRcACgGT21BAgQIECAAAECBAgQIECAAIESC+zfsGF4sVG9NEX6jUjxuBJT/CD6PZUcF66ZmfhoyR3EJ0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgCQEHAJrAU0qAAAECBAgQIECAAAECBAgQKKtAjtN75kb2/GKO/OYU8ZSyOvxr7pyilnKcMTA98ZWyW8hPgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgMDSBRwAWLqdSgIECBAgQIAAAQIECBAgQIBAaQVm120+JfXk83PEmRFxfGkh/jl4PUV86VBf+tWh8fHZkluIT4AAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAEwIOADSBp5QAAQIECBAgQIAAAQIECBAgUEaBHFGdHxn9mRzpmoh4WhkNfijzgxHxwYHpiVezIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQDMCDgA0o6eWAAECBAgQIECAAAECBAgQIFBCgQdGRk4+GH3nROQf/If3E0pI8MORD+Scrxmcqd3MggABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAs0IOADQjJ5aAgQIECBAgAABAgQIECBAgEDJBHKc3jO3/p7ToxLXRMSPlyz+I8W9NzfirMFdE5/mQYAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgWYEHABoRk8tAQIECBAgQIAAAQIECBAgQKBkAt8fPu2JD6XFcyLi1RFxfMniP1zcHJEmcmXxBYOTk+M8CBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg0IyAAwDN6KklQIAAAQIECBAgQIAAAQIECJRIIJ9+es/c5J6fSpX8lhzx9BJFf+SoKRZzjs89EAsv2jA9fZAJAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEmhFwAKAZPbUECBAgQIAAAQIECBAgQIAAgRIJfH/4tCcerCy+Ied4TUSsLlH0R4t6MKW4tX9q4gIeBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQaFbAAYBmBdUTIECAAAECBAgQIECAAAECBEogkLdv753b971nRWq8LVLaXoLIRxYxxQONRj537Uzt/UdW4CsCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAg8soADAP51ECBAgAABAgQIECBAgAABAgQIPKbA3pGRk6vRc2GO9NqI6HvMgvJ8cKCvJz//+Frty+WJLCkBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAssl4ADAcsnqS4AAAQIECBAgQIAAAQIECBDoEoG8fXvv3OyBn8yp8vYU8ZQuidWKGDlyfKcnH3rWE3bt2t+KhnoQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIFBuAQcAyv3+0hMgQIAAAQIECBAgQIAAAQIEHlPg/s2bBw4dzpemiNdHROUxC8rzQSMi/VX/9PivpIhcntiSEiBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECCwXAIOACyXrL4ECBAgQIAAAQIECBAgQIAAgS4Q+Nr27b2bZh94Zj013hkRW7sgUusipFjMEZcMTk3c0LqmOhEgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgUGYBBwDK/PqyEyBAgAABAgQIECBAgAABAgQeQ2D3KVv7j+lbvDpyeg2s/0/gYI7q8wan77qdDQECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBFoh4ABAKxT1IECAAAECBAgQIECAAAECBAh0ocDfRPQ8eePY6ZHjXZFjtAsjNhWpkeJbPan+rDWTk/c11UgxAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE/kXAAQD/FAgQIECAAAECBAgQIECAAAECBB5WYM/Q5oHe3sZbU0pnIXpYgT8cmJ54BRsCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi0SsABgFZJ6kOAAAECBAgQIECAAAECBAgQ6CKBHFGZHdn8aynyTREx1EXRWhnlFQPTE3/YyoZ6ESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBQbgEHAMr9/tITIECAAAECBAgQIECAAAECBB5WYN+pW4ai2nhving+oocVuD8iPX1gevwuPgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEGiVgAMArZLUhwABAgQIECBAgAABAgQIECDQJQI5Tu+ZH97z+pzytRFxbJfEam2MFJ/vn5r4uRSRW9tYNwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEyizgAECZX192AgQIECBAgAABAgQIECBAgMDDCNy7YfNTqzl/ICL+PaBHEEhx7cDUxOV8CBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg0EoBBwBaqakXAQIECBAgQIAAAQIECBAgQKDgAvMbN56QGz1X5sjnFTzKsq2fIg43cvzq4MzEZ5ZtiMYECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECJRSwAGAUj670AQIECBAgAABAgQIECBAgACBhxfYt3HsF6MR/zVFbGD0SAJpPOfq6YMzd/4jIwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECLRSwAGAVmrqRYAAAQIECBAgQIAAAQIECBAosMD8xo0n1OvVj6QUz4uISoGjLO/qOT7y7ZmJ3352xOLyDtKdAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIGyCTgAULYXl5cAAQIECBAgQIAAAQIECBAg8AgCs+tHz4hKujUiToD0KAI5v65/pvauFNHgRIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgVYKOADQSk29CBAgQIAAAQIECBAgQIAAAQIFFbh3w+anVhr51pTiGRFRLWiM5V87xz31SvqFtVPj30oRefkHmkCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQJkEHAAo02vLSoAAAQIECBAgQIAAAQIECBB4GIE9Q9tX9/bdd0El0rk54gmQHlkgR/xVTyz85onT0wc4ESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoNUCDgC0WlQ/AgQIECBAgAABAgQIECBAgEDBBGbXj/1MVPLNEenfRUSlYOu3d90cl/enhRvT9PTB9g42jQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBMgg4AFCGV5aRAAECBAgQIECAAAECBAgQIPAIAvuGh5+YUt8VEfGyiHg8qEcVmI9G+rX+XeO3p4g6KwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECLRawAGAVovqR4AAAQIECBAgQIAAAQIECBAokMDcyOb/1Mj52pRiU0T4rejR3+72hxbTGafuHr+nQE9sVQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIHoESgAAAgAElEQVQECiTgj7oL9FhWJUCAAAECBAgQIECAAAECBAi0UmB2eOy0SPm6iPTciDimlb27sVdK+aaUGtesmZy8rxvzyUSAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAwMoLOACw8m9gAwIECBAgQIAAAQIECBAgQIDAigjsGxl7ZYq4NCJOXZEFijV0IUfjNw/0pD8bq9UOFWt12xIgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgUBQBBwCK8lL2JECAAAECBAgQIECAAAECBAi0SCBHpPnhrT+eU/2miHhGi9p2d5uUv1ZfjF8/6e7azu4OKh0BAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAisp4ADASuqbTYAAAQIECBAgQIAAAQIECBBYAYH71m1bc7hn8fUp8qsjYu0KrFC4kTnn9zYq9ctPmpq6t3DLW5gAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgcIIOABQmKeyKAECBAgQIECAAAECBAgQIECgeYEc0bNvePPPViKujpR/rPmOpehwOOd85gNp8ZMbpqcPliKxkAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIrIiAAwArwm4oAQIECBAgQIAAAQIECBAgQGBlBA4Mb9mwmBoXRMTLIuL4ldmicFO/0cj5rMGZ2jdTRC7c9hYmQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKAwAg4AFOapLEqAAAECBAgQIECAAAECBAgQaE4gj4wcM5t7XpRSujQiTmuuW6mqP5B68hX9tdruUqUWlgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBtgs4ANB2cgMJECBAgAABAgQIECBAgAABAu0XyBFp/8atT8qNxuUR+YU5oq/9WxRvYk7xQMr5wsbqvg+tveOOB4qXwMYECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBRJwAGAIr2WXQkQIECAAAECBAgQIECAAAECSxTYuXHjCY/PPS+v5nxhjjh1iW3KWPb3CymdffLU+FdTRC4jgMwECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECLRPwAGA9lmbRIAAAQIECBAgQIAAAQIECBBYEYE8OrpqrpF+Mjfi0hRx+oosUdChKaf3H6pUrxmaunOmoBGsTYAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAgQQcACjQY1mVAAECBAgQIECAAAECBAgQILAUgQNjYxsXF+KCiHhpRBy/lB4lrZlPjbh44dD9Hzn53nu/X1IDsQkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQaKOAAwBtxDaKAAECBAgQIECAAAECBAgQINBugfmNG09o1CtnRCVdFDnWtXt+wed9uZ7zG0+aqX254DmsT4AAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAQQQcACjIQ1mTAAECBAgQIECAAAECBAgQIHC0AhOjo6tOPJx+Mqe4MqV45tHW+z4+UI3q1SdO3zXNggABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAu0QcACgHcpmECBAgAABAgQIECBAgAABAgTaL5B2j46ecuxiuixHnBERx7V/hUJP3JtyvnRNWvxwmp4+WOgklidAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoDACDgAU5qksSoAAAQIECBAgQIAAAQIECBA4coE9Q0Ore1c97mUp57dExOCRV/ryBwIp5S/W642L1u6a/DsiBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQaJeAAwDtkjaHAAECBAgQIECAAAECBAgQINAmgRyn98yO7H5mirguIj2jTWO7Z0yKxdzIH6hWG9eumZzc1T3BJCFAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoNMFHADo9BeyHwECBAgQIECAAAECBAgQIEDgKAXuXrdtzbE9CzdExBkR0XeU5aX/PEdMpZSv6J9a97EUty+WHgQAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJtE3AAoG3UBhEgQIAAAQIECBAgQIAAAQIEll8gR1TnNoy9JnK+PiKtXv6JXTghx+d7qpWLnzC542tdmE4kAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQ6WMABgA5+HKsRIECAAAECBAgQIECAAAECBI5WYO/6zc9M1bgt5fyUo631/T8JfC8i33bwmJ4b19111xwTAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQItFPAAYB2aptFgAABAgQIECBAgAABAgQIEFhGgTwycsxc7nlvpPSyiPC7z9Ksv1OPxmUnTe/886WVqyJAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgMDSBfwh+NLtVBIgQIAAAQIECBAgQIAAAQIEOkYgR1TmR0ZfnyO9vWOWKt4iOef4TIq4cGBm4s7irW9jAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSKLuAAQNFf0P4ECBAgQIAAAQIECBAgQIBA6QVyRJod2fpTKervjIjTSg+ydIB7c4obD1TzO8ZqtUNLb6OSAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECSxNwAGBpbqoIECBAgAABAgQIECBAgAABAh0j8L3R0cGDC+mWSopfzxGVjlmsaIvk+HrKcXH/rom/Ltrq9iVAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoDsEHADojneUggABAgQIECBAgAABAgQIECipwJ6hodW9q457bcrx5og4tqQMrYh9KFJ8IlXzRf212u5WNNSDAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECRyvgAMDRivmeAAECBAgQIECAAAECBAgQINBBAvMbRl+Qc7omRzw5IiodtFrBVskzKcfV/TO1PyjY4tYlQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKCLBBwA6KLHFIUAAQIECBAgQIAAAQIECBAol8Dsus2nRE9+V4r4+RzRV670LU1bj8j/K+c4f3Cm9o2WdtaMAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECRyHgAMBRYPmUAAECBAgQIECAAAECBAgQINApAvtHRp5Qj55XpZzemFMMdMpeBd1jPiK/J/XE9f212v0FzWBtAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgS6QMABgC54RBEIECBAgAABAgQIECBAgACBcgnkl7ykOvv1bz6v0ojLc44fjRQ95RJoadqcIu6s53TB2pnxz7a0s2YECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBA4SgEHAI4SzOcECBAgQIAAAQIECBAgQIAAgZUWmB3ZvDVHvjwiXpgijlvpfYo8P0c8lHL65DGVhfMfNzV1b5Gz2J0AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgeILOABQ/DeUgAABAgQIECBAgAABAgQIECiRwJ6h7at7e+9/Y6Q4O0UMlij68kTNcU+O/KbBmdpHlmeArgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEDhyAQcAjtzKlwQIECBAgAABAgQIECBAgACBFRW4e926Y4+rrn52I+WrIuLHIsJvO028SIpYyDn+tt7Irzrp7trOJlopJUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEsE/JF4Sxg1IUCAAAECBAgQIECAAAECBAgsv8Dsxs1PS418USPyc1Ok1cs/sesn3Bc5bvjucb03POmOOw53fVoBCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBDoeAEHADr+iSxIgAABAgQIECBAgAABAgQIEIi499TRTdWeynkpx0tz5BOZNC2Qc8SOarVy1pqdO77YdDcNCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg0AIBBwBagKgFAQIECBAgQIAAAQIECBAgQGA5Bb67adPa3sXKbzZSvCZFjESE33SaBz+YI/5o4fDxbxja8/UHm2+nAwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBJoX8MfizRvqQIAAAQIECBAgQIAAAQIECBBYNoE9Q0OrV/Ue97xIcUGktD3n3LNsw8rV+L7IcebAzMSnyhVbWgIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEOlnAAYBOfh27ESBAgAABAgQIECBAgAABAqUX2Hfqlh+rVBvX5ojnRERv6UFaA9CInP734YUHfnZoz54HW9NSFwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECDQv4ABA84Y6ECBAgAABAgQIECBAgAABAgSWReAfR7aO9KXGJZHzb+WIvmUZUs6mh6OSzhuYHH9nOeNLTYAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBApwo4ANCpL2MvAgQIECBAgAABAgQIECBAoNQC95+ytf9wtf47uZLOS5FPLjVGi8PniL+vVBsv7t+58+4Wt9aOAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECTQk4ANAUn2ICBAgQIECAAAECBAgQIECAQOsF7l637thje1b/fI58VYp4ausnlLpjrkS6ZM30+PWlVhCeAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIGOFHAAoCOfxVIECBAgQIAAAQIECBAgQIBAWQVyRGX/ptO2NeqLN0bEz5fVYbly5xw7Kzm/sH9X7TvLNUNfAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQILFXAAYClyqkjQIAAAQIECBAgQIAAAQIECLRYIEek/Rs3ntqoV6+MFGe2uL12ETkibhiYnngTDAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECHSigAMAnfgqdiJAgAABAgQIECBAgAABAgRKKXDfum1rFqqLr4rIb4gU/aVEWNbQ6bv1av1FJ+3c+aVlHaM5AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIElijgAMAS4ZQRIECAAAECBAgQIECAAAECBFopkLdt65t/qP7LOTeuiojTWtlbr38WyDm/d2Cm9qoU0WBCgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBThRwAKATX8VOBAgQIECAAAECBAgQIECAQOkE9q3fur1Sqd+cI55VuvBtCJwi5ho5fmtgZuKzKSK3YaQRBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQOGoBBwCOmkwBAQIECBAgQIAAAQIECBAgQKC1Ans2nDbclxevi4iXtrazbv8qkCJ9/P44/MoN09MHqBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKBTBRwA6NSXsRcBAgQIECBAgAABAgQIECBQCoGpkZFjjo/et+aI34mIx5cidJtD5oiDEekVAyNDn0i3377Y5vHGESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBA4IgFHAA4YiofEiBAgAABAgQIECBAgAABAgRaK5BHR1fNLVSeHyn/QUQ8obXddfs3An+bc89vDM7c+Y9UCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg0MkCDgB08uvYjQABAgQIECBAgAABAgQIEOhqgdnhTc+JVLk+Ip7W1UFXMFxKMdvIcenBxYc+dOru3Q+t4CpGEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBA4DEFHAB4TCIfECBAgAABAgQIECBAgAABAgRaLzC/adOTcr1ydU7xgsjR0/oJOv5AIKX4TM7p/P7p8fEU0aBCgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBThZwAKCTX8duBAgQIECAAAECBAgQIECAQFcKzJ0yui564txIcWaOdGJXhuyAUDnHbIp0ZePBng+u3XfHAx2wkhUIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECDwqAIOAPgHQoAAAQIECBAg8P/Yu/doPc+6Tvjf6372zrGHpGnSNt1Nd5LdNA2lIClQEFgtyCuIOoyMVMADBxn1lSIvJ0EU8YSKMirioVIOHnBEGXiZGRwPIOjMvB6GwqBYSLOT7KRpaY5NTznt/dzXrKCsFx2H1RyevZ/Dp2v1v+e+ru/383tWs7rXvn8hQIAAAQIECMyjQE2aQ+uuem2a+n8n5YokzTxeP1JX1dQ/6jZjr79k5xf+viTtSJVXlgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBgRSwAGAgxyY0AQIECBAgQIAAAQIECBAgMIgCNRk7Mnn1c9q0P16TRyXpDGKPQchcSw6Wmp9omu5vXrRz5/2DkFlGAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIWADgO0CAAAECBAgQIECAAAECBAgQmCeBIxs2PaNb61tqzROTjM/TtaN6zR93kjesmNn+tyVpRxVBbwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBkvAAoDBmpe0BAgQIECAAAECBAgQIECAwIAKHJy86ok1eXNJnp5kyYDWGIjYpeZQm/LT4/X4e1bs2XPfQIQWkgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkksAPA1IECAAAECBAgQIECAAAECBAj0WODwxmuubbvd1yX1uUku6PF1jk/+tLbtGy/es+PTJalACBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgMCgCFgAMyqTkJECAAAECBAgQIECAAAECBAZS4N4rr17fabqvKLV8e5I1A1ligEKX5HA39ecXzx2/9cK9ew8PUHRRCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgEAsAfAkIECBAgAABAgQIECBAgAABAj0SuGft1mWLFt1/S0l5fU0u6tE1jv2nAn9eUt+wamb6r8AQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBg0AQsABi0iclLgAABAgQIECBAgAABAgQIDITArsnJFcvr2POaUl6T5JqBCD34Ifc1qb/QmVv0rgv33nF48OtoQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIDAqAlYADBqE9eXAAECBAgQIECAAAECBAgQ6LnAXRMTS5eOLf+/UuoPp9bre36hC04JdGvKn6YpP7J657ZPISFAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgMAgClgAMIhTk5kAAQIECBAgQIAAAQIECBDoW4HPbdmy6JKjJ59cUn40yY19G3TIgpXkrqT+u9K0771o5877h6yeOgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIjIiABQAjMmg1CRAgQIAAAQIECBAgQIAAgd4LfGrr1vHJww9+TWr7xlKab6y1jvX+Vjckma3JH9Vaf3TN7unPECFAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgMCgClgAMKiTk5sAAQIECBAgQIAAAQIECBDoK4FPJGOP2bhxc3eu86rS1Oen5vy+CjjcYWaS+ra5Yw/+1qX79j083FW1I0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgmAUsABjm6epGgAABAgQIECBAgAABAgQIzItATZr711012S353lryXUnWzMvFLjklcDwlHy2d+qOrpqf/HgkBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQGWcACgEGenuwECBAgQIAAAQIECBAgQIDAggvUpByYnLykyaIXJ/X7kqxb8FAjFKAmO2utP3X/eN5/1fT0iRGqrioBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkMoYAHAEA5VJQIECBAgQIAAAQIECBAgQGD+BO695LrlnaXHXlRSXpPUTfN3s5uSHC3JR7pz7ZvX7N0xTYQAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQKDLmABwKBPUH4CBAgQIECAAAECBAgQIEBgQQUObrjqW9KWtyT10QsaZAQvL8nOtuZHLt69/QMl6Y4ggcoECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECAyZgAUAQzZQdQgQIECAAAECBAgQIECAAIH5E9h35dSTOqW8M8nj5u9WN50SqMnxpH4k3c6rV9+17R4qBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQGAYBCwCGYYo6ECBAgAABAgQIECBAgAABAvMucHDyqifW1B8tKc+e98td2CbZ1rb1zWv2TH8QBwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBIZFwAKAYZmkHgQIECBAgAABAgQIECBAgMC8CRye2Pzo7tjcm5Ly3JIsnreLXfRlgQdKzW906om3rtiz5z4sBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQGBYBCwCGZZJ6ECBAgAABAgQIECBAgAABAvMicGTdVRvmSnlNKfWFNVkxL5e65CsFukk+VWr76lW7d/x/aAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIDBMAhYADNM0dSFAgAABAgQIECBAgAABAgR6KlCnphYfnitvq8kLklycxM9Weir+Lx7+YK358YvL7DvLzMzx+b/ejQQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEOidgF9S752tkwkQIECAAAECBAgQIECAAIEhEtg/ueXSJnMvSeotSS718v+CDLfbJh+rY/X7L5me3rEgCVxKgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBHgpYANBDXEcTIECAAAECBAgQIECAAAECwyHwwNpNF88tqi9tk1ckmfDy/4LN9XiS71s1s/23StIuWAoXEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoEcCFgD0CNaxBAgQIECAAAECBAgQIECAwHAIHFm3bmW3WfRdNXlVUtZ5+X8B51rr+1d1j+k4Z/wAACAASURBVL+87N17bAFTuJoAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQI9E7AAoGe0DiZAgAABAgQIECBAgAABAgQGXeDQ1NQFdS4vqimvK8n6Qe8z2PnLfeNpX3DhzPQfD3YP6QkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIPB/FrAAwLeDAAECBAgQIECAAAECBAgQIPAvCJx6+b872/nWUurrS+omSAsqUEvN21ft3v66BU3hcgIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECPRYwAKAHgM7ngABAgQIECBAgAABAgQIEBg8gV2Tk0vObxd9a5q8KalXD16DIUtc88XZ8fqYy6anDwxZM3UIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECDwTwQsAPCFIECAAAECBAgQIECAAAECBAh8hcD+1VvO6yyfe05S31CTx8JZcIGHS/KmVTPbf2nBkwhAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBHgtYANBjYMcTIECAAAECBAgQIECAAAECgyNQ165ddmh8+bPS1DemlusHJ/nQJm1L6geX1NlXLd+9+4tD21IxAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI/KOABQC+CgQIECBAgAABAgQIECBAgACBJPesXbtsfPGyryu1vDHJDVAWXqAku9pSX3XxrumPlqS78IkkIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQG8FLADora/TCRAgQIAAAQIECBAgQIAAgQEQuGtiYunyRUufXtv8YE2eksTPTBZ4brXmoVLqL696eNFby4E7HlrgOK4nQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIDAvAj4ZfZ5YXYJAQIECBAgQIAAAQIECBAg0K8CuyYnl1yQzo1J53UpeVqtdaxfs45Srpr6Z6Vp3rBq552fLkl3lLrrSoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIDA6ApYADC6s9ecAAECBAgQIECAAAECBAiMvMDntmxZdOlDs09Lk9cnuTHJ+Mij9AfA3bWUH+seXfK7l+7724f7I5IUBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQ6L2ABQC9N3YDAQIECBAgQIAAAQIECBAg0IcCNekcmdz81LnMvT4pTy/J4j6MOXKRanKiJO+fq81PXrJ720xJ6sghKEyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAwMgKWAAwsqNXnAABAgQIECBAgAABAgQIjK5ATcqB9Zue0qS+PjXPSLJ0dDX6rHnN7W3Km1ePtx8v09Mn+iydOAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEOipgAUAPeV1OAECBAgQIECAAAECBAgQINCPAocmp26oad5QU59ZkmX9mHFEM+1PyS8v7tRbz5+ePjCiBmoTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIDDCAhYAjPDwVSdAgAABAgQIECBAgAABAqMocGDD5k2l7f5GkuuTLB9Fg77tXPOhNvUn/373xN/dlE/O9W1OwQgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINAjAQsAegTrWAIECBAgQIAAAQIECBAgQKD/BI5s3Lh1dq7zqpL2BSml038JRzrRF0qpb36gzv2n9TMzx0daQnkCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBEZWwAKAkR294gQIECBAgAABAgQIECBAYLQE7pu86rHdktem5puTnD9a7fu+7eFa63s7nfYdF+3cuafv0wpIgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBHglYANAjWMcSIECAAAECBAgQIECAAAEC/SNwZOPGrXNz5QdSyqmX/y/sn2SSnBKoKZ/oNHnzZ3fe+Vc3JXNUCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgMKoCFgCM6uT1JkCAAAECBAgQIECAAAECIyJwaHLqhiSvrilfn+T8JH4e0l+z357krcfmjn3gir17j/VXNGkIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAwvwJ+4X1+vd1GgAABAgQIECBAgAABAgQIzKPA/vWbntrU+rqaPL0ky+fxalc9MoEHavLvu23edume7Tsf2SM+RYAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgeEVsABgeGerGQECBAgQIECAAAECBAgQGGmBA5NTN5aUH0ry1CRLRhqjT8uX5K+b1DesnJn+ZJ9GFIsAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQLzKmABwLxyu4wAAQIECBAgQIAAAQIECBDotUBNOvvXTz2jU8sbkzw5yaJe3+n80xcoyUyt9edWlbn3lJmZ46d/gicIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAwfAIWAAzfTDUiQIAAAQIECBAgQIAAAQIjK1C3bFl03/HZZ9ZufWNNeWJKxkYWo5+LlzzUtOXD3c7cT67eufPOfo4qGwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBOZTwAKA+dR2FwECBAgQIECAAAECBAgQINATgZqUfZdct2xsybGvLyU/mOT6mjQ9ucyhZyvQTfI/S+qbVs1M//HZHuZ5AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIDJOABQDDNE1dCBAgQIAAAQIECBAgQIDACAqcevn//nWPXjFbjj87Ja8pyeNGkGFQKtfU3F2Td9Tl47+25o47HhqU4HISIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgPgQsAJgPZXcQIECAAAECBAgQIECAAAECPRGoSbNv48aLx7vNc5K8siaP7clFDj0nAjU5Wmo+XJvmJ1bv2rbtnBzqEAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECAyRgAUAQzRMVQgQIECAAAECBAgQIECAwCgJnHr5/+AVV19aOt1/leT7kvLoUeo/aF1LKXO11k+ntm+8ePeOPxu0/PISIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgPgQsAJgPZXcQIECAAAECBAgQIECAAAEC51Tg1Mv/923YMFHb5nk15eVJrjmnFzjsXAvUpO7pJj+7ZizvKdPTJ871Bc4jQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIDAMAhYADAMU9SBAAECBAgQIECAAAECBAiMkMCpl//3rbtqsinl20ppX1xSrhqh+oNa9WRqfdfxufzMxN3Tewe1hNwECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBDotYAFAL0Wdj4BAgQIECBAgAABAgQIECBwzgRqUg5s2DDV6Xa+IyXfXpP15+xwB/VKoJbkv86V8spLdt352V5d4lwCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgMg4AFAMMwRR0IECBAgAABAgQIECBAgMCICByc3LS5lva7S1tuTsnEiNQe7Jo1O9qm/tCaXdO/P9hFpCdAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEDvBSwA6L2xGwgQIECAAAECBAgQIECAAIFzIHB4w4ZHt23n+5J8S5JLzsGRjui9wLGS8nNNTv7CypmZI72/zg0ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAYbAELAAZ7ftITIECAAAECBAgQIECAAIGRELhnw4brF7WdVyT5piQXjUTp4Sj54abpvuqinTv3DEcdLQgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINBbAQsAeuvrdAIECBAgQIAAAQIECBAgQOAsBQ5duflJKe2raurXJ7nwLI/z+PwJfKZT29es3L3jE/N3pZsIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAw2AIWAAz2/KQnQIAAAQIECBAgQIAAAQJDLXDPFRuuH+903l5qHpeS84a67HCVm01bX3Zy7uh/WHvPPUeHq5o2BAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQ6J2ABQC9s3UyAQIECBAgQIAAAQIECBAgcIYCNSn3XbnxWW3TvLrWPLUki8/wKI8tgECt9bbFs80bL7jnzoMLcL0rCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgMLACFgAM7OgEJ0CAAAECBAgQIECAAAECwymwf8uW88rDs9+ckh8syTVJxoez6XC2qil/VJL/Z9XMnXeWpB3OlloRIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgNwIWAPTG1akECBAgQIAAAQIECBAgQIDAGQjcu3HjmrG28/zU3JLUqSTNGRzjkYUSKPXvUuubH0z3j9bPzBxfqBjuJUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAwKAKWAAwqJOTmwABAgQIECBAgAABAgQIDJnAfeuvuXKudl/cpL60JuuGrN7Q1yk1h2opPz/WLr51xZ6/u2/oCytIgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBHghYANADVEcSIECAAAECBAgQIECAAAECj1zgLUlzy7qpzbXpfE/S3pzkkkf+tE/2iUCb5H1N0/2xi3bu3NMnmcQgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIDAwAlYADBwIxOYAAECBAgQIECAAAECBAgMj0DNjWOHNtzzNbXb/kApeU5SVgxPu5Fp0k3ysdp0f/jinTs/XZJTywD8Q4AAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJnIGABwBmgeYQAAQIECBAgQIAAAQIECBA4O4GalL0TE0uWdBbf0JTmtW3y9JIsObtTPb0AAm1NPpda35Ylnf+4etu2BxcggysJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAwNAIWAAzNKBUhQIAAAQIECBAgQIAAAQKDIfCWpPnuyzevXLpo7qa0eVUt5WsHI7mU/7tAubckt7b1xK2rd+/+IiECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQODsBCwDOzs/TBAgQIECAAAECBAgQIECAwGkI1KTs27hx9Vjb3JyaFyd53Gk87qP9JXAsKX9QS3nr6l3btvVXNGkIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAwmAIWAAzm3KQmQIAAAQIECBAgQIAAAQIDJ1CTZt+VV1851nS/odTypppcNnAlBP6ywPEkfz3W5CdX7Nz+MSwECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgcG4ELAA4N45OIUCAAAECBAgQIECAAAECBL6KQE3Kvg0bru20zUtLyvOSXAFsQAVKmau1fq5J3vFAZj+8fmbmyIA2EZsAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJ9J2ABQN+NRCACBAgQIECAAAECBAgQIDB8AgfXb3pCbesrS8mzkqwavoYj1Kjm7iS/vjRj716++/NfHKHmqhIgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKDnAhYA9JzYBQQIECBAgAABAgQIECBAYHQF7pqYWLqks/iGUpo31uQpJVk6uhpD0fxIST7Q6dafW3HX9I6haKQEAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE+kjAAoA+GoYoBAgQIECAAAECBAgQIEBgmAT2Xr551bLx9pk19ZU1edIwdRvFLjX1aEn54yQ/e/HM9r8eRQOdCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg0GsBCwB6Lex8AgQIECBAgAABAgQIECAwggJHL5+aODpevqUkL63JdUn8DGKwvwezST6VWn5uVTn5X8rMzPHBriM9AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE+lPAL9/351ykIkCAAAECBAgQIECAAAECAytwYP36q9OOvaiUcnNSp5I0A1tG8FMCNSl72pKfH68nf2flzMwRLAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECDQGwELAHrj6lQCBAgQIECAAAECBAgQIDCSAgcu37CpjHd+KMkzk1zq5f/B/xrUmodKya/Mddp/d+mOHfsHv5EGBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQ6F8BCwD6dzaSESBAgAABAgQIECBAgACBgRH4RDL2qPVXPblT8701eXaSC5P4ucPATPBfDlqSk7WU3x/r1h9dsWf7zgGvIz4BAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgT6XsAv4vf9iAQkQIAAAQIECBAgQIAAAQL9LVCnpi443JZn1ja3JPXxSVnq5f/+ntkjTFeT+snSGfvhi3Z84a9K0j7C53yMAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBM5QwAKAM4TzGAECBAgQIECAAAECBAgQIJDsX73lvGbZiRenNK9IsiHJOJfhECjJ/aVtn7Ny9Yq/KbffPjscrbQgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAfwtYANDf85GOAAECBAgQIECAAAECBAj0rcCRK69e3037krbkRSWZTNL0bVjBTkug1ByqqW9etXv61pJ0T+thHyZAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBMxawAOCM6TxIgAABAgQIECBAgAABAgRGV+DglVddk5LXJeW5SV2RxM8YhunrUPIjq3Ztf2tJ2mGqpQsBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgT6XcAv5/f7hOQjQIAAAQIECBAgQIAAAQJ9JFAnJ5ccydgT2+QHa/L1SWn6KJ4oZylQkm5NfmXVzAWvLbl99iyP8zgBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQInKaABQCnCebjBAgQIECAAAECBAgQIEBgFAVqUvZObFm5pDP7rFLyiiRPGkWHIe88m5rf7zRzb1qxa9eektQh76seAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE+k7AAoC+G4lABAgQIECAAAECBAgQIECgvwROvfx/aGLT2tKpL6glL0mypb8SSnO2AiU5meRjNfnxVTPbP1WS7tme6XkCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQOH0BCwBO38wTBAgQIECAAAECBAgQIEBgZARqvrWz/4rPTDadfH9JuTnJ2pEpPypFa+aS+je1yc9c3MmflOnpE6NSXU8CBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAj0m4AFAP02EXkIECBAgAABAgQIECBAgECfCNw1MbF0SXPeljTd1yb5VyVZ2ifRxDhHAiVpa/KFNvn5srj54Opt2x48R0c7hgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTOQMACgDNA8wgBAgQIECBAgAABAgQIEBh2gfsntlw0O3byqbWWV5SSrxv2viPc765a844Tc533Ttz9hUMj7KA6AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE+kLAAoC+GIMQBAgQIECAAAECBAgQIECgfwQOXT41URc1z01bX5ySrf2TTJJzLLA/pdx2bDa/esXeO+8+x2c7jgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTOQMACgDNA8wgBAgQIECBAgAABAgQIEBhWgSPrrtow2+SWknxTko3D2lOvPJhSfrstnV9cvfPzO0rSMiFAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBhRewAGDhZyABAQIECBAgQIAAAQIECBBYcIG7JiaWLh1f9ujStt/dprywlCxf8FAC9ESgpNxXk48l9e3vnNn+P97i5f+eODuUAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECZyJgAcCZqHmGAAECBAgQIECAAAECBAgMkcD9E1sumh3rPrWmfVmSryvJ0iGqp8o/FXggJX+Stvm1Vd2H/7Ls3XsMEAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAj0j4AFAP0zC0kIECBAgAABAgQIECBAgMC8Cxyc2HR5HavfmORFSR5fkiXzHsKF8yJQk4ebkk+WUn515cNL/rzs+9uH5+VilxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIDAIxawAOARU/kgAQIECBAgQIAAAQIECBAYLoH9GzdOlW55UUnzvKRenWTRcDXU5isEjiXlr1LrO+uS5k9Xb9v2IB0CBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQ6D8BCwD6byYSESBAgAABAgQIECBAgACBngp8auvW8Y0H77+2W8rLS/KNtZTLUutYTy91+IIJlORkTT5Ta97RjNf/vGp6+oEFC+NiAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEPiqAhYA+IIQIECAAAECBAgQIECAAIEREti/est5naWzT0pTXl5Tn5nkwiR+PjC834FuSj7flvoLD6b9Dxt37rx/eKtqRoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgcEX8Av+gz9DDQgQIECAAAECBAgQIECAwCMSuGtiy0VLm5PfkCYvScoNSZY9ogd9aFAFakl2l9S31bG8f9X09AODWkRuAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIjIqABQCjMmk9CRAgQIAAAQIECBAgQGCkBe7duHFNp813NLX5zppsTrJopEFGoHxJOZyan+oeHfuNNQfueGgEKqtIgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBgRewAGDgR6gAAQIECBAgQIAAAQIECBD4qgLlrolNa5d06qtKyYtKsqYmHWbDLlCPtqX89InZY2+/Yu/eY8PeVj8CBAgQIECAAAECBAgQIECAAAECBAgQutZnGAAAIABJREFUIECAAAECBAgQIECAAAECBAgQIECAAAECBAgMi4AFAMMyST0IECBAgAABAgQIECBAgMA/Ezj1ov/+9Zuubdr6uqbJzW3NmB8EjMDXpGSuqeXn5h6+761rDhx4aAQaq0iAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIGhEfB7/0MzSkUIECBAgAABAgQIECBAgMD/L/APL/+vv3asjv9WTb2OzcgItE0t71+5e+1LSz45NzKtFSVAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgMCQCFgAMCSDVIMAAQIECBAgQIAAAQIECHxZoE5OLjlcx17YlnJLSR5LZmQETiS5ddXYeT9Zpj9zYGRaK0qAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIEhErAAYIiGqQoBAgQIECBAgAABAgQIjLZATZojk5MXtHXxLWnaf1trJkZbZHTa1+ThJrmtm/GfWTNzx72j01xTAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIDJeABQDDNU9tCBAgQIAAAQIECBAgQGBEBbZPTS1eOdesr2lfWVJelmTRiFKMYu37k7yvnGzfvuqeHXeNIoDOBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQGBYBCwCGZZJ6ECBAgAABAgQIECBAgMDIChy4+urzy2z7xHTzPaXJc2vN2MhijF7xw23yO22bX7pkz/ZdJamjR6AxAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEhkfAAoDhmaUmBAgQIECAAAECBAgQIDCCAg9s2nTxydk8OzUvSepTkoyPIMNIVq41B5uS97eznV+9+O4vTJekHUkIpQkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIDBEAhYADNEwVSFAgAABAgQIECBAgACB0RGoSTm8ceNE2zbf1tS8KMmW6uX/0fkCJPuT/PuM59ZV27ffWZLuKJXXlQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAsMqYAHAsE5WLwIECBAgQIAAAQIECBAYWoE6NbX4vlqvqnPNd6Xk+TWZSNIMbWHF/rnAviS/N9dpb7vkiiu+UD75yTlEBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIDAcAhYADMcctSBAgAABAgQIECBAgACBERE4NDV1QZ3tXJ/SfkeSb0qyakSqq/klgXJvSf1Aabrv3rly5Reuv/32WTAECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgMDwCFgAMzyw1IUCAAAECBAgQIECAAIEhF7hn06aLx0/m60rqC5M8LcmFQ15ZvX8iUO9Nyu93S3nPmovOv6N4+d/3gwABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkMnYAHA0I1UIQIECBAgQIAAAQIECBAYRoEDV15zWW3m/k1T84Ik1yVZPow9dfo/CuxLze93mvLuFV7+9zUhQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIDA0ApYADC0o1WMAAECBAgQIECAAAECBIZBoN5449jBPfduSLf77Ule0JSsq8miYeimwyMTqMn+UvOBUy//37107PPX3nHHyUf2pE8RIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAwKAJWAAwaBOTlwABAgQIECBAgAABAgRGRmDX5OSSC+rY19RSvrMm/7oka5L4f/mR+QYkteZgSf29btPctuai8+8ot98+O0L1VSVAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgMDICXhpYORGrjABAgQIECBAgAABAgQIDILAPWvXLhtfvOwZpZaXJLkpyYpByC3jORU4nHrq5f/OrWsuOu/zXv4/p7YOI0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQF8KWADQl2MRigABAgQIECBAgAABAgRGWeDUy/+LFy2/uSYvT+pjkrJslD1GtPv9SX636ba/uvOuFduuz+2zI+qgNgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBEZKwAKAkRq3sgQIECBAgAABAgQIECDQ7wL3TT52RTcPfW9J+Z6aXJ5kvN8zy3eOBUoeqjXvb9r6jr/dM33nTcncOb7BcQQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECDQpwIWAPTpYMQiQIAAAQIECBAgQIAAgdET2Dc1tXFsrtxSS16WmuVJ/H/7iH0NanK8KfW3x9N5+x/t2jb9/KQ7YgTqEiBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYKQFvEgw0uNXngABAgQIECBAgAABAgT6ReDQlVNPqimvKSXfXJPxfsklxzwKlMyVlN/slrmfXb1z53RJ6jze7ioCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQ6AMBCwD6YAgiECBAgAABAgQIECBAgMDoCtSkHLpy03OT9vUp5YbRldC8Td7XtvmJS/ds30mDAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBEZTwAKA0Zy71gQIECBAgAABAgQIECDQBwK7JieXnN92np/S/EJKLuqDSCIsjEC3pH5s9tiy5126728fXpgIbiVAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBfhCwAKAfpiADAQIECBAgQIAAAQIECIyUQM2NYw9M7L9gdmzutUn9/iQXjBSAsl8pcLTUfLJ7dPzmNQfueAgNAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECIy2gAUAoz1/7QkQIECAAAECBAgQIEBgngV2TU4uOb8suq7U+tIkN9dkxTxHcF2fCJTk/lrq+9vZ9hfX7N25vU9iiUGAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECCyhgAcAC4ruaAAECBAgQIECAAAECBEZL4MDVV5/fOd4+rS059fL/M5OcP1oC2n6FwKFS6m/OjpVfuWT79l0lqXQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIAFAL4DBAgQIECAAAECBAgQIECgxwI1KV9cu2nVokV5Tk19WUmuT7K0x9c6vm8Fyr1J3tspnVtX7Pr8XSVp+zaqYAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAwrwIWAMwrt8sIECBAgAABAgQIECBAYNQE6tat4/sOPjQxnvottdSXllI21VrHRs1B338QKDV721Le3XS67/7lHTvufouX/301CBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQOArBCwA8HUgQIAAAQIECBAgQIAAAQI9EqiTk0sOtp1HlaZ5fkm5uaZe2aOrHNv/Am2SPanlXbUt77v4rm1fLEnt/9gSEiBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgMB8ClgAMJ/a7iJAgAABAgQIECBAgACBkRHYv3rLeZ3zZp+UmhfW1Gcl5dKRKa/oPxfoJtlea97dNnO/fcmuXfsQESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBf0nAAgDfCwIECBAgQIAAAQIECBAgcI4FDk1NXZBuntXWvLikPCnJinN8heMGRKAks0n5fE19d7fMfcDL/wMyODEJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECCwQAIWACwQvGsJECBAgAABAgQIECBAYPgE3pI0r52cXHMs488tyctrsqUkS4avqUaPUOBkav6uKbntZKf90KU7dux/hM/5GAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAiMqIAFACM6eLUJECBAgAABAgQIECBA4NwK1KQ5uP7qq5ravbmmfGeSDUn8f/e5ZR6Y02pyoiSfaWu9bW5x85G1d955cGDCC0qAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECCybgRYQFo3cxAQIECBAgQIAAAQIECAyLQE3KvsmpJ3ZSXlySb05y2bB00+OMBI6Xkv9RU951bHbso1fsvePwGZ3iIQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAYOQELAEZu5AoTIECAAAECBAgQIECAwLkW2H/lxmc3TfN9qXlqkhXn+nznDY5ATY6XlL8spfx6KbN/fNHOnfcPTnpJCRAg0N8CdevW8YOHH9rQrd2Vn5+Z/tRNyVx/J5aOAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIHD6AhYAnL6ZJwgQIECAAAECBAgQIECAwJcETr2IeOjAQzfXpn1NSa5OshTNSAscT8l/TW1+pX248/E1B+54aKQ1lCdAgMBZCnxuy5ZFa0+c2NR2m+tr6nUlzWNKsrpN7m5q++Ordk//5Vle4XECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQN8JWADQdyMRiAABAgQIECBAgAABAgQGQWDf+msvGWuPfXstzauTXJKkMwi5ZeyZwMma8vEmzS8dnXvoL67Yu/dYz25yMAECBIZY4IuTmyfH2/appalPqcn1NVlZkuUpWZaaZUmaJPenLb+6as+dP1ySdog5VCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgRGUMACgBEcusoECBAgQIAAAQIECBAgcHYCB6+86ppaysubWr+jllx8dqd5eggEujX5w6Tz9n3Lmr+89o47Tg5BJxUIECAwLwI1Gbt33dTVi5rydUl5Vk3dkuSCJEuSLE7yz3+GXUvNTFvbn969esX7rr/99tl5CeoSAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgMA8CVgAME/QriFAgAABAgQIECBAgACB4RDYt27j1zZN55aS+g1Jzh+OVlqcjUCbfLjpdn961V07P12S7tmc5VkCBAiMgsCRdY9eOTd2fGtp65OT8rU19bqkrEgynqTzVQweTPLBWtvf3rd88X+3cGUUvi06EiBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACB0ROwAGD0Zq4xAQIECBAgQIAAAQIECJyhwIENVz0nbX6wJE/4x7+V+AxP8tiwCJTUD2QsP75qevqOYemkBwECBM61QE3K3Zs3X7TkWPu0WurTklP/li0lWfJI7jq1XKUmny61uTXj3T9YNT39wCN5zmcIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAoMoYAHAIE5NZgIECBAgQIAAAQIECBCYN4FTLy0emZy8sK1j31JLeV1JNtWkmbcALupLgZLM1uR3x8bqT6yYnt7RlyGFIkCAwAIIfOnPyK1bO3v37RtbvGjRRKfbPDWlfG2SJ9dk82lG6qaUY7Vtbx1rmt9euevOz57m8z5OgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEBg4AQsABm5kAhMgQIAAAQIECBAgQIDAfAnUpLP/iqnJTlO+LaW+PClXztfd7ulfgZocS/Jb47X52RW7t+3q36SSESBAYH4EPrV16/jE3tlFS8fnFh9vTlzTdDo3lLbeUEqeUJN1Z5CiTcnR2ubPm6a+b9Wu6Q+ewRkeIUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgMpIAFAAM5NqEJECBAgAABAgQIECBAoNcCdcuWRfefOPHouba8OLU8L8llvb7T+QMh8ECS954sc79w2a5de0pSByK1kAQIEDjHAqf+nHzggZx3dKy9YHGZe3Sb8oRSy/U19fE1WXWmP3iuyYkm5Qs17Qfm2vKBS/ds33mOozuOAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINDXAmf6e5h9XUo4AgQIECBAgAABAgQIECBwNgL3rF27bNHYeU8qTf5tTfvMpKw8m/M8OzQCh5K8u3Tad160Y8deL/8PzVwVIUDgEQjUpNl3yXVLO0tmLyiZW5GUzaW0T03KTW1yTUkWP4JjvtpHTiY59d/Zv8xc+dlVe++8vSTdszzT4wQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBgROwAGDgRiYwAQIECBAgQIAAAQIECPRK4NTLjXdfvnnl0kVzN9Vavj/JDUmW9Oo+5w6MQE3qvtRyW22bX7v4rm1f9PL/wMxOUAIEzkLg1J+Lh6emzmu64yvbOntZUq5ra3lCadrHpJark5x/Fsd/+dGa5L7UfDqlfqh2Ox+5+K5t95akPQdnO4IAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgMHACFgAM3MgEJkCAAAECBAgQIECAAIFeCHwiN45dc+UXr2ia9hs7NS+ryWN6cY8zB06gTereUspti+vsu86bmbl34BoITIAAgdMU2DU5uWJ506wubbO2pDwmqVuTcm2SqSQXnOZxX+3jDyfZXWs+2qR++MTs0c+uveeeo+fwfEcRIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAZOwAKAgRuZwAQIECBAgAABAgQIECBwrgXqjTeO3bf7i1vatntzTXl+KV96wdE/Iy9QuzXZWZL3LMnc+7z8P/JfCAAEhlrgyLp1K7tZdFkdK2vT1uv/4cX/bK4lG1Nz/jktXzKXmn019b910vy/42Ptx8+fnj5wTu9wGAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgQAUsABjQwYlNgAABAgQIECBAgAABAudGoObGsQPr7rmhaepLkzwryWXn5mSnDLjAbCl1W9q8t1vmfnfNzMy9A95HfAIECPxvAnsv37xqfFE7MV7qRLctTyip16bUq2qbjaWUZT0ie7DWfLaU+ofd0vnomnrizjIzc7xHdzmWAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIDBwAhYADNzIBCZAgAABAgQIECBAgACBcyVQJyaW3tdZdlO35JaS+uQkF5yrs50z0AInk/x9St7b1tk/8PL/QM9SeAIE/pnAqZf+Fy+ZnWxqM1naPL4teVRqNiRZn2RpD8Fmk8yU5M9S6odOnGg+vfaeOw/28D5HEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQGUsACgIEcm9AECBAgQIAAAQIECBAgcLYC927cuGas23xDavn+NHlsah072zM9P/gCNTlRks82yXtOdtoPX7pjx/7Bb6UBAQKjLFCT5sHLN688Od6dqrVOpZTrS/KoJOuSXJFkWY99apIHU/IXpdv+x7la/mzNDV8zU/7gD7o9vtfxBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIGBFLAAYCDHJjQBAgQIECBAgAABAgQInI3A/olrrsr43M1NLd+R1E1nc5Znh0rgeFI/XVJuG19U/tMFd/qbqYdqusoQGDGBey+5bnln0YlrStN9wqmX/msylWRtSb0sKb1+6f/L2m2pmWmT9yX1o814pldNTz8wYqNQlwABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBwWgIWAJwWlw8TIECAAAEC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ECBAgAABAgQInKuAAQDnKmcdAQIECBAgQIAAAQIECEyrwLbx8cUXtd3n1U55a/7mm5gXTGsBmw2KQC01/6Umvz51YsFnV+z9xtFBCSYHAQLnT6CuXLnwwPz5N5a2+4ykPqdNrirJRUkuOH9VZ3HnkiNJPlfafHhkqnPXoqtWHC533TU1ix0pTYAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgcIYCBgCcIZTHCBAgQIAAAQIECBAgQOD8CexZu/ay0V7zIzX56SRPqMno+atm534WqMmXalP+7dH21OdXb99+op+z6J0AgfMv8J3VV199srbPapJn1+RZSS4spSyotXbPf/VZqdBLcm9SPth2ence7fV2+ayclXNQlAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBwzgIGAJwznYUECBAgQIAAAQIECBAgMB0C+8fWXV5G6k+3yRtLzeoknenY1x6DKFA/X2v9V0tXX/El32Q9iOcrE4HpEXj4yisv6TULntLW+vyS+qKUXJFkfpKR6akwZ3fppeQj6eX9R5rJL49v336yJHXOdqsxAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACB7ylgAIAXgwABAgQIECBAgAABAgRmTeDgmjVXTvWa/7WT8tpacmkS/06dtdOY84U/16vt/3HZji1fcaF1zp+VBgnMhkDZt2bNVbXtvLhJXlxSnlxTL/7u3ysD/3dLW+u30pT3LHtk5Pbs23jU5+RsvIJqEiBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSmR2Dgf/l1epjsQoAAAQIECBAgQIAAAQLTKfC1DRtG1h48uL6tnX+WWl5VS7rTub+9BkqgTfKZlPKvLt1271ddah2osxWGwDkL1L8ZGNPsXb58frPwog1NzU8neXGSy8550z5bWJLTn4+91PzBqZP1Zx+zZ/O+PougXQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAge8hYACA14IAAQIECBAgQIAAAQIEZlSgrtyw8OC8w8+oKb+YmhfMaHHF+k3gVEo+nVJ+9dKt9/55OX3R1R8CBIZaoObm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BAgQIECAAAECBGZf4OCaNRf32s5LSvKWmjylJPNnvysd9ItATU40yZ+VmneXMvlHl7j83y9Hp885LlCTsnf5tQvnzz952alSn1xS31iSm5IsmuOtD0J7R5PsSOoHeqX3/uXbtu0dhFAyECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIDJeAAQDDdd7SEiBAgAABAgQIECAwAAKnL5fuWTGxdHR+eWVN3pLkh5KMDEA0EWZMoB5LKV9pa3vr0fQ+u9rl/xmTV2iwBer69aP7j/dWp1efWTr1hanlaUl9zGCnnhPpak32l1o+2yYfPlpO/anPtTlxLpogQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBA4BwEDAM4BzRICBAgQIECAAAECBAjMlkDNzd0949vHRjLymqS8KakTSZrZ6kfd/hOoydEm9Uu1llubTu9Plmzderj/UuiYwNwSqOPj8/eXeavatn18p5QfS+oLklw8t7oc2G6OlWRzrfnUVM3tK+6/b+vAJhWMAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgKAQMABiKYxaSAAECBAgQIECAAIFBELhvYmLeora7rtubem1KXp+UVYOQS4YZFKh5pCZfSFPfndHOXcs2bToyg9WVIjBwAqeHshxY9cBVNbm+lHJLUp+UZHzggs7NQG2SA0m+VEr98GRTv7hiy5aH5maruiJAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBw5gIGAJy5lScJECBAgAABAgQIECAwawI7x8YWLOzMv642zetT6yuTrJy1ZhTuT4GSR2otf9KkvKu3sPPlyzZufKQ/g+iawOwL1KQ5ML5uXSnl2tT6o23qE0uydvY7G44OSnKqltxb2vy/nXQ/cqgc37h6+/YTw5FeSgIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgUEXMABg0E9YPgIECBAgQIAAAQIE+l6grtyw8OC87zy9prwxtb4wybK+DyXAzAqUnL7s/9m0zTtOTR75ryt37z42sw2oRmAwBGpSdq++et1Irdc1tb66llxbkqsGI12/pKjHapovltSPlk77J5du2bKzXzrXJwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIEzETAA4EyUPEOAAAECBAgQIECAAIFZEtiz/NoLuvNPvKCmvqkpeXpNFs9SK8r2qUBNPX3Z/9O1ad5+tD31Nd+S3acHqe1ZF3ho7dqJTq+zoSavSuq1SdYl8bO1mTuZWpLtST5Xk9vrvGbjsk2bjsxceZUIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIzIyAX1KeGWdVCBAgQIAAAQIECBAgcNYCdeWGhQe6R16V0r61llxXUhae9SYWDLvAidR8Ip3ym3vmd//y8Rs3nhp2EPkJnK3AofFrxifTPqWTektNrk/N2pR0z3Yfzz86gVrz5dKUj0716h+tuP++rY9uN6sJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIzF0BAwDm7tnojAABAgQIECBAgACBIRZ4+MorL5nqjv542ubnkro2ycgQc4h+DgIlmazJHU2v/bVLdm65pyRT57CNJQSGVuDAxMRYenlabcvLU3JDklVJ5g8tyCwFryX7S/LZpte8s8nxjYvvv//QLLWiLAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIEZETAAYEaYFSFAgAABAgQIECBAgMCZC+wfW3d5O1J/sql5S5KxJP7tduZ8nvwbgbaWcvvIVPtvLt65eVtJWjAECJyZwN7Vq5d3e52bSpMfblNuTHJ5koVnttpT0yzw9aR+rNuWj118/3U7Su7sTfP+tiNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAw5wRcIplzR6IhAgQIECBAgAABAgSGWWDfmjXrmtq8pa3lJ0qybJgtZD9ngVNJ3pep8q8v3XXv7pLUc97JQgJDJLBzbGzJgs7CZ6XUl9fkppKs+O7Ffz8/m/H3oB5L8rm2NrdOTebPVu6+d/+Mt6AgAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgVkS8AvMswSvLAECBAgQIECAAAECBP5HgX1XXH1D6fR+Lim3JLmIEIGzFaipx5qU94ycKv/6Ihdmz5bP80MqUNevH933yNSTS5OfK6k3JfXipCxI4udms/NOHKipvzXSze/tS3ZdtXnzydlpQ1UCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECsyPgF5lnx11VAgQIECBAgAABAgQI/C2BPavWPqfTdP5xqfU5SU5fPPWHwNkKHE7y7hOTnf977IF7DpztYs8TGDaBr23YMLLm4UeeXHvtj7Y1LyslVyYZHTaHuZK3JmmSL9a23jp5Kp9dsWfz/pKc/r/9IUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIDBUAgYADNVxC0uAAAECBAgQIECAwFwUOLT66pf3avvLJdlQXT6di0fUDz0dKDXvPNYb+fUrdm082A8N65HAbArsH193Ta31dU3Jj9ZkIkk3iZ+TzdKh1NS9SfmDTtN5+yVXrvh27rqr5/L/LB2GsgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABArMu4BebZ/0INECAAAECBAgQIECAwLAK1KTsXzXxulKaf57Uq/7my4/9IXC2AnVvTd7ZzdRvXrJ9+8Nnu9rzBIZJ4KHx9StGMvXjvdSfSHL9MGWfq1lLybdqyrvn1+7HL9y+cc9c7VNfBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBGZKwACAmZJWhwABAgQIECBAgAABAt8VOH3xf9fY+ksWNJOvT5NfSnI5HALnIFBLyv21tu8Zneq++6IH7jlwDntYQmDgBWrS2bV+/cXzjvdeWWp9fUm9OYmfic3uydckh5N8PrX9nUMj5b9ctXnzydltSXUCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECc0PALzvPjXPQBQECBAgQIECAAAECQyJw+iLqw+PXXDGVqTeWlLckWTkk0cWcXoFeSrY2ya0jnfr+RZs375ve7e1GoP8F6oYNI4cOHVo4VUde2LTta2rJS0syv/+T9XmCmqmUbCspd7SlfHjZtk2b+jyR9gkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAhMq4ABANPKaTMCBAgQIECAAAECBAh8f4FvrV8/uuz41GObmr9X0v54UlbwInC2AiWZTMmm1Pq+0U69Y9GWLQ+d7R6eJzDIAqc/a6883C6a6vRubJv8SJJXJFkyyJn7JFstyeE25eu1tO8aqVOfu2T79of7pHdtEiBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEJgxAQMAZoxaIQIECBAgQIAAAQIEhlmgjo/PP9R2NrRN89O15uWlZOkwe8h+zgKnkvxVarltXrf3MZf/z9nRwgEU+NqGDSPrHjxy8an59bq0eVny1/8bT9IZwLj9FqmtyY4m+dSpXvm9x+y896v9FkC/BAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBGZKwACAmZJWhwABAgQIECBAgACBoRXYs/zaC0YWHHtGreXvp+S5SRYPLYbg5yxQk5Ml+cua3N7rtJ9csWXLQ+e8mYUEBkigJuXQmjUX9drm+pLmhUl9YZLHJpk/QDH7OcpkTf6i1vruptf88dJd9z7Qz2H0ToAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQOB8CxgAcL6F7U+AAAECBAgQIECAwFALHJiYuCiT5fk1+ZlacmNJFg41iPDnJFCTEyX1z0vNbaMj+dSizZv3ndNGFhEYIIFfSZqfX7Nm0VTbWd2U3FTb+sZSyhOSjAxQzH6P8mCt+Xqb9l8v37HlT/s9jP4JECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIzISAAQAzoawGAQIECBAgQIAAAQJDJ1CTZu/atUu7vc6Lk/oPU3N9SrpDByHwdAgcL8lXa2nfd+pk549W7r53/3Rsag8C/Sywc2xswbzugqubUp9eavnhtmZDKVnaz5kGrPdekk2p5feS+vtLd9z37QHLJw4BAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACB8yZgAMB5o7UxAQIECBAgQIAAAQLDKlCTzp7xa67oZuqWkvLmJI8bVgu5H7XA8aT815p664mpkc9esWvjwUe9ow0I9LFATcrhVVePT5b2hUleUkquT81YH0cauNZrcrJJ+Xza9rZj7YnPX7Frl8+tgTtlgQgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBM6ngAEA51PX3gQIECBAgAABAgQIDJ3A6cv/B1Zdta6W8tpS6utSMzF0CAJPl8CJknwpNe8und5/WrJ16+Hp2tg+BPpR4IGVa6+YN1qemJRbkvKipK7oxxyD3HNNtjXJF2op7/z8tnvvfk3SG+S8shEgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBA4HwIGAJwPVXsSIECAAAECBAgQIDCUAjVp9q9de31nqvl7bfLKFN9KPZQvwvSEPllT/nOa+jsZab6wbNOmI9OzrV0I9J/AtvHxxYtq54lJc0sp5eZa8tjU2u2/JIPbcU1OluQbKfngSOn+8UVbv721uPw/uAcuGQECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAwHkVMADgvPLanAABAgQIECBAgACBYRJ4aPW6m5pa31prXlBKlg5TdlmnUaBmqiafbZr85uSx7/zpir17j07j7rYi0DcCH0s6L1g18YSp0rwwqS9Psj7JRX0TYEgarcm+UvLFmuYDJyY7Xx7btfFQSeqQxBeTAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAwLQLGAAw7aQ2JECAAAECBAgQIEBgGAUOjK99Ua80/7ipeWqSRcNoIPO0CNSa+ulaer+2rNavlu3bT0zLrjYh0GcCe6+YWNtt8qya8uMpeVySFUn8HGuOnWNNtpTk4ynlk8cnj33zil27js+xFrVDgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoO8E/OJ03x2ZhgkQIECAAAECBAgQmEsCdf360YPHe7ektv+sTR5bknlzqT+99J3AJ7udzv+1a17zzcdv3Hiq77rXMIFHKfDgxMSybi83lra8ppbcWEquTE33UW5r+fQLHE/K12tpb2+a+tklixfvKXffPTn9ZexIgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYPgEDAAYvjOXmAABAgQIECBAgACBaRJ4+MofumSyOfGakvxikrVJmmna2jZDKFCSj4zW/J9f23H5fc/OXVNDSCDyEAvU8fH5D9Xu9d2UH6mlvjApa5IsTOJnV3PsvSg1+0vKH9fSfijdfGXJ5s1HSlLnWJvaIUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINC3An6Jum+PTuMECBAgQIAAAQIECMymwIG1a6/otZ2faGr7D5JypUuqs3ka/V+7qeWDp2r9leX337e9JG3/J5KAwJkL7Fl19epOeq8sJa9KyuOSXJikc+Y7eHIGBXbWlNuatr1zyWg2l82bT85gbaUIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIDIWAAQBDccxCEiBAgAABAgQIECAwnQLfWX311ZNp31xrXp9khcv/06k7ZHvVTKXkA6Vb/8WSzZsf8C3aQ3b+Qx531+XXXLpgpH1eTX19Up+RUhalpjvkLHMyfk1ONjVfbTv1XRnpfGrppk3HStKbk81qigABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgECfCxgA0OcHqH0CBAgQIECAAAECBGZW4NCqiet7pfyjkryiJktc/p9Z/0GqVpMTTfK7dar8y0t33bvb5f9BOl1Z/i6BbePj8y/udDbUXvMTtealabLCxf85/M6UPNLWfCJNee+ySxb9t3L33ZNzuFutESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEOh7AQMA+v4IBSBAgAABAgQIECBAYKYE9o5dfW2n2/671DwnxbdUz5T7QNaptZdS3t4rU/9m+bZtewcyo1AE/geBmpQDY+tWdkbqT03V/HhJHmuIypx+TWqSfUn5jfk5dfsF27fvNahkTp+X5ggQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAZEwACAATlIMQgQIECAAAECBAgQOH8CNekcvGLiuaXT/HKb+rQk885fNTsPukBNPVxSfrdM1n936QObdw16XvkI1KTZt2z9wuaCyR+tKW8sqc+mMscFSqZKzVc6Nb+5eMd9n5jj3WqPAAECBAgQIECAAAECBAgQIECAAAECBAgQ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mrf25uarizZuvK0kFRoBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgT+q4ALALwTBAgQIECAAAECBAj0jUBNyg3L1z6409TXJfXY4f9O34QTZKAFas0VnZQ3zO8e/ELZufPQQJcRvtUCNWn2j61ZU1NfWJInJjkjid/fDPbUb0ktn246zZvnb732X0vSG+w60hMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgcCIF/APyE6lrbQIECBAgQIAAAQIE7rBATTo3rVrzoPTyul7qRXf4QR8k8J0Faim5olfyxsNHD11+nsP/3pc+Fqjr14/u33/gkSn1F1LzQ30cVbQ7JlBLcl1J+UgzWt975ubNW+/YYz5FgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgMAwC7gAYJinrzsBAgQIECBAgACBPhHYPD4+98zpPKikeU0c/u+TqbQgRsl0aq6oTd46dfj2y5fu2nWwBa1UaKHAsQtQ9px94bxm3u0vLqV5RklWtbDmsFXqJmVDr9T3nlyn/vjUycndwwagLwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECd03ABQB3zc1TBAgQIECAAAECBAgcJ4Hrli076aQ5Jz84vd4rk3LRcVrWMgSOJvWK2iuXdo/c+oUle/bcjoRAPwrUZctOurEz73tqk+emlqf2Y0aZ7pRATXKklnJlKfVtdbT5/OKNGw/cqRV8mAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBoRZwAcBQj195AgQIECBAgAABArMrsPvsC08ZPeno99d0X57kobObxu4tEjickq/W1Hd0D558+ZI9Vzn836LhtqVKTZoD514w//DI9GM6TfnZWvP9bek2xD16SfaXlMu7vbzrrB2brhhiC9UJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIELiLAi4AuItwHiNAgAABAgQIECBA4O4J3LBu3akjh6d+sPbyspo85O6t5mkC/5/AoZRcUVPf2T144PIle/Y4/O/l6DuBXUuXnjx35OSVtSlPSfKkJMuS+B1N303qTgXq1mRHSvlkL+UPzt628ao79bQPEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBA4N8F/ONyrwIBAgQIECBAgAABAjMusHft2tPKkTyslN4v+9brGedv84YHk1xRm7xz0eHbLy+7dh373/4Q6CuBnedesHB0tPcDnZInpdYfS3JKXwUU5q4IdJO6odbmA1NN5xNLt12z/a4s4hkCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgcE3ABgPeAAAECBAgQIECAAIEZFajr1s3Zd3DqsU3ygpo8aEY3t1mbBQ4n+Urp1rcc6R68YqnD/22e9UB2q0m5adWq87rdzk+VksfX5MKSzB3IMkL/H4FauynN35de79KmOfWv5k/+8814CBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgcHcEXABwd/Q8S4AAAQIECBAgQIDAnRLYPz5+eu9oeUjp1DeklnvdqYd9mMC3FziUmq/WWi9btGPiMyWpsAj0k8Dusy88Ze7Jh8ene72nlNI8OalL+imfLHdZ4JaS/EMv9TcWT0586S6v4kECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAj8JwEXAHgdCBAgQIAAAQIECBCYEYGbl997/nTn4I+nNi9O8r0zsqlNWi9QkyMl+XKvlrcf6R78wnk7dx5qfWkFB0rg5uXL5083cx5SUn66Jg9PsnCgCgj73wqUlOt7NZ8d7ZTfPnPrxq9jIkCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAwPEScAHA8ZK0DgECBAgQIECAAAEC31Zg15o1i+YeyWNS6gtqciEqAsdJYColX54ueXvv8O2XL9216+BxWtcyBI6LwA1jY0tKRn+iJE9MyX1Tc9pxWdgisy2wpSnlY71e/fCi7Zuvme0w9idAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoF0CLgBo1zy1IUCAAAECBAgQINB3ArtXrz5rpJbHpdc8N6n3SuLv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VXbuPNSyfuoQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEDgOwq4AMALQoAAAQIECBAgQKClAntWrH5wpzRvTfLAllZUa3YE9taSd45k5IPzt12zfXYi2HWYBfaOjf9gSXlRkp9w+L91b8Khkny9pnnr0aMHPr90166DrWuoEAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBL6LgAsAvCIECBAgQIAAAQIEWiiwZ8X4g5qS15SUH2lhPZVmTaDenNQ/qN2RNy2+buOuWYth46EV2Ldi7cNS6quS+uAkc4cWop3FD6Xmb5LyW3Ve+avFGzceaGdNrQgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIPCdBVwA4A0hQIAAAQIECBAg0DKBG8bO/55Oyitq6qOTzGtZPXVmT+BwSnlfpzZvmT957eTsxbDzsArsXzn+w71eeXUpeUCS0WF1aGnvw0n529T6rjqv+bzD/y2dsloECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECNwhARcA3CEmHyJAgAABAgQIECAwGAJ7V12wJr3uS0rKT9XU+f6DfzDmNgApay3l/VPp/PrSbddsH4C8IrZM4MYVq3+0lubVSe5XHf5v2XRzpCZ/3zS5rDfa/KXD/20brz4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECNxZAeeB7qyYzxMgQIAAAQIECBDoU4Gd544vmzdSnpuSpyc5J4n/3u/TWQ1crFo+PFWaV58zee3kwGUXeOAF9i4//1GlybHD/98bh/8Hfp7/pcDRWsrXanpvz21zPnfW3g23ta2gPgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIELizAg4E3VkxnydAgAABAgQIECDQhwI3L7/3/G5z6GeT8vyajCVp+jCmSAMoUFI/Nj2SV541MbG1JHUAK4g8wAJ7V44/utTympJcWB3+H+BJ/rfRp0pyZUp965EjBz+7dNeug20rqA8BAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTuioALAO6KmmcIECBAgAABAgQI9JnA/pXjz6q1vCzJaof/+2w4Axyn1Pz1Sd3ytDft3HT9xUlvgKuIPmACNWn2j615dEm9uCb3StIZsArifieBmumk/kup+c1bm+nPrJycPAyMAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBL4l4AIAbwIBAgQIECBAgACBARfYu+L8R6bk9ce+Idvh/wEfZn/F/3ySVy+c3Py14vB/f02m5Wnq4x/f2f8P//LoWurF5VuH/5uWVx62et2SXJ1e8/pti0/91P2uvHJq2AD0JUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAwHcScAGA94MAAQIECBAgQIDAAAvcuHLND9Raf6Mm3+eQ7AAPsu+i178ZacqvnTH/9C8Vh3P7bjptDlST0f0rzv/xUsrFNfXebe46pN16STaVUl+zYNvEn5SkDqmD2gQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEPi2Ai4A8HIQIECAAAECBAgQGECBmpR9qy+4b+l1X1Fr/bGSctIA1hC5/wRqTf6lKfWSg1OHP3Pezp2H+i+iRG0VuG7ZspNOHp33yF4try7JhW3tOcS9eiVlopu85qzJTR8bYgfVCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg8B0FXADgBSFAgAABAgQIECAwYAI1aXYvH79gtCkvSMpPJXX+gFUQtz8FvvXN3L3ytszpfWzhxMSt/RlTqjYK3LB43amdU6YfmdSX1+R72thx6DvVTNSS1yye3PzRobcAQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAge8g4AIArwcBAgQIECBAgACBARI4dvj/5rELlvdq95m15BlJlg5QfFH7V6AmZXut9d1TU+X3l+7atK9/o0rWNoE6Pj53/3TnR5Lea5Lct2399Mmxy0X2TicvWeLwv9eBAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEC31XABQDflcgHCBAgQIAAAQIECPSHwLET2nvHxs4uGXliKeV5qRnvj2RSDL5A2Z1af6/2mvcsvm7jrsHvo8GgCGwbG5t3Sp3zsKbUVyV50KDklvMOCxw7/L+l1ly8ePvmj9zhp3yQAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQyzgAoAhHr7qBAgQIECAAAECgyWwf3z89NptHlOSX6613nuw0kvbrwIl5caa+qFOOm+fP3ntZL/mlKt9AscO/59eRn+g1rwyyQ+2r+HQNzp2+H9TberrF2+d+MOh1wBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBOyjgAoA7COVjBAgQIECAAAECBGZToI6NzdvXjP5Q08ura3L/2cxi71YJ3FxL/ZNSm7cumtx0bauaKdPXApvHx+eeOZ0HNWl+paY+PEmnrwMLd2cFjh3+vzal/ubCbRMfKUn3zi7g8wQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEBhWARcADOvk9SZAgAABAgQIEBgYga+vXz+6fO+BBzRNfb1vyR6YsfV90Jp6sEn5VLfWNy++//deVf74jx3Q7fuptSNgXb9+9Ka9N98/TfnlbsqPlmRuO5pp8e8CvdRsSFPevLDT+1iZmDhChgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTuuIALAO64lU8SIECAAAECBAgQmHGBmnT2jp1/707y4po8JUkz4yFs2D6BkttKzZdrL5cu3LH5r0tS21dSo34UOPYzbf/KNetL7f1iTXlUklP6MadMd1mgJuXqJG9dePS2Py67dh28yyt5kAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkMq4AKAIR282gQIECBAgAABAv0vcOwU5S0r1o51S++FSXlqTV3Q/6klHACBYwdyr6ilvqt78OTLl+y56vYByCxiCwSO/Uzbu2L8e0ZK8+Je6mOSnN6CWir8H4Fakm/U5NI6t/nE4o0bD8AhQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAA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L3D7inucc6iZen5qeZYDs4M/z9luUGp21ia/U3sj71u8/ZrrZzuP/YdH4Obly+d3y9yX1OTpKVk2PM2HpulfpvbeuPCUuVeUDRuODk1rRQkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINBnAi4A6LOBiEOAAAECBAgQINAugf3j46f3pvKElPLykqxuVzttZkFgb03+sNet7zr7uokts7C/LYdUoI6Pz93fzRNKr1xSHf5v41vwT7XUX1tUpz9fJicPt7GgTgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEBgUARcADMqk5CRAgAABAgQIEKc1Qj4AACAASURBVBg4gc3j43MXHC0PqU1emeQHkjQDV0LgfhK4NbV+uvY677j6unP++aJ8cbqfwsnSXoGPJ52HrTr/ovTy+iQPaG/ToW12Ta/Wt3ZG88cLJyZuHVoFxQkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINAnAi4A6JNBiEGAAAECBAgQINAugZo0e1evXtV0m1fV1MeXlJPb1VCbGRY4VFK+lFLfdmud+spK39A9w/zDvd2+FeffozT1tbWWn0gyZ7g12tW+JttK8tsn1ZEPnbz9mt0lqe1qqA0BAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQGT8AFAIM3M4kJECBAgAABAgQGQGDv2rWn5Uj3JSV5cVLmD0BkEftVoGS61nyjSXnj1KF5n1my56rb+zWqXO0TuGHx4lM7J5/5ml7Jc0tyWvsaDnOjujspH+w13d9bvHXr1pJ0h1lDdwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECPSLgAsA+mUSchAgQIAAAQIECLRGoK5fP3rTvlsfX0teX5OVrSmmyGwJ7Eqtv9E7OOeDZ+3dcNtshbDvcArcOHb+c2pySU0WDKdAa1vfkuRPO8llZ06ee3XJF6db21QxAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIDJiACwAGbGDiEiBAgAABAgQI9LdATcr+89bcr3bqm0rykCRNfyeWrs8Fbqmpb6u3z3mbw/99PqkWxtu97PwHdEbqp0rK2S2sN8yValI/3al57ZZFZ1x9vyuvnBpmDN0JECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECDQbwIuAOi3ichDgAABAgQIECAw0AJ7F609LafVS5tan1qT0YEuI/ysCtTkcCn1fbU3+huLt19z/ayGsfnQCdy4cuWFtTfyhlryo0n87qBdb8A/Nk159fytm/6iJN12VdOGAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECgy/gH/EP/gw1IECAAAECBAgQ6COBfWPnvyzJJUk6fRRLlMETOHYo91MZzasWbt58bUnq4FWQeFAFrlu2bMFJnXmvraX8XEnmDmoPuf9bgS2lNG9YUI/8YZmcPMyIAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBPpPwAUA/TcTiQgQIECAAAECBAZQoCZl/9jaR6f2fisl5w5gBZH7SKAkf1ea8tIFWzdd0UexRBkCgWM/y24eO/+F3eR1SU4fgsrDVPGGptTf6/am3rV4+/brh6m4rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEBgkARcADNK0ZCVAgAABAgQIEOhbgf3j4/es3XJpah7etyEFGxCBMtmp+cX52zd9ckACi9kSgZp0blxx/mNq8saUrEridwZtmW3N7U3y51PdziVLdl77jZbUUoMAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQKtFPCP+Vs5VqUIECBAgAABAgRmUmDv2rWnlaPdN5SU59SakZnc216tE7il9vKyxTs2/27rminU1wI1aW4cG79/kl+rKRclmdvXgYW7wwKlZrqWXNlJ5+XzJ6/94h1+0AcJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYFYEXAAwK+w2JUCAAAECBAgQaItAXbr05H1zTn52KeXXU3NqW3rpMSsCt9TUty2anHh9SXqzksCmQytw/dgFY6Nl+qWp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T/lqufLKqROxhzUJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYGYFXAAws952I0CAAAECBAgQGDCBm5evXj9dmjem5KIkzYDFF7c/BDZ0a1593aLT//x+Duj2x0SGLMWt516w8Oho9zUleW5N5gxZ/TbXvb405S0jR0c+cMbODTe2uahuBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQGCYBFwAM07R1JUCAAAECBAgQuFMCe89bu7R0ei8ryc87NHun6Hz4PwRqdjalXjJ/cuL3SuLbub0ZMy5Qx8bm3diMPKn2yuuTnDPjAWx44gRK+XCv6b528ZYtW0pST9xGViZAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBmRRwAcBMatuLAAECBAgQIEBgYATq+Pjcfd08oqnlkprcc2CCC9o3AiXlptT6vrnN9FtO3bZtT98EE2RoBC5Omhcuu+CevZHuO5P84NAUH4qi5W+6nfL/snfvUXbedb34P9+9Z5Km1zQzk5SQZmaSmUkbCgXL/aAWEUVFwOsPFBAURRQoByilQKEXoFekFBBqQUCoCIgeUDgHuVV/KooGgbrSJjOZ2ZO26WVmkjZt02Rm9vM9q+jxgkIzyczsvZ/nlb9YK8/3+3m/X89es5JF9yeve9+uHV+7MKKoRGUlCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgUBEBCwAq8qLVJECAAAECBAgQWJjAnacObe6q1y7NkX9hYSc9TeA7/xT3wZzj87lWu2jdxI5vMyHQCoE71j3quK5VD1wZES9rxXwzl0YgRZqMyO88MN/90VNv3b53aaa4lQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgRaJWABQKvkzSVAgAABAgQIEGhbgVs2bFh1bNeq50bEtTmiu22DCtauAjkibpprphc97Jad/9CuIeUqt0COSFP9Iz9Ri+KzkVK93G2r0y5FzBYRH6rXmm9fMz6+uzrNNSVAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBA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TSBv3bpi+v65n08p3hwRW9otnzxtJ3AoIj49dzC/6mF3jE21XTqBKilw38DWUw7F3OtzxEsj4phKIpSv9NeKFK/fPXHi1x4b2+bKV08jAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEDgaAQsAjkbPWQIECBAgQIAAgbYW2DN4ev+KPH9ejnhRiljV1mGFa7VAERHfSinO65kY/WKrw5hP4EGBB5eY7D1w6Edy1K6KiEdQKYXA/shxTbM2/551ExN3lqKREgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECCwqAIWACwqp8sIECBAgAABAgTaSWCqf/NTU6pdHhGPa6dcsrSfQI44lHK6uOe4rmvS9u33tV9CiaoosH9kpHd2Nl8QES+NiJVVNChh56/lXLyxd/DU/z/dcMN8CfupRIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgvPGUjAAAIABJREFUQIAAAQIECBAgQIAAAQIECBAgQIAAAQJHKWABwFECOk6AAAECBAgQINCeAt/54uyhfE5O8T9TxHHtmVKqdhHIEX9Wm8u/1XPb2K3tkkmOagvks87q3rv3nqfmnK6JiC3V1ihN+/0R6b0519/dN3nT7aVppQgBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQILKqABQCLyukyAgQIECBAgACBdhG4u3/oB+ZTuiwint4umeRoT4EUeXeO+it7Gjs+myJye6aUqmoCezdtOqlo1i+JFL8ZEd1V61/Svn83X8QFN+1++A1PjRvmS9pRLQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBA4SgELAI4S0HECBAgQIECAAIH2E5jasuWEfLD5wpTSm1PE2vZLKFF7CeTLZ2cPXLx+z54D7ZVLmqoK5IjazMDw4yLH5yJFT1UdSta7GZGv7Cpmr1i9e/e+knVThwABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQWUcACgEXEdBUBAgQIECBAgEB7CExtOm0kiuLiFPkXIqLWHqmkaE+B9JV61H7t5MbNjfbMJ1UVBW7ZsGHVMfVjLkkpvaaK/UvZOed/TLX0hjUTo19KEbmUHZUiQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgUURsABgURhdQoAAAQIECBAg0C4CeevWFTMH5n8yR74qRWxul1xytJ9AyrE31/I5PRNj1/tCbvu9nyonunNwcF09d30rItZV2aFE3Zsp5aujHhf3jI3tL1EvVQgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgCQQsAFgCVFcSIECAAAECBAi0TuD+U7esf6BevCkiXta6FCZ3gkCOeN99MffqwUbjYCfklbEaAhdG1F7RP/SqnNI7qtG4/C1TxLdTLd64Znz0z8vfVkMCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQOFoBCwCOVtB5AgQIECBAgACBthLY1z/0mGakD0SKH2irYMK0m8DfddWLl5+0a9c/pYii3cLJU12BvHXrir33z30up/jR6iqUp3mK3IyIT9eb8YbVt4ztKk8zTQgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgqQQsAFgqWfcSIECAAAECBAgsu8DUli0n1A42f92/nL3s9J028GAR8Vt9XfkP09jYoU4LL2+5BWb6h38up/hURPj7egledYoYz6m4qHdi1x+UoI4KBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQILAMAr5QsAzIRhAgQIAAAQIECCyLQLp74/DgfD3eFTmeuSwTDelEgbmI/PH5ej73lF277urEAjKXVyBv3bpi5oHZ6yKnF5a3ZaWaNSPiy/WI805ujH6zUs2VJUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIEjFrAA4IjpHCRAgAABAgQIEGgngXzWWd1T0/c+vRb5ukixvp2yydI+ArUc35iPdME93cWXh8fGDrVPMkkIREwPDD8hRfxJDj/DyvF5SHdEFO+anT1wzfo9ew6Uo5MWBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQILDUAhYALLWw+wkQIECAAAECBJZFYO+mTScVuet1kfMblmWgIZ0ocG9EvrSrmH3/6t2793ViAZnLK/DJiPqPDA5fGDneVN6WlWpWRMTXc+TX9zXG/rJSzZUlQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgaMSsADgqPgcJkCAAAECBAgQaAeBHJGmB7eM1HLxoRzxpHbIJENbCnwxF8X5vbt3fTNFNNsyoVCVFdg3eHp/M89/OiLOqixCuYrfExEfmZ1Nl6zfs3O6XNW0IUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIGlFLAAYCl13U2AAAECBAgQILAsAqNDQytPns/PjVR7T+Q4flmGGtJRAjnirpTirbXU/IM14+MPfjHXLwJtJTDdP/RbkdLVEdHdVsGEOVKBm4taes3a8Z2fP9ILnCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBagpYAFDN9641AQIECBAgQKBUAlNbtpyQDhXXRMSLSlVMmUURSBGzEflPc9Qu7G3svHlRLnUJgUUU2LN+pHdld/5ITvGMiKgt4tWuao3AoYj02e75rt886dbte1sTwVQCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQ6FQBCwA69c3JTYAAAQIECBAg8B2BHJHuHhg+cz7i0yliExYC/1Ug7YgUbyvu6/rTtVPb7yNEoN0EpjYNPzMVcW1ErG+3bPIckcCdEfH23sbog4tp/CJAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgsSsABgQVweJkCAAAECBAgQaDeBHGd3TQ/e8qqUa5f7l7Pb7e20Pk/OcV9K8bGuIq5cvXt0vPWJJCDwnwX2rF9/7IoVx12aI34jRRzDp+MFHtxL88+1ovmyNbt3/U3Ht1GAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBJZdwAKAZSc3kAABAgQIECBAYDEFJgYGVp8Y3dfniJ9czHvdVRaBvK2e4uLV9fhCGhs7VJZWepRHYHrTyONykT+QIs6wxKTz32uOeCBFfLJWa56zZnz8ns5vpAEBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQILLeABQDLLW4eAQIECBAgQIDAogpMbxp5WhTFpyLSyYt6scs6XiClmM6Rfy8X3e/pm7zp9o4vpEApBaYGh19by+kNObKfYeV4w1M5FW/sm9h1XTnqaEGAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECyy1gAcByi5tHgAABAgQIECCwqAIz/cNX5hSvXdRLXVYKgRz5K7Ucb1ozOfb1FNEsRSklSiVw56lDm+td6dqU44dyRHepylWzTBER36ql2ovWTOz4djUJtCZAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBoxWwAOBoBZ0nQIAAAQIECBBomUAeGlq5d772lRz5yS0LYXC7CtyWIl+1Zvak30t7th1o15ByVVtgenDkhVHkt0WKDdWWKE37gxHx8Xtj7rcGG40H/7dfBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgwQIWACyYzAECBAgQIECAAIF2EZgeGH5CRHw1Ila1SyY52kJgLkd8sTvnC1ZPjn2jLRIJQeC7BPasP+vYFSvvvTKK/MJIcTygUgjcHSm/ondi7GOlaKMEAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECLREwAKAlrAbSoAAAQIECBAgsBgCM4Mjr8k5X7UYd7mjPAIpYryZ89v7ek/6g7Rt21x5mmlSJoGpjZvPSim9P1I6KyL83bzzX24REf9YT/O/ePLExGTn19GAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBFol4EsGrZI3lwABAgQIECBA4KgFpgaG/leK9OyjvsgFZRK4P1L8r6JWXLh2166xMhXTpVwCM/1Dv5pTujAiTi1Xs8q2mcs53tU7OXpeinhwGYBfBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEDgiAQsADgiNocIECBAgAABAgRaLTA1OLglFV1/Eyl6Wp3F/HYSSDtTLb9hzfjon6SI3E7JZCHw/wT2btp0UrOoX5EifjkijiPT+QI54oGoxS/2jY/+eee30YAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEWilgAUAr9c0mQIAAAQIECBA4YoHpgZFfici/HxG1I77EwbIJ3BMRH1kxmy45cc/O6bKV06c8AlOnbnlsqhfviYgnlKdV1ZuknT2NM7em+FSz6hL6EyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgMDRCVgAcHR+ThMgQIAAAQIECLRAIEek6YHh96WI34gIf6ZtwTtow5E5IrZHkc7p3b3zy22YTyQC3xH4zs+vjZtfkmrpTRFpI5aSCOT0u72TO3+7JG3UIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIEWCviyVAvxjSZAgAABAgQIEDgygTsHz1hXy4e+EBFn+gPtkRmW71Tel1J655pV3Zen7dtny9dPo7II3LF589r6fP1tKeVfiohjy9Kr6j1Szr/WMzn2+1V30J8AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEjl7A96WO3tANBAgQIECAAAECyywwtWn4mSnHxyPH8cs82rj2FChyxD+nWvMlvePj/9CeEaUi8C8C+waHf6iZ48qIeDyTcgikiLn5+dpj192649vlaKQFAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECLRSwAKAVuqbTYAAAQIECBAgcEQCU/3DF0eK16WIlUd0gUNlE7g3R76qtzF2SYrIZSunT3kEckR9pn/opamWzs85NpSnWeWb3NTbGN1aeQUABAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQILAoAhYALAqjSwgQIECAAAECBJZLIA8Nrdw7nz6bI54WEfXlmmtO2wo8+IX/sVwUz+vbvWtb26YUjEBE3Lt5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qghMD4ycFpHfFxFnV6VzlXrmWn5+7zErPpW2b5+tUm9dCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGDpBSwAWHpjEwgQIECAAAECBI5SYKp/+OJaSi/PkU8+yqsc7yyBbzQjv2FtY8OXU9ww31nRpa2yQI6oTQ0OP6WW46MRsbHKFqXtntPP9vSe8Odp27a50nZUjAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgRaImABQEvYDSVAgAABAgQIEDhcgRxRnxkYfndEvCgiVh3uOc91vMChFPGRWtQvPblxc6Pj2yhQKYE969cf29197C+llN4bESsqVb4iZVMUP7GmceqXLCepyAtXkwABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAssoYAHAMmIbRYAAAQIECBAgsHCBu/q2Hl8/bv6DOfLPR0Rt4Tc40YkCKaKRI114b8x+YrDRONiJHWSursD+h5/WM9fVPC+nOLe6CuVuniOf3dsY++sU0Sx3U+0IECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYLkFLABYbnHzCBAgQIAAAQIEFiQwvWHk4bkrPpAiP2NBBz3c0QI54s/qteYb14yP39jRRYSvpMCeTZs2rsj190aOZ1YSoAKl6xGPWd0Y/VaKyBWoqyIBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQILKOABQDLiG0UAQIECBAgQIDAwgWmBrdsSTm/LyI/deGnnehQgbuLFO/oSs13rxkfv6dDO4hdYYGpTZtGarn+6ZzjjAozlLn67IpIZ57Y2HlzmUvqRoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQKtEbAAoDXuphIgQIAAAQIECBymwB2bNj2yXtTfkyJ+6DCPeKzDBXLEt6IWb+odH/18iig6vI74FRP4ZET9RzeOPCnXij/LkVZXrH4l6qaIu4tUe2LfxI4dlSisJAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEC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wk870QECe2o5zl0zOfqHHZBVRALfUyBHpOlNwz+ZivhzTFUQSDtyM/1I3y079lShrY4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgsHwCFgAsn7VJBAgQIECAAAECRyBwz4bNQ3PdtfdHjqcdwXFH2lsg54gbu1LXs06euGmyvaNKR+D7C+SI2r6B4V8vIt7PqhIC9+ei+OHe3bu+kSJyJRorSYAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQLLImABwLIwG0KAAAECBAgQIHCkAlOnbllfqzc/kCP9xJHe4VzbChyMiE/0NEZf7Au0bfuOBDtMgRxRnx4YeXOK/ObDPOKxThfI8XM9k6OfSRHNTq8iPwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAi0j4AFAO3zLiQhQIAAAQIECBD4bwT2DQysbsaKD0fkZwMqm0DeFzne1Ds59rtla6ZP9QQeXACwd2D4vTnipdVrX83GzSLOmzq+++oztm+fraaA1gQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECCwFAIWACyFqjsJECBAgAABAgQWTSDHWd0z/fs/FCmeGxH1RbvYRe0gcHvKxc/3TO7623YIIwOBoxHIcXbXTP9tn4gUP3s09zjbOQI55+vuS/OvHGw0DnZOakkJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoN0FLABo9zckHwECBAgQIECg4gI5Iu0bGH5vEfHiiDim4hxlqt+MHF8tDtz9M2unpu4rUzFdqimQzz67a6Zx25ci4oerKVDB1jm+NDt3/7PX79lzoILtVSZAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBJRKwAGCJYF1LgAABAgQIECCweAJT/cNXRsRvphTHL96tbmqlQI44mCJf3dsYO7+VOcwmsFgC+ayzumdm9v9TRDxise50T3sL5Ijx/fc0f2DzvvF72jupdAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECDQSQIWAHTS25KVAAECBAgQIFBRgZmBkbdE5FfmiDUVJShj7XuLlH9t7cTYp8pYTqfqCTy4AGB6Zv8tKWJd9dpXtnGziHjs2sboNysroDgBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQILLqABQCLTupCAgQIECBAgACBxRbYOzDy+iLyqyOib7Hvdl+rBPKdXcXs6at3797XqgTmElhMgTsHz1hXj9lbI+euxbzXXe0tUBT5F9buHvvj9k4pHQECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAh0koAFAJ30tmQlQIAAAQIECFRUYG//0C83U7okRQxWlKBstYsc8cm+xujzylZMn+oK3LXp9OFaMb+zugLVbJ5znNs3OXpVNdtrTYAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJLIWABwFKoupMAAQIECBAgQGBRBaY3jjwtUr46UpyxqBe7rCUCKaX5omi+vm9y1ztaEsBQAksgsG9g6IebkW5Ygqtd2d4Cf9LbGP259o4oHQECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAh0koAFAJ30tmQlQIAAAQIECFRUYLp/+PRI8fsR8cSKEpSt9mzUaz/Ru2vHV8pWTJ/qCkwNDj0r5fSZ6gpUs3mOuLf3gVUPS3d++/5qCmhNgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAostYAHAYou6jwABAgQIECBAYNEF9g0MrJ5P3R9LOZ4REfVFH+DC5Ra4Kzdrj+m7Zcee5R5sHoGlEpgeHHlh5PyRpbrfve0rkFN+dt/E2GfbN6FkBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINBJAhYAdNLbkpUAAQIECBAgUGGB6f7ha6IWL44cx1eYoRzVc3y5d3L0R8tRRgsC/yIwNTD8mynifTyqKJAu7W3sfEMVm+tMgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAAB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gQQUACwQfHuvPZgjXdM3NnRJe691GwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECdRdQAFD3L8D8BAgQIECAAAEC/y6wf82mk3NP85Mpp5/H0haBiUbOzz1pfOR/t+U2lxBYAIHJgcEn5iiujsg/twDXu7LDBXLEvpTTpXlJ+uO+HTsOdfi4xiNAgAABAgQIECBAgAABAqUSUABQqnXMVxgFAPMl61wCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBH6igAIAHwgBAgQIECBAgACBHwkMDw4uPvFI8eJU5Csj4gQw8y2Qbotonr9ibOSD832T8wkslMCt69dvTM2uS1LECxYqg3s7WiBHxD925+6zTxi/4VspotHR0xqOAAECBAgQIECAAAECBAiUSEABQImWMX9RFADMn62TCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBD4CQIKAHweBAgQIECAAAECBH5M4NaBgVVFLHpvRD4TzLwL3NXM6aMrx4deM+83uYDAAgncvub05Y2e6bObOb8lIvw3+ALtoZOvvfdH/82Ia7uKxsXLd+26vZNnNRsBAgQIECBAgAABAgQIECiTgAKAMm1jfrKkiIPNSNf0jQ1dMj83OJUAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIPLuDHB74MAgQIECBAgAABAj8mMDowsOS4WPRrReSrc8RqOPMncO+PVnPkrx2K6f+2bmzs5vm7yckEFlZgX//gC4uU3psjli9sErd3sMCRZkpPu2506KvPi2h08JxGI0CAAAECBAgQIECAAAECpRFQAFCaVcxbkHsLACLSNb0KAObN2MEECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECDy4gAIAXwYBAgQIECBAgACB+wns6z/tkSlNXx4RL46IAtD8CaSI0Wbkl/aNjVw3f7c4mcDCChxYt+kXcs5X5IifXdgkbu9kgRz588dOxcuX3jSyt5PnNBsBAgQIECBAgAABAgQIECiLgAKAsmxi/nIoAJg/WycTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIPCTBRQA+EIIECBAgAABAgQI3E9gdGBgydLoekZXdF0RkTcBmleBW3LERX1jwx+e11scTmABBfat27w55bwtIp+5gDFcXQeBlC+/e+qey07Z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hRW4de36JxVF90ci8qaFTVL921PEV3LEm1eMDX+t+tOYgMCDC4wODCx5RPRc0Yx4eYpYwonAwgmkodRsnn9HMf3ZdWNj9yxcDjcTIECAAAECBAgQIECAAIFqCCgAqMae5phSAcAcAb1OgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgMDsBBQAzM7NWwQIECBAgAABAgQeVCBHdE/2bzwvR5ybUhyHaU4CE5HyuYfy9F/4MeqcHL1ccoH9A5t+LSJ/OCJWljyqeB0ukFJ8rpHjbdeNDX/neRGNDh/XeAQIECBAgAABAgQIECBAYE4CCgDmxFeVl2/Pkd7TNzZ0UVUCy0mAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQGcIKADojD2aggABAgQIECBAoCQCOSJN9m88NVJcExFPL0msasZIaTpyfn9uFO/q27NjoppDSE3g4QUObdiw8nCj+HhEPC0iiod/wxME5k3g9kjxvtSV39U7MnLHvN3iYAIECBAgQIAAAQIECBAg0AECCgA6YIkPP4ICgIc38gQBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAvMgoABgHlAdSYAAAQIECBAgUG+BvGVLz22Tdzy3GbEtIjbUW2Ou06cvNSOftXJs+JtzPcn7BMosMNm/6ayc8jsjoqfMOWWrhcBY5Di7d3z4r1NEsxYTG5IAAQIECBAgQIAAAQIECMxCQAHALNCq94oCgOrtTGICBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECHSGgAKAj1mgIAgQIECBAgACBMgnkiLS//7RVRUydnVO8KiItLVO+imXZFym96e6pu/78lL17765YdnEJHLXAgTWbH93san46Ugwe9UseJDBPAjnSF4pm8+ze3SPb5+kKxxIgQIAAAQIECBAgQIAAgcoLKACo/AqPZgAFAEej5BkCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBFouoACg5aQOJECAAAECBAgQIBCRI7r29Q8+uiuld+SIX2Yya4FmpPzBPN11ed+eHROzPsWLBEouMDw4uHj5dHpvjnh5yaOKVwOBnOPOVOT39D7usRemP//zRg1GNiIBAgQIECBAgAABAgQIEJixgAKAGZNV8QUFAFXcmswECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE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LdZsSAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQLlE1AAUL6dSESAAAECBAgQIFATgT1r1hxzTPfS50XkcyNic0QUNRl9rmNO5Jyf3Tc+8i9zPcj7BMosMLF69dJFi447M0e+MkX0lTmrbPUSSBGNHPH1XMRltyzp+bsztm8/Ui8B0xIgQIAAAQIECBAgQIAAgQgFALX4Cm5POd7bOz58YS2mNSQBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAqURUABQmlUIQoAAAQIECBAgUEeBPWs2nby0p3lWzumlEXFiHQ1mM3NOcU7f6PCVs3nXOwSqIpAj0v716zdGs+uqFPHsquSWszYCt+eIT+aicdXKXbuGazO1QQkQIECAAAECBAgQIECAwI8EFADU4lNQAFCLNRuSAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQPkEFACUbycSESBAgAABAgQI1EzgwCkbzshdxftzip+LHN01G39W46ac/2n5+MgvpojmrA7wEoGKCBxYv/6E6WbXS4ocF0aK3orEFrM+Ajsj53d3pelPLBsbO1ifsU1KgAABAgQIECBAgAABAgQiFADU4itQAFCLNRuSAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQPkEFACUbycSESBAgAABAgQI1Ezg3r/l+8DaTS+LIp+XIwYioqgZwWzGvScitq4YG/7abF72DoGqCOSIYv8pm38mdTffGTmeWpXcctZDIEUciUj/ELnYtnz8xv9fKUs99m5KAgQIECBAgAABAgQIEPg3AQUAtfgSFADUYs2GJECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIFA+AQUA5duJRAQIECBAgAABAjUU+P6qwb7uY+LcyOnVKeKYGhLMfOQirlixa/i8mb/oDQLVErhj9aYVU4vzq3KOsyPihGqll7YGAgdzjj8opvN7em8a2VuDeY1IgAABAgQIECBAgAABAgR+KKAAoBYfggKAWqzZkAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTKJ6AAoHw7kYgAAQIECBAgQKCmAjevX/+o7mZxZYr0tBzRVVOGox87x3enc/zqqt3Du47+JU8SqJ7AlyK6zxgYfFKK9I6IeGL1JpC4BgLfKyLePr205zMrt2//QQ3mNSIBAgQIECBAgAAB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AgQIECBAgAABAgQIECDwQAEFALX4KhQA1GLNhiRAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBQPgE/DijfTiQiQIAAAQIECBAg8JACk4ODa/J0el3K8dKcYgWq+wjkHPHNnOINK0eHv8yGQB0Eblu3rr8R3W+PHM+JiKV1mNmMVRRId+acL76ncff7T9m79+4qTiAzAQIECBAgQIAAAQIECBC4v4ACgFp8EwoAarFmQxIgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAon4ACgPLtRCICBAgQIECAAAECDymQt27tnhyf+JnUzG/OKZ7pB78PoPp+yunq5T3N96WRkcM+JQJ1ELi1f9MzU+T3phQb6jCvGSsr8K/NNP07K0dHv1LZCQQnQIAAAQIECBAgQIAAAQI/JqAAoBafgwKAWqzZkAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTKJ6AAoHw7kYgAAQIECBAgQIDATxS4te/047qOO/LMnNO5EfEzuO4jcCQiPpeLrvP6dt04xIZAHQQmBwcfkafTNTni+SnimDrMbMbqCaSIe/98/qNFXc0Lj9+589bqTSAxAQIECBAgQIAAAQIECBC4r4ACgFp8EQoAarFmQxIgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAon4ACgPLtRCICBAgQIECAAAECDyswsXrTikWL8ksjxesix5qHfaFeD9yQclzQOz786XqNbdo6C+xbv/FXUjOuioiNEVHU2cLspRXIOWKsiOZbesd2frK0KQUjQIAAAQIECBAgQIAAAQJHKaAA4Cihqv2YAoBq7096AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABApUVUABQ2dUJToAAAQIECBAgUHeBiXXr+hfn7gtzxK9HxJK6e/zY/HfmSL/XuHvJBatu+fadXAjUQeDg2kctm053Xxop/VZEHFOHmc1YSYEjOfIXctF808pdu4YrOYHQBAgQIECAAAECBAgQIEDgRwIKADr/U0gRPywA6B0fvqDzpzUhAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJlElAAUKZtyEKAAAECBAgQIEBgBgI5otg3sOHpKRfnFymekCMWzeD1jn40RXwlcj63d3zkf3f0oIYj8GMC+/s3PCWl4toccVpE+O99X0cZBXJE3Bwp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AAECBAgQIECAAAECBAgQIECAAAECBAgQeACBeuGFw7snp59a2ryyJhcCG0iBnaXW1568fPhXy9atUwMpIDQBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSSGADgMSBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQWTKAmZe9Zmx5eO81v1OQSn2VYsK1YyMJtavlU25n5T6feeuvNC9mI2gQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEFhoAQMAFnoH1CdAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgMscPc552/spveiJM9KKZ0Bphjk6PtT8vo1229+TUnaQYaQnQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgYAeAYIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBBRG48cILh08/PHVlTXlukpMXpAlFF1agZCbJX9XSefbaW79w08I2ozoBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQWXsAAgIXfAx0QIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIGBFNi1cfOPpJb/nmTdQAIInZQcrDUvPmXDGW8r1147OwzAiwABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgMtYADAQG+/8AQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYGEE7j5n0xM7pfnlknzTwnSg6iIQaJO8f7SMPHPF9hvvWQT9aIEAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQILLmAAwIJvgQYIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgMBgCdy1YcMFwxl6dZLvTdIZrPTS/jOB6abWH1t927Z3lqSSIUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIHEAABPAQECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIDBvAjdv3rzypOnOz5fS/lSSsXkrrNCiEyjJ7508NvT0snXr1KJrTkMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBYIAEDABYIXlkCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIDCIAns2nP+TNe2ra3LSIOaX+R8FDtVS/+Pa7dvex4QAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE/knAAABPAwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIHDCBSaS5qc3bn5qavOGkro5SXPCiyqwWAVqKeVta7bf9MzF2qC+CBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgsFACBgAslLy6BAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBggAR2bTzvMbXWVyR5UklGBii6qP+XQKn5UpvmR9fe9sVr4BAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIDAvxQwAMATQYAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECJxQgf1nXLBmamjmTUl+KCljJ7SYxRe7QC3JW07ecfMLStJb7M3qjwABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAvMtYADAfIurR4AAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBkSgJuXA+vPWTA3XFyf5iSQnD0h0Mb+OQCm5c2amPmHdHdtugUSAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECXytgAICnggABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEDghAvdu2HBaN8M/1qb+dJIzTkgRi/aTwIEm9dX3ZebNG3fsmOynxvVKgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACB+RIwAGC+pNUhQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIDJHDX+vNOGRlufyQpz6nJxgGKLurXESglf3q0zYtPv+3mL5akBUWAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECXytgAICnggABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEJhTgTvPuGDNaHfm36c0z03qeXO6uMX6VeCutPWla5qZ3y87dkz2awh9EyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBA4EQLGABwooWtT4AAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBkhg39lnr+6V4e9PKc+pySOSNAMUX9R/XWCyJO/oZXri1B077oZEgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAl9fwAAATwcBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAwJwJ7zj13Va/XPLWU8uxS8q21ZmhOFrZInwvUG0ryc3u6uXbLtm1H+zyM9gkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIHBCBQwAOKG8FidAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAoMhsPP888ebqd6Tay0/U5NLSzIyGMmlfACB3TX1qpHh5tdW3nTTLloECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg8I0FDADwhBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQLHJXDX+vVjQ93lTyxNfqamfntJWXZcC7p5yQiUlA/Wkles2b7+UyXXziyZYIIQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEDgBAkYAHCCYC1LgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQGQaBu3jyye6r5tjT1OTV5UkmWD0JuGR+UwI5a66sy2nn32i9+8cCDusNFBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQGHABAwAG/AEQnwABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIPFSB6y++eGjjrvseVUuen1K+OzXjD3Ut9y0tgZocLanvrqXz6lO2f/GmktSllVAaAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQInBgBAwBOjKtVCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIDAkhaoSdmzftOZGe78r5r6uMTh/yW94ccaruTGtHnF3qH6p1u2bTt6rLe7ngABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAoMqYADAoO683AQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBA4DgEbj/r/PXLO703tynfW5KR41jKrUtNoOZQkl/u1qNvOun22/cutXjyECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBA4EQKGABwInWtTYAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIElqDArg1bLqnJc5P8gMP/S3CDjy9Sm+QvU8ovrNl+0ydLUo9vOXcTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgsAQMABis/ZaWAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgcl8Cuc7d8Z2peWmq+vSbDx7WYm5eiwNZS6sRnt5/5R5fn2pmlGFAmAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQInEgBAwBOpK61CRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIDAEhLYdc6m76+l+bmSPDJJs4SiiTIHAqVmVy35zdprfmXtHV+8aw6WtAQBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQGTsAAgIHbcoEJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgMCxCdSk2b3hvB9NaV+WWrYk8XmDYyMchKtrSf42qS9ds2PbxwchsIwECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBA4EQL+h/yJULUmAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBYAgJ19qD/+vXLdneX/3hKXpKSMxz+XwIbO/cRZh+Vm2ttf2ntbdt+d+6XtyIBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQGR8AAgMHZa0kJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgMCDFrg66Vx61vnrxpr6jJT6vCRrH/TNLhwogZKyt6b+dpmub1jzpW13DlR4YQkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIDDHAgYAzDGo5QgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQL8L1IsvHtq9+8CmNvUZTfJjSU7t90z6P0ECJTOp9e96tb543W23fOwEVbEsAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBkbAAICB2WpBCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIDAAwts37BhdLwZfkRb22eUWn64JGsf+C5XDKhAW5MdTa2vOvm2bb9VknZAHcQmQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIDAnAkYADBnlBYiQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQL9LXDz5s0jq6c7j0tpfzzJk5Os6e9Euj+hAjUH29Tf6nTr69fccssdJ7SWxQkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIDAgAgYADMhGi0mAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBL6RwF3r148Nd1c8tnTq82vNdyYZIUbgGwj0SsonZkp+at32mz5DigABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTmRsAAgLlxtAoBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEOhLgYmkeeHmzWumenlCbcuzkvqElNLpyzCani+BmuSmpLzmlB03vWO+iqpDgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBQRAwAGAQdllGAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECDwrwjUiy8e2r37wKam1Kf1an6kJBckGYZF4BsL1L01+ZXhmeG3rLpz6x5aBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIDB3AgYAzJ2llQgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQN8I1A0bRnele0kpzRWp9alJzu6b5jW6oAI1+b22V1++7o5ttyxoI4oTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgCQoYALAEN1UkAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECDwjQTqhReu2HNk6ntSy9OTXFKTNcQIPEiBT5Zan7vmtm3XPcjrXUaAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECxyBgAMAxYLmUAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAj0s0BNyr4NF5zTZub7aspPJNmUZLSfM+l9PgXqbUnzijVrxt9Zbrhhej4rq0WAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFBETAAYFB2Wk4CBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQGHiBXedseVgt9RWllsel5MyBBwFwTAJtbV8+0hv5n6vu3LrnmG50MQECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAg8aAEDAB40lQsJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEB/CtQN33LS7nL4aWnr01NyWZJl/ZlE1wso8N6jnfZnzrjlljsWsAelCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgsOQFDABY8lssIAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgMssC9G7Z8S5P8hyT/KTWnp6Q7yB6yPwSBWq9Pba5cc/tN15ak9xBWcAsBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIPEgBAwAeJJTLCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAvwnsOee8p9RSJ2pyQZKV/da/fhdeoCaHU/PfepP7/+S0e+45tPAd6YAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJLW8AAgKW9v9IRIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAwAAK3Hvmps1Np3NFLfUnSnJ2ks4AMoh8nAL3H/5PeWtbpl+3bvv2e45zObcTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAwIMQMADgQSC5hAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI9IvAvWdtfHzTGZpI6mOTjCbx2YB+2bzF1mfNO7tpXr7qti/uKEldbO3phwABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAktRwP/kX4q7KhMBAgQIECBAYLEK1FpSig8ILtb90RcBAgQIECBAgAABAgQIECBAgAABAn0rUJOyZ/PmC+tM/nNJ+c81Obtvw2h8MQjUUvPhTqf52VW3fvHTJekthqb0QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgUEQMABgEHZZRgIECBAgQIDAfApM1Can39DJlw901i2f6kwfWtVpV400bW1PmelNPawMrfi7Q897xD3z2ZJaBAgQIECAAAECBAgQIECAAAECBAgQWKoCNensPvO809pO+92lKc9IzaNLMrJU88o1LwJtkr8vpb52+vDYB06757OH5qWqIgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBwv4ABAB4EAgQIECBAgACB4xP4yoH/0fHdvWWd0o73Sl3flrqppGxpmrIltWyuJeem5qSktkN1cuOel15+5/EVdTcBAgQIECBAgAABAgQIECBAgAABAgQGW6Amzb4NG1bO1JFHltJ7RpLvSsppg60i/RwI1JLsaGv5HzND7f85fdu2nXOwpiUIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBA4BgEDAA4BiyXEiBAgAABAgQIJJmozdq1nx87vO/u5d3h8RdGqacAACAASURBVLG21zs9KZemyWWllMfUmjOS2vxrVjX51LLDk9+xc+LygywJECBAgAABAgQIECBAgAABAgQIECBA4NgFJpLm2Zs3r5jpdTY0tf5AqfUHU3LRsa/kDgL/qsCemvyfmXR+5fQdX9jBiAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTmX8AAgPk3V5EAAQIECBAg0H8CE7VZMfy3a0pn2cm1mTm9qXlkrfXhaZoLU+v5SU5+wFAlNak/d+DQyjdm4qKpB7zeBQQIECBAgAABAgQIECBAgAABAgQIECDwLwT2nHvuqto0Z6bXfHdt2++pKZeUkuWYCMyFQE093KT8yXTTe81pt976ublY0xoECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgcOwCBgAcu5k7CBAgQIAAAQKDIXDVB0aWT56yunSzppmaObN2yuVJeWxq+01JOelYEUpyW9uU7zn4wkv+IaXUY73f9QQIECBAgAABAgQIECBAgAABAgQIEBhUgdmD/0eb5szhmfybmvKUJJcmWTmoHnKfEIHJJH+T2rxuzcbT/6Zce+3MCaliUQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4QAEDAB6QyAUECBAgQIAAgQESeOv1Q8uPzJycyenTuk3nvDbNY2rqN5eURyR1XZKH9v6xZH8t5Y3LDh55086Jyw8OkKioBAgQIECAAAECBAgQIECAAAECBAgQeMgCswf/U0bOanszT6yp313SXJrU1Q95QTcS+NcFppL8fUp9S+nkvWu2bdsPigABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQWTuChHeBauH5VJkCAAAECBAgQmGuBiWu6K05etbo7OXPGTOqWkvZRtdZvTsnDSsr6JN3jLVmTD7XJSw9vuOMzueKK3vGu534CBAgQIECAAAECBAgQIECAAAECBAgsZYG71q8f6w6Nnd8t5d+0NY9PySVJ1i7lzLItmEBN8sWavLktM3+8bvv2exasE4UJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBA4H4BAwA8CAQIECBAgACBQRWYuKZ7Unf4jJnh8piScklKLkyyJTVnJhmdM5ZSdiXlyvGVnXfd9axHHZ6zdS1EgAABAgQIECBAgAABAgQIECBAgACBJSZwYNOmU49M1/PSdC4uyXeVkm9PzYolFlOcxSPQJvlSTfnNyZnuVWfduXXP4mlNJwQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEBhcAQMABnfvJSdAgAABAgQGUqCWU1730RWHO8MXdHoz35TSXJa0j0vKuUmG5pykZH+SP5juzUxMXvn42+d8fQsSIECAAAECBAgQIECAAAECBAgQIECgzwVq0tmzadP6Xi8P79TmiW3Jpal5WCk5OUnT5/G0v3gFak12dpK3H03n10/f8YUdi7dVnREgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGCwBAwAGKz9lpYAAQIECBAYYIFlb/rYGUMzeUSSx9Q035HUTUnWn5CD/191LsmH29RXHjy88rpMXDQ1wPyiEyBAgAABAgQIECBAgAABAgQIECBA4F8I3Lx588iqdujsTtv71jb18pI8uiZbSjKOisA8CByoye8M9eobT7pj2y3zUE8JAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHiQAgYAPEgolxEgQIAAAQIE+lVg2Rv/+qzuzPAT05Sn1rZuKqWcldRTTnSekuyoTTMxVkd//54Xf/OhE13P+gQIECBAgAABAgQIECBAgAABAgQIEOgHgetz8dB55x7aON32nlJTL0/K+TU5qyTL+6F/Pfa/QE2ONskftU3vFWtvvfWm/k8kAQECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBJaWgAEAS2s/pSFAgAABAgQI/KPA8jd8/JtKet+fWi4rKVuSnJOkmSeiXkl+bXqqvu7Iyy/70jzVVIYAAQIECBAgQIAAAQIECBAgQIAAAQKLVaDs3rx5fLotj2lqLu3U8ria+ohSs66WdBdr0/paegKlZKbWvC9Nec0pt970yaWXUCICBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAj0v4ABAP2/hxIQIECAAAECBP5J4A1/vny8rHpkaesTas1TUnJBSlmdWuf1fV8puaGU8rP3nX3JX+WK0rNFBAgQIECAAAECBAgQIECAAAECBAgQGFSB3Zs3n5mZ+ria8h1J+Y5ac2opdXVSOoNqIveCCvxl2yuvvP3U8Y8/6oYbphe0E8UJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBA4F8VmNeDYPaAAAECBAgQIEDgBAm87iPjK0rzrSX57pryXSXlnGT2A6RpTlDFb7Bs2VVr+z9r6f7aoZc85u75r68iAQIECBAgQIAAAQIECBAgQIAAAQIEFl5g96ZNZ6XX/EBbyg83tZ5VS05OzYqF70wHgytQb0vT/vDepvnslm3bjg6ug+QECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBY3AIGACzu/dEdAQIECBAgQOAbC1x9dWfV9nMe2WbmWSnl8qSsTe7/AOkCHPz/aqslH6nJzx/8uzv+Nu+5omcLCRAgQIAAAQIECBAgQIAAAQIECBAgMIgCu84679G1076vfOX7tgv3PdtBxJf5awRKyu5eyfd/fvtN112ezCAiQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgcUrYADA4t0bnREgQIAAAQIEvq7AyRMfX3l0WS4pTf3eUut3JmVDkpEkC/3+rk3JO2aaziuOvPAxd9hCAgQIECBAgAABAgQIECBAgAABAgQIDKrAjRdeOHzakZkX1Vp/viSjg+og98ILlOTv21r/+ym3bfu9khjcu/BbogMCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAh8Q4GFPiBmewgQIECAAAECBI5FYOKa7vKx4Yua2jwvJU9LMp6kuwgO/v//Ke5OyS8ceNGlb0sp9ViiuZYAAQIECBAgQIAAAQIECBAgQIAAAQJLTaBefPHQrl0HXlNKfeFSyyZPnwiU8rla6mtPaeoflG3bjvZJ19okQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIDAQAsYADDQ2y88AQIECBAg0DcCswf/R0ce1jTl6SX5gZpsXJS9l/I3SbnywIsvuW5R9qcpAgQIECBAgAABAgQIECBAgAABAgQIzLPAvrMfsXqmmXxTkmfMc2nlCGztlPrak+rMe8qOHZM4CBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKA/BAwA6I990iUBAgQIECAwqAJvvX5o5aGp8d50/bGmaZ6fmjMWMUUtyVv3195L8tJvO7CI+9QaAQIECBAgQIAAAQIECBAgQIAAAQIE5k2gJmXP2Rde2DbTry7Jv03SmbfiCg2qQJvkH9pafzmHh9996s6tBwcVQm4CBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAj0o4ABAP24a3omQIAAAQIElr7AVTePrJzZubydKv++NOWHkvrEPgh9T01edfAlj31LH/SqRQIECBAgQIAAAQIECBAgQIAAAQIECMybwPUXXzy0Ye+Bb69t/YWmlMtqrd15K67QoAn0avKFJG/pNL3fO/nWW+8bNAB5CRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg0O8CBgD0+w7qnwABAgQIEFhaAld9YGTF0VWrau0+qUn7g0l5WlKH+yTkF2rqLxx8yWXv6ZN+tUmAAAECBAgQIECAAAECBAgQIECAAIF5E7hr/fqx0eEV31tTX5rkETXpzFtxhQZDoGSmtPULNc2vD/W671p159Y9gxFcSgIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECCwtAQMAltZ+SkOAAAECBAj0q8DERDM+/JTVZSiX1rTfnzZPTcm6vopT8rH0Zl564MrHf6Sv+tYsAQIECBAgQIAAAQIECBAgQIAAAQIE5klgz7nnrmpr90dT6/OSbJqnssoMhkBNyeeT8taRTvvu8W3bdg5GbCkJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECCw9AQMAFh6eyoRAQIECBAg0G8CEzcOrx7df36vaX6oJt+X1AuTdPstRmr906bU5973ksfd0ne9a5gAAQIECBAgQIAAAQIECBAgQIAAAQLzJHDX+vNOGR7KM1PuHwKwdp7KKrO0BaZSc0ct9VcPt1PvOOf22/cu7bjSESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYGkLGACwtPdXOgIECBAgQGAxC0xc0x1bturUbp1+ZC3tM2vynaVkbDG3/I16KzW/1wyP/uS+5z9yX79m0DcBAgQIECBAgAABAgQIECBAgAABAgTmQ2Dvxoed09aZ2QEAP1qTNfNRU40lKzCZ5HNtm98upfv7a2/7hy8v2aSCESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYEAEDAAYkI0WkwABAgQIEFhcAidf9fGVM9O5sPbaf5fkaallS0qGF1eXx9ZNTX532eHJ/2fnxOUHj+1OVxMgQIAAAQIECBAgQIAAAQIECBAgQGCwBK7JE7rfsuFLF/WS55Xk39XkpMESkHaOBI6Ukhva1HeMNvW947fccu8crWsZAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEFhAAQMAFhBfaQIECBAgQGAABd56/dBJe6bP6HXrk1LL9yW5LMnJS0Oi/J81h488a8fE5bM/bciLAAECBAgQIECAAAECBAgQIECAAAECBL6BQN2wYXR3HbkspT4nZfZ7xlkBjMCDF6iHU8p1ta1vH5npfnDll76w+8Hf60oCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQWMwCBgAs5t3RGwECBAgQILC0BN70sWUrZvKYkuY/JnlCko1JHV4yIWvefuDI5DMzcfnMkskkCAECBAgQIECAAAECBAgQIECAAAECBE6gwM5Tzh9vlrffVUueXZNLSzJyAstZeokI1NTDSf661OY3OmXqmtU7duxbItHEIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIEkBgB4DAgQIECAAAECJ1rgh6/uLHvU2ad3S76r1Pof2uRxpWTsRJed7/Vryru6h4/81L6Jy33QcL7x1SNAgAABAgQIECBAgAABAgQIECBAoG8F9p39iNW9MvUDbanPKakPT9Lp2zAanw+Bw0n9i5L8enuw87G1u754YD6KqkGAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEC8ydgAMD8WatEgAABAgQIDKLAxI3DK1cc/uZa6w+mbX8wqRtSSneJUnyg9Opz9//sZduWaD6xCBAgQIAAAQIECBAgQIAAAQIECBAgcEIEDmzevHZyujy9KeVnauo5J6SIRfteoCaTTeqflKb51UNTh2846847j/R9KAEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBA4GsEDADwUBAgQIAAAQIETpTAxNXD46NnPTklz0/JRUnWnqhSi2Tda5umvOi+F116wyLpRxsECBAgQIAAAQIECBAgQIAAAQIECBDoG4GdZ52/vtNtf6qt+W9JTu2bxjU6XwLTSXlnm/rme8eGtl60devUfBVWhwABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTmV8AAgPn1Vo0AAQIECBAYFIGrbh4Zn9z57CQ/npTNSbpLPnrNZ0opL9v/kks/sOSzCkiAAAECBAgQIECAAAECBAgQIECAAIE5FqhJ2XPG5jNqt/xSkh9OyYo5LmG5fhWomWlLfq1t8yvrbr/5tpL0+jWKvgkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEDggQUMAHhgI1cQIECAAAECBI5JYPx1nzy/lpn/UpKfGKif0lTKl0vbvn7/kZW/lomL/OShY3pqXEyAAAECBAgQIECAAAECBAgQIECAAIFkdgjA7g1bHlNSXtim/tuSjHEZdIGyo9T6270y/Wun7thx96BryE+AAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFBEDAAYBB2WUYCBAgQIEBg3gTG//vHLkgtv5FaHpHUVfNWeFEUqr2kvGum03nZkRc+5o5F0ZImCBAgQIAAAQIECBAgQIAAAQIECBAg0GcCN1544fBpB2cenyYvK6nfVpPhPoug3bkSqLmh1vat3ab3ntU7duybq2WtQ4AAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQKLW8AAgMW9P7ojQIAAAQIE+khg5Wuve0ptyouT+vgk3T5qfe5aLflkm7zs0Isf+6G5W9RKBAgQIECAAAECBAgQIECAAAECBAgQGCyB2SEAp09OP6328ospeViSZrAEpE3Nh2ry5t7ksmtPu+ezh4gQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAwOAIGAAwOHstKQECBAgQIHACBVa87iOXl9K8LSnnJOmcwFKLeumacjglrz14yro35Mc2Ti7qZjVHgAABAgQIECBAgAABAgQIECBAgACBRSxQn/CE7q7tdz2jafKaWuspi7hVrc2tQK2p70nN6+5ZPnzjRVu3Ts3t8lYjQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgcUuYADAYt8h/REgQIAAAQKLXmDVG6/7920vE0nO81OYZrerXleTnz34ksv+etFvngYJECBAgAABAgQIECBAgAABAgQIECCwiAVqUvZuOP8lbdpXDfLw2UW8RXPaWkndW2v5nZrua9be9g9fntPFLUaAAAECBAgQIECAAAECBAgQIECAAAEC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QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEnrmABgDP3MqVBAgQIECAwCYQ2PUzv/ed1eP/0ZUbNkG6UiRAgAABAgQIENhsApVZuo6n+6EacksyvHfL9h0fePwHX3V8s1HIlwABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgMDlKKABwOW4K2IiQIAAAQIELpnA/l/87M7l40f/Raq+/5IFYWECBAgQIECAAAECF1ygxqRPJXkiyW+lxl87tuWq9+UdN56+4EtbgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBbyigAYCbgwABAgQIECDw1QLdtftffOJ1PZv9Tio74RAgQIAAAQIECBDY0AKVTvdKUsvp+lB/pQpKAAAgAElEQVSP/bPHf/yN79/QOUuOAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAwGUsoAHAZbw5QiNAgAABAgQujcCVP/2hXadr8mNJfuLSRGBVAgQIECBAgAABApdEYEx6NVUfrdnsZ47+2Jt//ZJEYVECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECm1hAA4BNvPlSJ0CAAAECBL6BwNLSsHPrn/8zNUx+Mcl3cSJAgAABAgQIECCwCQXWKuNvdte/W1zI+548+psPZ2lp3IQOUiZAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBwUQU0ALio3BYjQIAAAQIE1ovA/l+8Zeep41v+q6r6x0n2rZe4xUmAAAECBAgQIEDg/Ar06WT4eGr81eks7zt04Jov5r2fWM17bp6d33XMRoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIDAXEADAPcBAQIECBAgQOAbCGz7uY88f7pa/zRD/k46E1AECBAgQIAAAQIENrHA6XS+kKpf72H49enkxKcPH8nxLN20tolNpE6AAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEDgvAtoAHDeSU1IgAABAgQIbBiBd797svO+a76zevovk35ZUpoAbJjNlQgBAgQIECBAgMBzEHiokv8w1viecbrlD/Zuz5GHHv615Swtjc9hTkMJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEEiiAYDbgAABAgQIECDwJwjs+ecffN5ssvC3qsd3purFsAgQIECAAAECBAgQ+IrAwap8qDu/0UN9fDo59dDhI285mqXSCMBNQoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQOBZCmgA8CzhDCNAgAABAgQ2j8C2f/KR50+3DH8/3W9PsnvzZC5TAgQIECBAgAABAs9EoB6t9G2V+mD32vtr7DuO/PibDyfVz2S0awgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQ+EMBDQDcDQQIECBAgACBZyCw810fftXQk3/U6f8iyeIzGOISAgQIECBAgAABAptNYC3JbV31HydjPnZ6dXbn8u0PHsx7bp5tNgj5EiBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHi2AhoAPFs54wgQIECAAIHNJfC2d092v+G6v9Cdn+jOt1ayfXMByJYAAQIECBAgQIDAOQh07krl/T2O/2no3D1Od953/Ede89g5zOBSAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAptSQAOATbntkiZAgAABAgSejcDen79l7+rpLW8dhvxAUt+WZOuzmccYAgQIECBAgAABAptGoPrh6vpcV/1+9fA7vXb6S3u2Th44+M43ndo0BhIlQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgcA4CGgCcA5ZLCRAgQIAAAQK7/tnvXZHJ7K+mzjQBeHWSRSoECBAgQIAAAQIECPypAqdSdWd3f27o8cM95PezOr3z2E+84ck/daQLCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECGwiAQ0ANtFmS5UAAQIECBA4PwI7f+F392d58eaq/oF0vinJ9PzMbBYCBAgQIECAAAECG15gtZJHOrk7qVtT+VCtjZ87uuPwA3nHW09v+OwlSIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQOBPEdAAwC1CgAABAgQIEHgWAjv+6ccO1ML41yt5Z2p4Ubq9r3oWjoYQIECAAAECBAhsWoFO6mjSDyR9V6o+OKZ++8SWK+7IO27UCGDT3hYSJ0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQUKjmHiBAgAABAgQIPEuBXf/s967o6exvDqkf6eT6JN5bPUtLwwgQIECAAAECBDa1wFq6H0/VnZ3615PZ6nuO/Ph3HtrUIpInQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBDYtAKK1Dbt1kucAAECBAgQOB8Ce3/+lr3jyra/laH/2+58c5Lp+ZjXHAQIECBAgAABAgQ2jUD3wxmGj6f7I7NJ/9bJhcOfzzveenrT5C9RAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAl8loAGA24EAAQIECBAg8BwFnvdTt+6ZTVb+cnf++6Ren2TyHKc0nAABAgQIECBAgMBGF1hO+ovV9cEe+reHycLtw0o9eei2Lx3Pe26ebfTk5UeAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEDgGwloAODeIECAAAECBAicD4FfunX7rqOr353OD6fylnS8zzofruYgQIAAAQIECBDYWAKVo536aI31nyqzD/RscvexnU8ezzveupKkN1aysiFAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBw7gIK087dzAgCBAgQIECAwNcXWPrs4q6dh17f48I7Kv02TAQIECBAgAABAgQInBEYK3mgM/5Wd35j69qWDz+xmiP53JdO5z03zxgRIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIPCHAhoAuBsIECBAgAABAudTYKmH5P3bd2/f/j93xh8+n1ObiwABAgQIECBAgMC6E6jcmR7/99WV/Jvl3Vc9kqtfupabS9H/uttIARMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECFwsAQ0ALpa0dQgQIECAAIHNJbB0y3T39i0/2KkfTHLj5kpetgQIECBAgAABAptWoNLd/Znq+u2h6jeOnDz1O1m6aW3TekicAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAwDkKaABwjmAuJ0CAAAECBAg8Y4Glzy7u3XH0L691/b1K3pJk+ozHupAAAQIECBAgQIDAuhDoWTqrqbonqQ92+ndSR285/iN/4fGkel2kIEgCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECl5GABgCX0WYIhQABAgQIENiAAktLw65tf/7GDNN/ku6/mGRnEu/BNuBWS4kAAQIECBAgsIkE1pKcSnI0yW2p+v9mK9P3nVz9tUeztDRuIgepEiBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEDjvAorPzjupCQkQIECAAAECf1xg18/eemVmq/9NUt+f9LWpbOVEgAABAgQIECBAYJ0IdHefrqoTSY4ndXd6fF8m+dVjx0/flaWb5g0BHAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQInAcBDQDOA6IpCBAgQIAAAQLPRGDv0i17Zzu23JSuv5vku5LsTTI8k7GuIUCAAAECBAgQIHBRBao643gilaOdeqIqn+4xn6iuTw67t3/uyN979aGLGo/FCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECGwSAQ0ANslGS5MAAQIECBC4TAR+6daFHYdOvWKYLPyN9PjXknpJkoXLJDphECBAgAABAgQIbHKB7pys9CMZ6pEac2tX3T4bZp85efzIHVl669FNziN9AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAhdcQAOAC05sAQIECBAgQIDAHxfY888/+LyeLP6VMbO/XalvS2VvOt6buVkIECBAgAABAgQutkAnOZzk4UodHNN3TDL5cDLceuR/fN3dFzsY6xEgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBDY7AKKzDb7HSB/AgQIECBA4NIJvO3dkx2vveZVwzD9u528pVLflPSOSxeQlQkQIECAAAECBDaJwKlKHu/kkaQfrq5P9TD+/tqkbj31w298KFXzpgAOAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQugYAGAJcA3ZIECBAgQIAAga8W2PmuD181zKbf0jX+jSTfkcqLk0wpESBAgAABAgQIEDgvApVO53gqD1bnwaS+MCafTueL08nsS4d3bXkob3/d6nlZyyQECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECDwnAQ0AnhOfwQQIECBAgACB8yew52c+/JIxw3em+79M1euTXHX+ZjcTAQIECBAgQIDAJhMYkzxZyf1dua/Snxt7uH3Sdd9s28J9x6/+lqdyc802mYl0CRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECFz2AhoAXPZbJEACBAgQIEBgUwks3bp9+5aVlw/Temslb033G5KabCoDyRIgQIAAAQIECDxrgU7ur8qX0rmrqm+v1BdmYx5c3FYPPvWObz/6rCc2kAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBiyKgAcBFYbYIAQIECBAgQODcBHb+wu/ur+WFlyX1vcn4XUm9/NxmcDUBAgQIECBAgMBmEOj06Urdk+TOJF/s1EeH6oNDjY/sHOqxg+9806nN4CBHAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAhtFQAOAjbKT8iBAgAABAgQ2pMDen/3kC9f69Buq8zeTfnNS+zdkopIiQIAAAQIECBA4B4E+nOSuVP4gmXymk9syW300k3r8+D940xOpGs9hMpcSIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIHAZCWgAcBlthlAIECBAgAABAl9X4Oc+sm3XuPjC9Mp3JMP3pvtNSaa0CBAgQIAAAQIENpXAsSSfTvKxHvKRccy9iwt5qk4vHDr0o689mqreVBqSJUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQILBBBTQA2KAbKy0CBAgQIEBgowl05V2f3r597cTLJpP6nkq+pzvflsqejZapfAgQIECAAAECBM4IrCY5mPTtVfWpZLi1x+Gu3jZ56vhTdx3J0s0rnAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQ2HgCGgBsvD2VEQECBAgQILCRBZZ62Jff27mye7gu4+zPDWP+SievTzQC2MjbLjcCBAgQIEBg0wispvOFVG6roT6RyifX1tbu39JbTxx6Xk7m7a+bNwVwECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECCwgQU0ANjAmys1AgQIECBAYAMLLPWQ3LZ1167ZC3o2fnfSf7VS355k9wbOWmoECBAgQIAAgY0nUDmd5BOVfLyS30uGT9R08dDhPnU6Hz24kvfcPNt4ScuIAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFvJKABgHuDAAECBAgQILCeBborv3zbdO9Tq8+fVb6n03+9JvWmdHau57TEToAAAQIECBDY4AKPpvvWYVIfqc5HFk4s3/p4spb5ufSWWVK9wfOXHgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEC30BAAwC3BgECBAgQIEBgwwh05Yd+fXHPtbv/6jhMfjzVr0pqsmHSkwgBAgQIECBAYH0LPFqp303lP4yZ/ebxE296Iktpxf7re1NFT4AAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQOB8C2gAcL5FzUeAAAECBAgQuBwElj67uHvr8ZvHof+HJK+oZCHJvBmA93+Xw/6IgQABAgQIENioAp1k9vR5Oqk7k/7NJO/dXts/9eiPvObERk1cXgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQInB8BBWDnx9EsBAgQIECAAIHLUuDAu35jx7HeddNQ9T3V+UvpXJPqrUlNL8uABUWAAAECBAgQWH8Cq0lWkix38lB1PpYhnxink0+c2D7cmbe/7uT6S0nEBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAhcKgENAC6VvHUJECBAgAABAhdVoGvvv7j1z85mq9+d1Hcn+dbu7KzKtiTeE17UvbAYAQIECBAgsM4FZvNi/ySnkpxI+lPduW3oySdXq28/9aPffnCd5yd8AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQuoYBir0uIb2kCBAgQIECAwEUXWOph2/Sj1yxs6e/sntyU9JuTHEiyO8nCRY/HggQIECBAgACB9SEwL/g/nuRY0g91hlsr+fRsyO37Hhw/f/Dn3zRvBuAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIDAcxbQAOA5E5qAAAECBAgQILA+Ba786Q/tWh77tZlM3zykvrPTL69kf1dtS7f3ietzW0VNgAABAgQInB+BtaSPJ3U4nSNd+Wx13141fm6yuPWzhw6/9mCWajw/S5mFAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECfyigsMvdQIAAAQIECBDY7AJLt2zduXPbi2vW35Ya3twZv7WSG5LsTTJsdh75EyBAgAABAptFoNfS9WRXPVwZ70vqc1X1BzXWFxZ37vjC4z/4quObRUKeBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAhcOgENAC6dvZUJECBAgAABApedwN6lW/au7dj6Z9Pjm6uGb0nnZZ28pJJtl12wAiJAgAABAgQIPDeBTjIv6j9Y3Q916t6q4XNj5fbu+vyJk9/2WJZqfG5LGE2AAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFzE9AA4Ny8XE2AAAECBAgQ2DQC2376Yy+YDnltur+rq19RXS9MMj81A9g0d4FECRAgQIDARhPow0k9kvSjnTyUYfhCxtnnUrnj+KTuzjvfdGqjZSwfAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTWl4AGAOtrv0RLgAABAgQIELjoAlf+9Bd2nZoeeXGtrd2YTL6janx1Ui9Ocn2S4aIHZEECBAgQIECAwDMWqBNJP5KuB7vyYCWf7p7dNaQPrq4OD5xae+PDWarxGU/nQgIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECFxgAQ0ALjCw6QkQIECAAAECG0lg57s+fNWwOr5oNp28eNLD63vIG5J+ZTq7N1KeciFAgAABAgTWrUAneTLpu5P6YpLPdPqeSj001PDQkRMnH87STcvrNjuBEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECCw4QU0ANjwWyxBAgQIECBAgMAFEFhaGnYu/rkrMkz+TKpeXalvzZCXZ8zLU7niAqxoSgIECBAgQIDA1xMYkxzKmSL/4Z7u/lIqX+hx/NKkFw8eufrKh/J9L1Lw794hQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGDdCGgAsG62SqAECBAgQIAAgctSoPJzH9m693QdGIe6uofxlRnrDRnyynRemWTPZRm1oAgQIECAAIF1LNCnk9yVDF9MjV/MWJ9L5a709IlM6sljd+ZIfvl1q+s4QaETIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQILCJBTQA2MSbL3UCBAgQIECAwHkWqCzdum3brvGKLakrZ7N+TWX2+q68Jl2vSXrHeV7PdAQIECBAgMDmEbgn6Tu6hi9U+vOVfLrH2eFxbfnwidXJkSzdtLx5KGRKgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgMBGFtAAYCPvrtwIECBAgAABApdSYOnW7dv3ZM+wsrq3enxZD3VTpb47ySuSDJcyNGsTIECAAAECl73AsSSf6/RtVX3brCafng7jkdmp4diJK6fH8vbXnbzsMxAgAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEnoWABgDPAs0QAgQIECBAgACBcxT4pVsXdh3LnhpW9mZteFn3+JaqekunXpP04jnO5nICBAgQIEBg4wkcS+pz3f3JynhrjflsTadPzFZPHz++dXo873zTqY2XsowIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECDwxwU0AHBXECBAgAABAgQIXFyBpVum+/Zt2758am3n4nT68tnYr0/n25K8NskNFzcYqxEgQIAAAQIXX6DGpJ9K6tOd8TPV+cxsMnyqxuHBhYWF5cNHDi/nJ99yOlV98WOzIgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBC6tgAYAl9bf6gQIECBAgACBzS3w7ndP8si3TPc99cUtq4u7rs5k4TtS+fbu8Y2purGSrZsbSPYECBAgQGCjCNQTVflUdz5V3Z8ah/H2rWPf98SpQ7Pk1Fry+bUsLY0bJVt5ECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBA4NkKaADwbOWMI0CAAAECBAgQOP8CS0tDXvGKuvKea7efri2vTtbe2um3VurPJNly/hc0IwECBAgQIHBBBCqn0/3JTt8yVD4ynFj58OHkePKWMT+ZTp35kVRfkLVNSoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgXUsoAHAOt48oRMgQIAAAQIENoPADUu3bH18x+6XDb3y+nRe39VvSOqllSykMiQZ5mWEm8FCjgQIECBA4LIRqPSZ/yXj/OzUo9Xjp6uG27ryybVh+OSpY9/2YJZq/nkHAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECDxDAYVSzxDKZQQIECBAgAABApeHwN6f//29a7PVVw/j7LVj8tpKvjWpazq9WOktSU0uj0hFQYAAAQIENpDA2YL/te6sVtVK0o+n6vbuvr3G3D7N2u2HltceytJNaxsoa6kQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEDgogtoAHDRyS1IgAABAgQIECBwPgX2L92yc2Xbljd0hjel+js7uTHJ9iTbkmxNsnA+1zMXAQIECBDYJAJjUqeSXk4yP48m9fn0eNs4nX586OH2Y//gdU9sEgtpEiBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBA4KIJaABw0agtRIAAAQIECBAgcMEF3vbuyfbXXXtgkuH1PQzfWj1+S1I3JNl5pilAZXv6THOA4YLHYgECBAgQILBeBCqzdC0nfbLTpyp1Ml2PdfpTldmnK8Nndu5d/OxDb3/dyfWSkjgJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECCwXgU0AFivOyduAgQIECBAgACBP11g6Zatu3dveUHGujGz8cYMw43d9cpkvKpSuzrZlbPn9E+fzBUECBAgQGDDCKwkOZ7KsXQfT+qxpO9M1Z1J3d2ztbuOL6/enaWbljdMxhIhQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIDAOhHQAGCdbJQwCRAgQIAAAQIEzoPA29492fbGF1w9XZu8OMP44pr1S3qoV6bz/KT3JsOeTu+pZNt5WM0UBAgQIEDgMhCoMekTSR1JciTVR2rM/RnyhXTf05ncs9Z9z6m7p4/ml1+3ehkELAQCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIO/JXhUAACAASURBVECAAAECBAgQIECAAAECBAhsagENADb19kueAAECBAgQIEBg19ItV862b71+6NxQQ26ozo1JXppkX6evSGpfkp1JvHd2uxAgQIDAehBYS/ehVJ5K1/zxsaS+2D370jBM75vNZvcvZvH+Qz/2unlDAAcBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIXGYCipgusw0RDgECBAgQIECAwCUVqP2/eMuOU8e3XjeZ1AvGMddVjzeMlZdUDy9I9TVJrtYQ4JLukcUJECBA4KsFOiupeiwZH0nqkU7fV2N9aZjk4Nh5cHUYDy4vXvVI3nHjaXAECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgcPkLaABw+e+RCAkQIECAAAECBC6lwNIt0x3bc+Wkt92QITd054ZKX9/d16XqQJJrUtmfzpZLGaa1CRAgQGBTCKyk8nh3HqnuecH/Q1X9cNfk/nFcvX+YDQ/s2Zr7Dr7zTac2hYYkCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgsAEFNADYgJsqJQIECBAgQIAAgQsosNTD7t0f3TvO+toeFg5MxvGa7r6+Os/v1FWp8UAyXJX0VUmedwEjMTUBAgQIbFyBTupkOo+mxkeTnDm76oGh6v7ZLI+kx0eG6eLDx67/0qHcfPNs41LIjAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAptLQAOAzbXfsiVAgAABAgQIELgQAj/03i07rt63d9gyPi9r2Zch+5JclaqXJbm6u65J+ppK5o/PS2pyIcIwJwECBAisW4ETqTyc1EPV/XAnD3Xl3krdl66nelpPjTU8dfLIsUNZuml53WYpcAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBD4UwU0APhTiVxAgAABAgQIECBA4FkIvPvdk90HX7CnTs/2rmayZ5jWnnQOVOpFlb6+O8+vyvM7eX6SK5NMn8UqhhAgQIDAOhOoyvHuPNypg1U5mB4fTOruIeP93XW4p5PD43IfOXHtgSP5vhcp9l9n+ytcAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIPFcBDQCeq6DxBAgQIECAAAECBJ6pwNIt0+dtXduxXNNd08munZXTu7I2XJlpvah7vKHG4boe+vpKruvOdc90WtcRIECAwOUp0MnJ6swL/e/vse+vqvszDF8cqw72Wh+Z9sqxcWHb0WOLe47lHTeevjyzEBUBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIXEwBDQAupra1CBAgQIAAAQIECHytwNvePTnw+pdvPZHjO6Zrw/a1mu0Ypovbu8dre5y9qobhhdW5odMv7gzXVnobRAIECBC4LAVW0nVv1XjvmL57SN2xNtadGfLopKcn1jI7sXBqPHl03+ETecdfWkmqL8ssBEWAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECl1RAA4BLym9xAgQIECBAgAABAt9AYOmW6fO27tqxMhzbtjDbunVtyLaa9vNqzA3dw/WVvr67r0/Vdam6Pp3dSQ88CRAgQOBCC9SJdD/YyX2VecF/35+q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auELGLmI+79l984kX9z/01q+2Fc+2fr6cmVi27D129bniG337n7MbGaaA3wjN34NESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBlSVgAcDKmpdqCRAYJYE3fmb1xr33n5D5+dP6weDUlpzWV//olnZKWja2ZKqS9Ummkjjsf0Czrwdba5/rq32+pf9cks9kvv9MrZq4b3J+budw1WDn9vWrduSyc77ht/weUAoXESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQWScACgEWCFZYAAQJ/R6Bl5rb1G9bufHy1+ccng8cleWzSTk6yNi1rv/5r1f5f9x/29+fzgT1Cd1fVbV3LbdW6D8/3/ccmhsMH5weTuyaGbfeONcNd2f7HezMz0x9YOFcRIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA6fgAOmh89eZgIERlxg49VbH9nX3Jlp7XFp/eNS3WOTOj7Jmr/8WZ1kYsQZFrK9+1P5dFo+mXSfSPWfTCY+NVzVtk/u2b1n23En7c6/O3VvWquFTCoWAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGCpBCwAWCppeQgQGGmBE2a2rtu2Yd8jB8PBEyr9E1N5Qlo9OdXWJW0iqcm//LUbaYiFaq6yL2lfTFcfa8nH07qPDbvhbV2/967Vw8m9905289m+dy4zFw+TOPC/UO7iECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAodVwAKAw8ovOQECK1bgjdetnprf8Kg2XHVh+uFFae38pE5KMplk/yH/v/pZsS0ubeGtT+rjLbmhqrb2lf89O9jx+XxpOJ+9x/R59uf7XHJJn9Yc9l/awchGgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQILKGABQBLiC0VAQIrTKCq5ZWvbHnc49rR9xy9ds+e1U/MfPYf9n9aWntqqo5fYR0d3nJbKtUqrWr//0rlE9VlS+trSz/f3Tz78vPvPrwFyk6AAAECBAgQIECAAAECBAgQIEBgNATWXHPraW1u3zG779rxobzpufsSizVHY7K6IECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgHAQsABiHKeuRAIEDE5jZMpGHnzpx1Ne+Mrlrvp8aTEycl5bz0roL09dT0jJ1YIFc9XWBlmGq5tPaXCp70tonU7k1Xbuh9u29cedLn35vmg8ee1oIECBAgAABAgQIECBAgAABAgQILLTA9KtvOiMT7cqkNlVrP7sz696X2SfuzkzrFzqXeAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECCwsAIWACysp2gECKwkgZktE0cfffSa3dvuXzu/arBuctidldZflOouTMs5SdaspHaWQa3DJHuS7EoyW619vtXwllR36zDDrbt2X/RVHzBeBlNSAgECBAgQIECAAAECBAgQIECAwOgLXHLtYPqpJ/3bpG1OMkjy9uGwf+uuvas/lp88e7fFnKP/COiQAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIGVK2ABwMqdncoJEHioAjNbJjatmV6/Z9W+qcFc29C1dlqf/pyWdl6SpybtYUl1DzXs2F7fUqmvH/bfkcr26todrc+trYY3DrvJ989ece5Xx9ZG4wQIECBAgAABAgQIECBAgAABAgQOs8D06246o/Xdf6nU9ybpUvl0S97cWv+H2z67+kt56zlzh7lE6QkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEDgGwhYAOCxIEBgdAVmZrpNay6aTjZt3Dc53NTN9adUl7Na6pxKe3JLTkgyMboAi9LZ/m8HezBVD6blvpb60DB1a9fX+3bsvugzmWn9omQVlAABAgQIECBAgAABAgQIECBAgACBhyZwybWDqXNP+oFW7ZVJjv3Lm+eTXNenf/PaqpvvvfJpOx5aUFcTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAwGILWACw2MLiEyCwdALXXjvYcMdJG9ve4RFzq9ZsbMPh0V3qSa3qSdXak5I8Ksnk0hW08jNVsrv91YH/1INJ94lKPtDa8AMb7/zKh+54w6W7V36XOiBAgAABAgQIECBAgAABAgQIECAwmgLrr77xSV3aTyXtOX9zGWolX2rJT3Wte/e2y8/7wmh2rysCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAisTAELAFbm3FRNgMBfCczctmrt9K5jJ+f7E1PDU/tBd0Yqj2p/cdj/EUmOhvWQBCrJzlTuSsudSftUSz6RfvjZdINPb9848cVcds7cQ4roYgIECBAgQIAAAQIECBAgQIAAAQIEDovAkW+8ZcPcnvqRJP9PkmP+VhFVd6W1dw279nO7fvy8D6S1/e8NehEgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIDAYRawAOAwD0B6AgQeosDMlompVYNN1U0cN9G644apR7ZWT0rak1I5My1TDzGiy5P5VN3TWrurWr6StE9Wamv6fHTnZH0xL75wNyQCBAgQIECAAAECBAgQIECAAAECBFamwNQ1t35rS706ybmp+nt/L1Rpf1aV12Y+H5l9+fl3r8wuVU2AAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIHREbAAYHRmqRMCoysws2XNmtVrjpsc5MTW2mmV/ompnJG0U1ur0yptfSr+PHtoT8BcS+6oSIdBqAAAIABJREFU1B2pfL512dqq+3Rl7xc2TEzecYdD/w9N09UECBAgQIAAAQIECBAgQIAAAQIElqnA1Bs/cHS3d+8rqvL9Saa/UZmt5YPV129nOHj7jped9+ll2oqyCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgMBYCDsyOxZg1SWAFCvzodaunTzr61HTDM1LtzEr/uJY6JWknJ3V80lavwK4Od8nzSW5P8vEkH219fay6dvtktdvv3737q5m5eP+/9yJAgAABAgQIECBAgAABAgQIECBAYMQEpjff/F1p9eqknfkPtFZJvpLKu/uqn5m96sKPjhiBdggQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQILBiBCwAWDGjUiiB0RdYt/mGEwY18Yg2kdPS16Mr7YlJ/8i07uRUbRh9gUXp8L6W9oWkPpdWn+779qGq+szsYP3nc/lZs4uSUVACBAgQIECAAAECBAgQIECAAAECBJaVwJpr3nPaZFZfnarvSrLqHyquVXal5XfmB/X6XT9+4QeXVROKIUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAwJgIWAAwJoPWJoHlKnDE6z7w8OFw11nVBk9sqXOSdmzSjknVMWmZWq51L++6am9a98lWdXP6urlPfbFNTnx1Ym773Q9c9W3bk+z/Ni8vAgQIECBAgAABAgQIECBAgAABAgTGReCN162e3nPki5J6UZJjvknbO1rlj7rWv+bBKy760LgQ6ZMAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQLLRcACgOUyCXUQGBeBmWtXHbHu1McNMzynJWcneVQlJyQ5LsmR48Kw8H3WMMntad17UnVTkk/MV7t99xETd+eyc+YWPp+IBAgQIECAAAECBAgQIECAAAECBAisJIGpq2/6lpb2xiRP/KZ1V3a25B1d6zdbAvBNtVxAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBBRWwAGBBOQUjQOAbCWx8zfWb+jZ4bHXtrFZ5Slqe0NJOqOqPTmtrqB20wFxSX2qtvb+qva9a+8D8cPDZPcc+7Gv5/tP2HHRUNxIgQIAAAQIECBAgQIAAAQIECBAgMHIC06++9WGZqNdX6pKWrD2ABrel6vcHbeL1D15x7ocO4HqXECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgMACCFgAsACIQhAg8A0EZrasWbd69WMHXZ6d1p6R1OlJ21jJhr/8cKk/fw7ywWnJrlRuTpffb/Ptxn2ruq+tney33X/cebO5tA0PMqzbCBAgQIAAAQIECBAgQIAAAQIECBAYZYGZ6tavu/VHu+SqpI47gFYryc6qeke6evXOyy+67QDucQkBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIHKKAA7iHCOh2AgT+hsDM1nVT6+fObX3OS6vzkzwhaUcmmUoyyergBSptV5e6OVU3DVtu6ify0ante7fd85PPnE1r+z+I60WAAAECBAgQIECAAAECBAgQIECAAIF/VGDqZ265uA3z80k95iFQPdAqv5m+3rD9pRd+9iHc51ICBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQOAgBCwAOAs0tBAj8DYGqtvHqG8+uDP5Jtfb8pE5Ly+pUVqe1iVT5c+bQHpjb09q1w9b99mDf9s+vmzx6z92z9+/NzMXzhxbW3QQIECBAgAABAgQIECBAgAABAgQIjJ3ANR9eP93PXpfWnp7kQN+7raTdlxq+dscRq38+l52za+zcNEyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIElFDjQD3ctYUlSESCw3AU2vfZPNvbd9HlV9Yzq2tOr6pyWNpHU5EP40Ohyb/Nw1ndfqr+x0v3RfE1et2fdxrtz/9vmMjPTH86i5CZAgAABAgQIECBAgAABAgQIECBAYOULbLjm5ldV5UeSbDzgblqrVvXBavWqHYO8My++cPcB3+tCAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHhIAhYAPCQuFxMYY4GZ21ZNr3ng3HQT/zSpFyTdyUl1YyyysK23Vqm6qyr/q6r75dlNg4/nsnPmFjaJaAQIECBAgAABAgQIECBAgAABAgQIjLvAxqtvuqRPfjZpJxyExZauuiu2XXne1oO41y0ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgcAACFgAcAJJLCIydwMz+g/0fm9i05q61893aJ7Y28c8q+e6kTkllMHYei9NwJdl/wH93qj6c5Neqqz/YeflFX1ucdKISIECAAAECBAgQIECAAAECBAgQIEAgmdr8/se2tu/3kpx+UB5Vb53r22v2XHX+7dm/2NSLAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBBZUwAKABeUUjMAKFqhqedNnV03tvGtDm5h8dFV9a2t5ZtI9JakjVnBny630+SSzSX0prXtnG/bvzp68b/vMhfcvt0LVQ4AAAQIECBAgQIAAAQIECBAgQIDA6AlMv27rUa3mrqtqZyf7l8E+5Nfdrbqf77v5n7fQ9CHbuYEAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQLfVMACgG9K5AICIy7wlq2T0zuyseb3HNu6wVOTfE9ST0/aphHvfKnb213JPUl9ctB1b+/m5975wFVP/9JSFyEfAQIECBAgQIAAAQIECBAgQIAAAQIEpq+5+e2pfGeSyYPTaHd0Gf6Hbbv2/VlmLt6/9NSLAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBBZIwAKABYIUhsCKEnjL1smp+7oj2mDXkekGj07V85P27CSPXFF9LPdiWyqVB1K5Ny039TX4H7Of696bt54zt9xLVx8BAgQIECBAgAABAgQIECBAgAABAqMrMH31rZuT+uGk1h9sly15WyZqZvv2P/58Zmb6g43jPgIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBD42wIWAHgiCIyLwMxMN73qaZsyWHNUJiZPz3z/zHTt7FSelNQR48KwRH3Op7V7WurO9PV7fd+uP279Azd/9oXP27tE+aUhQIAAAQIECBAgQIAAAQIECBAgQIDAPyiw4epbX1Spn0xq40EztXytVb16bVv/i3dfftbsQcdxIwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAj8LQELADwQBEZc4Mg33rJhfk+O7Wv+pK4bPKMqZ7fkrEpOGfHWD0d7e5K6u9J9qvX1rtbnxu0vPf9/p7U6HMXISYAAAQIECBAgQIAAAQIECBAgQIAAgW8kMH3NLd+fqp9JsukQhW7puvYj23ae98HMtP4QY7mdAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBJJYAOAxIDCKAtdeO1j3hROO7Vp3emuDc6vvn9JaPT5pj0kyOYotH+ae5pL6Ulp3U6re2/fd+2Y3DT6ey86ZO8x1SU+AAAECBAgQIECAAAECBAgQIECAAIG/JzC1+cYXtNb9QpKHHRJPpU9r/31dW/vjd19+1uwhxXIzAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECHxdwAIADwKBERI4avMN07u7idNa6oz0uShdLkrlsS1ZN0JtLp9WWranzxfS1UdS9Wfzg8l3777li3fmty8dLp8iVUKAAAECBAgQIECAAAECBAgQIECAAIG/LTD92pu/M11+OclRC2Bzd+sG37n9x5+6Na3VAsQTggABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAmMtYAHAWI9f8yMhMFPd9NT7j0zmz8gw56Xl6Wl1ZqpOTtrqkehx2TXRtiX1iVRuSvKeQZ+PPHjk5Fdy2Tlzy65UBREgQIAAAQIECBAgQIAAAQIECBAgQODvCExfc8t3p/KLSS3EAoCk6jU7TrvgJ3JpsxzV00aAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFDFLAA4BAB3U7gsAlUtanXXH9UVk0+vatcXMmTUnlUkmOSdIetrtFOvDuVD1ZyXfr5G/uufXrXaRfd7UOtoz103REgQIAAAQIECBAgQIAAAQIECBAYNYEN19zyr6vqvyY5coF6++RwbvJbd738nLsWKJ4wBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQGFsBCwDGdvQaX7ECVW3j6/73qcNW39b1/TMreWJVHtlaW7Nie1r+hc8l7ROt73+3uvbHg117PvbgzMUPLv+yVUiAAAECBAgQIECAAAECBAgQIECAAIG/LzB1za2XtarXJnXEAvlUJT+884oLfn6B4glDgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBsRWwAGBsR6/xlSZw7DUfXj9bs+e0yrmttW9N8rhKTkrSrbReVlC9fUs+WGl/3lX3R/1g9sM7XnLxvSuofqUSIECAAAECBAgQIECAAAECBAgQIEDg7wlMXX3Tf25pL0kyvVA8LXn39l17npOZi+cXKqY4BAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQGEcBCwDGcep6XlECa19104kTg5xbE90zWt8/K60dk+RoB/8Xe4z1sUr3p+m736kun5499Yv35NJLh4udVXwCBAgQIECAAAECBAgQIECAAAECBAgstsD05pt/OS3fl2TNAubaUV07f+dLzv/4AsYUigABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAmMnYAHA2I1cwytFYO2r3n3ixOp1z2uVSyt5ZJKHJdmwUupfqXVWsqe1/Hpf/X/LqsFdsw/uvs83Vq3UaaqbAAECBAgQIECAAAECBAgQIECAAIG/J/BDWyenHzV3fZJzkyzo3xP1lX89e+UFb6NOgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgcvsKAf7Dr4MtxJgMDXBWb+YN2GtZueWG3wrUl7TpJHJ7X/4P8EoUUXqNby7kquHe6be8eulz/9q0mrRc8qAQECBAgQIECAAAECBAgQIECAAAECBJZQYO3mm86daN1vJvWIhU5blf+288oLfnih44pHgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBcRKwAGCcpq3X5Stw7bWDDZ878SnVdZe1lmdV8rCk1iVtsHyLHqnK7m0tP9fN51cfPO64r+b7T9szUt1phgABAgQIECBAgAABAgQIECBAgAABAn8psOGam36sqnt5UkctAsrtO6644NRFiCskAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIExkbAAoCxGbVGl6PACW/Zum7Htj1nV7rvbdWem5bT0jKRit+bSzGwyrbW6o8zMfHLExP9Tfe/8LwdSaulSC0HAQIECBAgQIAAAQIECBAgQIAAAQIEllrgqM2fnN7bPfjmVL0gydqFz9/u33HF+Q9b+LgiEiBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYHwEHDIen1nrdDkJzMx0GwYXPzKrV72oUt+X1jY69L/kA/pcWr95Yrjr2geu+rZtS55dQgIECBAgQIAAAQIECBAgQIAAAQIECCyxwIbNt5xfrX4pyeMWJ3Xt3XHFhWsWJ7aoBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQGA8BCwDGY866XA4CVS2v++N1U8NNZ2cwvKSrPL+S05ZDaWNVQ2VnWr27WvvZnasfuDkvfN7esepfswQIECBAgAABAgQIECBAgAABAgQIjKfAGz+zesOee19RyX9KcuQiIezLrj0n7pi5+N5Fii8sAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIERl7AAoCRH7EGl4PA0TNbpnavX3Vqqv1Iq/av0jK1HOoasxr6JPdW6jfnu3rDnpdcdPuY9a9dAgQIECBAgAABAgQIECBAgAABAgTGWGD66huenhq8KS1nLSLDvsna88j7r7z4jkXMITQBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgRGWsACgJEer+YOq8DMTHfkkc+Z2jVbR062uixd/u+kHXFYaxrH5C2Vyt4kn2nVfmF7t/ZXc/lZs+NIoWcCBAgQIECAAAECBAgQIECAAAECBMZT4KjNN0zva91rqrV/m1rUBbU7Nk7UsXe8+MLd4ymtawIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBy6gAUAh24oAoG/J3DkG2/ZsG9nTsqg/97W2ncmeSqmwyLQJ+3+pG5qqZ/fPpH3xAdPD8sgJCVAgAABAgQIECBAgAABAgQIECBA4DAJzGxZs2Hd6u+ptP+c5IxFruKWHVdccMEi5xCeAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECIy1gAcBIj1dzSy4ws2XN9PS6U1r1z0+f51XyjCSrlrwOCZOWSuWeJP/vIIPffPCKcz+EhQABAgQIECBAgAABAgQIECBAgAABAuMmsGHzLedXq5dV8uyWrF3M/iv5jZ1XXPCvFjOH2AQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEBh1AQsARn3C+lsagZktExvXrXp4tVxQ6S5N5VuTrF+a5LJ8Y4F6sLX2a/3quVftfOEz9i8C8CJAgAABAgQIECBAgAABAgQIECBAgMBYCUxdc+MxrdrlSfvBJBsXu/nW8srtl18ws9h5xCdAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgMAoC1gAMMrT1dviC8xsmVi7YfWxk/vqSdW6702rf5LWjkrF763F1//HMtyZ1Dtqfv4VO1/m8P/hHYXsBAgQIECAAAECBAgQIECAAAECBAgcDoENr7/pyMx1/6Jafiyp0xe7hpY2m374z7dfddEfLnYu8QkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIDDKAg4pj/J09baoApteu3XjXPae1Qbd81J5bqoendbWLGpSwQ9E4M609qtz83O/uOelT//8gdzgGgIECBAgQIAAAQIECBAgQIAAAQIECIySwJEz123Yt/7I57WqFyc5O0m3+P3VzbVm/rt3vtBS1sW3loEAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgVEWsABglKert8URuPbawcbbH35Kn/57UvnOJE9McuTiJBP1oQi0ZLZSr5prg9/ac/l5X3go97qWAAECBAgQIECAAAECBAgQIECAAAECIyEwc9uqDWu2X1xdu6qS81qydkn6au1lOy4//zVLkksSAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIjLCABQAjPFytLbzAUZtvmN6byWdV61/QUhcn7YSFzyLiQQm07Exfb2qTed32F194/0HFcBMBAgQIECBAgAABAgQIECBAgAABAgRWssDMbaum182el+pfmpZnJVm1JO1UdtagnbfzJed/fEnySUKAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIERFrAAYISHq7UFFJjZMnHEmokzh133L1Pdc9Py2CQTC5hBqEMQqGRfl1zdt/5NOy+/6GuHEMqtBAgQIECAAAECBAgQIECAAAECBAgQWJkCb9k6Ob1t7txW9RPV2sVLdvj/L7T+x45d0/8hM4/ftzLxVE2AAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIHlI2ABwPKZhUqWqcCRM7dsmF/X/5tq7QWpPDnJxmVa6viW1fKr8317xe4rz/tK0mp8IXROgAABAgQIECBAgAABAgQIECBAgMBYCrxl6+TUA3sv6LruJyrtGUmtWkKHr7Sqf7b9igvel+b92SV0l4oAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgREVsABgRAerrYURmHrdjc/ohoPvqVYvSHJiEr9nFoZ24aJUvXfY2ot2ve/LH85vXzpcuMAiESBAgAABAgQIECBAgAABAgQIECBAYAUIvPEzq6f23vvdXeUHKnlmksklq7q1uST/dUfWzuTys2aXLK9EBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQGGEBh5lHeLhaO3iBqWtuPKalfWfSLku1Rye18eCjuXPxBNrHWtpPb981+L3MnLNr8fKITIAAAQIECBAgQIAAAQIECBAgQIAAgWUo8ENbJ6ceNf/9LfWjSU5PsnqJq/zz6toP79z5zk9mZqZf4tzSESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYCQFLAAYybFq6lAEpjff8JjWBq+s5FuSHJ1kcCjx3Ls4AtWyt0u7KoP+17a/6IIH0lotTiZRCRAgQIAAAQIECBAgQIAAAQIECBAgsAwFrr12sOGLp/znSl2W5Kglfy+7ame19gM71zzwu3nh8/YuQyElESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYEUKWACwIsem6MUQ2Piaj2zqu9nvStd+IFVnJ1m7GHnEXACBlmElv9VVm9l++Xmfdfh/AUyFIECAAAECBAgQIECAAAECBAgQIEBgxQise/2t5wzm6weS+pdJppe68Er2pOoX+/n5V+96+TPuWur88hEgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGCUBSwAGOXp6u2ABda89vpTJruJn0jyT5NsWvJvSjrgSl24X6ClfahP92M7dz31+sy0ngoBAgQIECBAgAABAgQIECBAgAABAgTGRWBq8y0Xt9QvpOXUJKsOT9/t96vqqp1XnP9JC1oPzwRkJUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgdAUsABjd2ersAAWmr77pn7R0P1WtnpDK4ABvc9nhE+iT9vLVNf/me6982o7DV4bMBAgQIECAAAECBAgQIECAAAECBAgQWEKBmdtWTa+f/X9S/Uv/cpHtEib/G6laPl3JZTtn3/XezMxY0Hp4piArAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIjLGABwAgPV2v/iEBVO+rqG6f2doMfTOXFSU7ktQIEWiqV97aWK7dffsGtK6BiJRIgQIAAAQIECBAgQIAAAQIECBAgQOBQBFqurW76SzefnmFel9aenWT1oQQ86Hv/4v3ZB5J2+Y5du38jMxfvOehYbiRAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBf1DAAgAPx/gJzGyZWL9u1eMH6f59Vb0grR0/fggrtuOvJu1nuuG6X9r20ic+sGK7UDgBAgQIECBAgAABAgQIECBAgAABAgS+mcAl1w7WnnP08ZNt9Xcn+YFKOzPJ5De7bVH+fWvVqr7cd/VLwy6/tPvFF35lUfIISoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQKxAMBDMF4Cv/KFNVP33XNu64cvSctzUofpw5Ljpb5Q3VaqrutbvWL2ios+tFBBxSFAgAABAgQIECBAgAABAgQIECBAgMCyEpiZ6Y5a++z1+5Iz0038p0p9dyobDnOND1S1n8tw1Zt2vuwp9xzmWqQnQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIDASAtYADDS49Xc/xG49trB9Jcesanm5761G+SqqjyZzooTeKClXrn9fXf8XH770uGKq17BBAgQIECAAAECBAgQIECAAAECBAgQ+McEZqo7au2N6/esWntS27fvu9LyH5I8Kjmsy5wrqW0tedu+rq7Z85KLbjdEAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEFhcAQsAFtdX9OUg8ENbJ6cePX96+v4FLe37kpyxHMpSw0MWeF/X8rJtl1/wpw/5TjcQIECAAAECBAgQIECAAAECBAgQIEBgOQv8yhfWTH3tq6dlkG9J3/5ZS52bZONhLbmlUrkvaW+vqv+688oLPnFY65GcAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECYyJgAcCYDHps23z9TWunh4MnpeoH0vLcVB0/thYruvEattbenmqv2H7F+Z9Z0a0ongABAgQIECBAgAABAgQIECBAgAABAn8lMLNl4oipjSfOZ+/ZXeWfV3JRKicuC6DWHkyr3+27ev3siy/86LKoSREECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBDPeZstAAAgAElEQVQYAwELAMZgyOPa4tEzW6b2rFv9zKr2wrR2UUutG1eLEej7vpb+Z9e2nW+4+/LvmB2BfrRAgAABAgQIECBAgAABAgQIECBAgMA4C1S19de879i04eMHfb63Wl2ctMcsG5KqnS3tHcM22Dx7xbkfWjZ1KYQAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJjIGABwBgMeSxbnNkysWHtqu+rrvvhVM4bS4ORarpuS1+v2HHVRb83Um1phgABAgQIECBAgAABAgQIECBAgACB8ROY2TIxvX7VU9N3L0jL05I6K2mrlwtEpe1qrd7ZtfbqbS85//3LpS51ECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYFwELAAYl0mPUZ+bXrt143zbd3Fa9+qkHjtGrY9wq3V9a+3y7ZdfcOsIN6k1AgQIECBAgAABAgQIECBAgAABAgRGWWBmy8T69Wsf1/XDs9O6f5O0i5Jatcxa3pPkT5LhNTuueNr1y6w25RAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGAsBCwAGIsxj1GTM9euml57yo+m1b9N8oQx6nzUW/3zroaXb7vyaVtHvVH9ESBAgAABAgQIECBAgAABAgQIECAwYgIzM92G1d/+iH6Q72hpz2mtnVVVJy/DLudb8p5q3U/s+Mxga956ztwyrFFJBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQGHkBCwBGfsTj0+DUNTce0/o8v3XdK6uyHD88OT7DWOhOW/uzYde/ZNePX/jBhQ4tHgECBAgQIECAAAECBAgQIECAAAECBBZD4KjNN0zvG7Qz+mF3dmt5dqouTGvHJVmOfzczl5Y/6NK/edtLLtyS1moxTMQkQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgW8usBw/ZPbNq3YFgb8jsO6ntx4/MTn8F9X6H0rlMcv0A5TmdpAClfxptfbjs5ef/5GDDOE2AgQIECBAgAABAgQIECBAgAABAgQILInAxtdcv6kfrHp8y/y3JO2ZSffoSh2fZGJJCnjoSXak5XdqMLhm5/bZT2Xm4vmHHsIdBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQILBQAhYALJSkOIdP4M23TU3v3PGKpF2SVqcm6Q5fMTIvksCWLnnJtisu+MAixReWAAECBAgQIECAAAECBAgQIECAAAEChyRw7DUfXj9bs+d0XXdJXzm/VZ2U5GHL+OB/KtnTpa5uw+Gvbnvp0z9/SABuJkCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIEFEbAAYEEYBTlcAke87saHD/v2fZX2H1tychLP9OEaxuLm/UhSL99xxYXvWNw0ohMgQIAAAQIECBAgQIAAAQIECBAgQOChCUzPbDkqa9c9rbV6dp/+opb2yLRMpZb7+9X1uUr3trThm3deftHXHlrXriZAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBxRJwWHqxZMVdfIE33zY1vWvny1L1b9JyfCqDxU8qw2ES2J7Ua3ZcceFrD1N+aQkQIECAAAECBAgQIECAAAECBAgQIPC3BI584y0bhnvrOX2ff9VanlxVm9K6dUl1K4Dqztb3P14T+/50x0suvncF1KtEAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIjI2ABQBjM+oRa3TmtlXT63b8WJIXJjkhWe7fpDRi/kvfTiXt14eTE1ftetE5dy19ehkJECBAgAABAgQIECBAgAABAgQIECCwX6Da9Mz7H1br5i5paZck9fgkG5OsWjk+9alk8JLpjYM/u/Oyc3atnLpVSoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgfEQsABgPOY8Wl2+/qa1G/Z131tdrkrqcQ7/j9Z4/8Fuqm6qqpfuvOqi945Jx9okQIAAAQIECBAgQIAAAQIECBAgQGC5CGzZMrHh1nXPSuu/vU+e1Vp7VFJrkgyWS4kHUkdL3p2010/tmvjzO2cc/j8QM9cQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgqQUsAFhqcfkOWWDDa2/9jurqVUmd7fD/IXOupAB3pq83pR/89x0vO+++lVS4WgkQIECAAAECBAgQIECAAAECBAgQWJkCG66+5fSk//a07rlV9e1JurR0qay8v1+p+sPWtZ/avmHyA7nsnLmVORFVEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYPQFVt4H1EZ/Jjr8hwXahs03nFcZvDotF4MaP4Gq+uCgdVdtu+L8P0lS4yegYwIECBAgQIAAAQIECBAgQIAAAQIEFlVgproc//7B9La5c1vyryu5JC1HrsgD//uhWqoqu7vk17rJbH7wRRd8cVH9BCdAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBQxawAOCQCQVYEoGqtmnz+0+e7+Z+Imn/PqluSfJKsgwF2lvn+omf3nPV2V9OmiUAy3BCSiJAgAABAgQIECBAgAABAgQIECCwYgSqWl75scmjc8+qHavXHDXR5Tmta/9XVT25JWtWTB/fsNCaT9rtrdrrV2X+1++98mk7VnY/qidAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgMB4CFgAMB5zXvFdTr36vUe3wep/11r/o5WcvOIb0sBBC7Tki+nrdd3qtW978EVPfvCgA7mRAAECBAgQIECAAAECBAgQIECAAIHxFXjL1smN9++eGk50J7YanJvU09PytFSdmrSJFQ3TUqnsTPKe1ve/sHp643vu+eHH7///XgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECCwAgQsAFgBQxr7EmduWzW9fttz07efTmtnjr0HgCRta0t+cvtEvyUvvnA3EgIECBAgQIAAAQIECBAgQIAAAQIECHxTgR+9bvX0w9dOt7nVR2TQPzo1eH61fFvSHplU903vXxkXzCe5O2nvaNn7M9uv+JbPrIyyVUmAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECfyVgAYBnYXkLzMx066ef+4Ru2L8qLc9PxTO7vCe2dNW13JDk6unZe99958x37lq6xDIRIECAAAECBAgQIECAAAECBAgQILByBKptfM1Hjxh2s8cl/Zkt3QXp2jmpekKSTSunjwOqdF/SPlDJrwz3dX+0+xXnfvmA7nIRAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECCwrAYepl9U4FPN3BTa+5vpN/WDiPyb5z0lWEyLwtwRau7lV/1/Wth3X3335d8zSIUCAAAECBAgQIECAAAECBAgQIECAQF5/09p1c2s2tdrzsDYYHJ0aPq2lPTNVT01rU6Mn1Pqk7k3L+7tqP7tt1zv/NDMz/ej1qSMCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAiMh4AFAOMx55XZ5Vu2Tm7cPvctfV8/m9bOXJlNqHrxBermqv51O3fPXZeZi/csfj4ZCBAgQIAAAQIECBAgQIAAAQIECBBYdgIzW9YcsXrNccPWTqpWj++6nJnKGZWckeSkZVfvwhVUSftsVX69au73Z696+ocXLrRIBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIHA4BCwAOBzqcn5zgZmZbuP65z687/uXpuUHv/kNrhhngZa8r0/bXOlunL3i3K+Os4XeCRAgQIAAAQIECBAgQIAAAQIECIyFwLXXDqY/e+QRNbn2+EEbHF/D9piq4ZNb185K2mMrtW70Hdq9SX00VW/bsXvvb2Xm4p2j37MOCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgMPoCFgCM/oxXZodv2bpuetvcv0wyk+TEldmEqpdWoD6WtD/sM3iDJQBLKy8bAQIECBAgQIAAAQIECBAgQIAAgSURqGobX3vDEdUNTk/LGdXy+FQenbTTkuz/mV6SOpZDksqn09qvtFZbts/ueX9mLp5fDmWpgQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOXcACgEM3FGGhBS65drDxqSefVamrK+1ZCx1evNEVaMmOpH65T/6/nRtXvS+XnbNrdLvVGQECBAgQIECAAAECBAgQIECAAIExENj/fvFTjn/4cNXkw1vfPyJ9e1ylzkprp7fk+CSTY6Dw1y1W3ZWW93et/fq22cl3ZMZ7oGM1f80SIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIDAWAhYAjMWYV1iTb9m6bvrBfa9Iaz8yVt/YtMLGtFzLbWmzlfpQS95e892v7XjZefct11rVRYAAAQIECBAgQIAAAQIECBAgQIDANxCYqW7j6q2n9hPDJ7S+nlytnpi0E5KcmOToJKvH0a2lfSjV/9KwhtfPvv+u2/Lblw7H0UHPBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQGHUBCwBGfcIrr7+28eqtj+gz/ydJnbbyylfxMhGoJF9J8s6udb+5bcPg+lx2ztwyqU0ZBAgQIECAAAECBAgQIECAAAECBAj8XYGZLWvWr5l4TNe6p1Trntwqj0rqlLR2ikWxeSCV322trl1V/Y33Xvm0HR4gAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEBhdAQsARne2K7OzmS0T0+vWvDjJa5N4PlfmFJdT1bvz9W/Fqt/rW/+u2VO/8tFc6luxltOA1EKAAAECBAgQIECAAAECBAgQIDCeAkdtvmF6d3WnttZOb617VNI/NsnpSU5MclySNeMp89ddt8quSj6Q9L/b2uD3t+/a/YXMXDw/7i76J0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAwKgLOGA96hNeYf2te8PW4yfm5m6q5NQVVrpyl61ADZN2X1KfSF9va6va27e/+ML7l225CiNAgAABAgQIECBAgAABAgQIECAwigIzWyY2rZk4Yb4NntJa9+RKPblaTmqVDcn+n9qQ1lalLIb9y/HfU+n/Z1f1G92quU8+uO2Z2zPT+lF8NPREgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAn9bwAIAT8SyEpi+5tbLU/3mxIc8l9VgRqOY/d+M9bVqeW+St+yc/fJNmbl032i0pgsCBAgQIECAAAECBAgQIECAAAECy0ygqk296fqjul2Dc/vWPbV1eUoqp1Wyoe0/7J82lWRimVW9HMrZ3VLX9+neWnO5Yfb08+7NpW24HApTAwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgsjYAFAEvjLMsBCBz1SzdM77l3cFtrOeUALncJgYMV2JO0u1L9n3SD4Vu3TX/8I7nssrmDDeY+AgQIECBAgAABAgQIECBAgAABAgT+QuCozTdM7+4G57W0C7qq8yt1RtLWJdn/szbJJKt/SKD1SX2qkjcN9+17x+4Ns1/LC5+3lxcBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIjJ+ABQDjN/Nl2/H0a278dxl0v5zEc7lspzQihbVUqvYl7dNpua7ru/+1be19H/WB2hGZrzYIECBAgAABAgQIECBAgAABAgSWRGD9T99ybFbVE7pqT2qtnlyVpyQ5tpLVLVmVZGJJClnZSfokX07L/2x9/c723Xs/kpmL96zsllRPgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAoci4KD1oei5d0EFNmy+5R3V6vkLGlQwAv+4QCUZJrk3Vb8ynJ9/066XP/2rSdv/z70IECBAgAABAgQIECBAgAABAgQIEPibAjNb1hwxvfqxw75dnOSZqZyX1MakdUm6tHQpC14fwkOzN6nrBv3glQ9uGnw8P3T2fJr3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BBBAAAEEEEAAAQQQQAABBBBAAAEEEEBgEwjQAGATLDIpIoAAAggggAACCCCAAAIIIIAAAggggAACG14gwvrYwyPjK8tTtfroxED1SbnclpQOROSDdhyQ0gEpDii0R1J9w+dMAutJoBvSSSuOhvzlpNrDpeKvl977pmfWU5DEggACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAgggsPEFaACw8deQDBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgeESeOeR+vShlYnk0cl+I0+myJMq00yO8qCtayUdlH2tIvZL2jJcyZPNOhJYkuKU5JO2nwjpwSQ/NP+eO364jmIkFAQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgSEToAHAkC0o6SCAAAIIIIAAAggggAACCCCAAAIIIIAAAhtK4OPfb050T06nKKZVljOupenI3i3FNWFdJWmPwlfJUd3ftqFyI9iNKLBi6WRIxy09GhFHXJaPjdanHjvxntctbcSEiBkBBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQGBjCdAAYGOtF9EigAACCCCAAAIIIIAAAggggAACCCCAAAIbVCCsjz48MirNpp5mnTTrKLbY2heRD9qxO1QV/muX5F1yTCvEz7A36GpvrLCja/lkWE8p/FgoP2L57zRITyz2/vNZtVp5Y+VDtAgggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAhtZgDdPbuTVI3YEEEAAAQQQQAABBBBAAAEEEEAAAQQQQGC9CnziSH323OLOshjdGVk7Q7EnQnttXSVph+QdrvaOHREalyj2X69LOaRxheR5Sd+JyI846VFF8b0y+k8ur/RPqnXPYEjzJi0EEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAIF1LkADgHW+QISHAAIIIIAAAggggAACCCCAAAIIIIAAAgisa4EPf3F8pBzbmlJtWz15awzydhXeFvIuRewLaafsHY7YLWmLpPq6zofghljAWYozCv297O9J+W+j9BHV8uPtpT87pVYrD3HypIYAAggggAACCCCAAAIIIIAAAggggAACCCCA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EEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEDgOAmciEKH4wROXxFAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBB4LwECALgvEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEDgCAgQAHIFJoAsIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIEADAPYAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAII/P/t3DENAAAAwjD/rmdjRx2Qwg0BAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAwEHAAMChBBAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg4ADABggQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAwEDAAcCgBBEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIADABsgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIDAQcAgxJEIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECDgBsgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIDAQcAAxKEIEAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECDgAsAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIDAQcAAwKEEEAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECDgAMAGCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIDAQMABwKAEEQgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAgAMAGyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgMBBwCDEkQgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIOAIi3leIAAAIKSURBVGyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgMBBwADEoQgQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIOACwAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgMBBwADAoQQQCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIOAAwAYIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgMBAwAHAoAQRCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQICAAwAbIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECA4EAN2ERZLhCO+sAAAAASUVORK5CYII="/> + +// <image id="image1_19_150" width="2000" height="2000" xlink:href="data:image/png;base64,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"/> + +// <image id="image2_19_150" width="1000" height="1000" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA+gAAAPoCAYAAABNo9TkAAAgAElEQVR4nOzdebzt13w//tfNPJA0BIloKFUtiaHXmEEQgsSUIK2iP/MUQ79FzXJD0ZQOKhIN2m+FRg0ZTaWmGFu9voaYKYKEGoMEIe7vj3Wue+695+yz9zl777U+n8/z+XjsR87N2Xefd3LW+qz92mt91koAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOiPdbULAABg9davX79pqX+/ceNG7/MAOsaFGwCgo5YL54sJ6gDd4YINANBB44TzzYR0gG5wsQYA6KBJAvpmgjpA21ykAQA6aDUBfTNBHaBNLs4AAB20loC+maAO0BYXZQCADppGQN9MUAdoww61CwAAoK5phn0AVs+npQAAHTSrUG02HaAeF2AAgA6a9ay3oA4wfy68AAAdNK9l6YI6wPy4Bx0AgGW5Px1gfnwiCgDQQTWCs9l0gNlykQUA6KCaM9uCOsBsuLgCAHRQC0vPBXWA6XJRBQDooBYC+maCOsB02CQOAIA1aenDAoAu82knAEAHtRqKzaYDrJ4LKABAB7Ua0DcT1AEm58IJANBBrQf0zQR1gPG5YAIAdFBXAvpmgjrAymwSBwDAzHXtAwWAGnySCQDQQV0OvGbTAZZmBh0AgLnq8ocLALMkoAMAMHdCOsD2BHQAAKoQ0gG2JqADAABAAwR0AACqMYsOsIWADgAAAA0Q0AEAAKABAjoAAAA0QEAHAACABgjoAAAA0AABHQAAABogoAMAAEADBHQAAABogIAOAAAADRDQAQAAoAECOgAAADRAQAcAAIAGCOgAAADQAAEdAAAAGiCgAwAAQAMEdAAAAGiAgA4AAAANENABAACgAQI6AAAANEBABwAAgAYI6AAAANAAAR0AAAAaIKADAABAAwR0AAAAaICADgAAAA0Q0AEAAKABAjoAAAA0QEAHAACABgjoAAAA0AABHQAAABogoAMAAEADBHQAAABogIAOAAAADRDQAQAAoAECOgAAADRAQAcAAIAGCOgAAADQAAEdAAAAGiCgAwAAQAMEdAAAAGiAgA4AAAANENABAACgAQI6AAAANEBABwAAgAYI6AAAANAAAR0AAAAaIKADAABAAwR0AAAAaICADgAAAA0Q0AEAAKABAjoAAAA0QEAHAACABgjoAAAA0AABHQAAABogoAMAAEADBHQAAABogIAOAAAADRDQAQAAoAECOgAAADRAQAcAAIAGCOgAAADQAAEdAAAAGiCgAwAAQAMEdAAAAGiAgA4AAAANENABAACgAQI6AAAANEBABwAAgAbsVLsAaNH69es3jfr+xo0b182rFmjRhnev266PbDhyk34BALAG3kzBIisF820J6gzJUqF8yecJ6jAXk45ZLTOe9puJDxifzgBZ25scgwpDMG443+rvCOoMzLxDiIBO60x8wOR0AgZtmm9uDCr00WqC+XavIajTc7VCiIBOq0x8wOrpAAzWrN7YGFjog2kE8+1eU1CnZ2qHEAGd1pj4gLXT8Bmceb2hMbDQVbMI5795bSGdHmglhAjotMTEB0yHBs9g1HgjY1ChS2YZzLf7WYI6HdVSCBHQaYGJD5guDZ3ea+ENjEGFls0zmG/3swV1OqLFENLC+DYtxsnuMfEBs6GR02utvXkxsNCSmsF8MSGdlrUcQlob49bC+NgdLbQ77YU+07jppRYGj1EMLNTWSjhfTFCnNbXHkpXGitr1TZNxsRtaa3PaDX2kUdMrrQ0coxhUqKHFYL4tQZ3aWhtLlhsvWqtzLYyJbWu5rWk79I0GTW+0PHiMYmBhHroQzLclqDNvrY8ji8eL1mudlLGwTV1qZ9oQfaEh03ldGjxGMbAwC10M5osJ6cxDX8aRLjMGtqXLfUJbous0YDqry4PHKAYWpqXr4XwxQZ1Z6etY0jXGvnb0pU9oU3SVhkvn9GXgGMWgwlr0KZhvS1BnWoYwlnSJca++PvYJ7You0mjplD4OHqMYWJhEn4P5tgR1Vmto40hXGO/qGUKf0L7oEo2VThjC4DGKgYWVDCmcbyakM4mhjyOtM87VMbR+oZ3RBRopTRvawDGKQYWlDDGYb0tQZyXGkvYZ4+ZryH1CW6N1GihNGvLAsRIDC4lgvhRBnW0ZS7rD2DYf+sQW2hyt0jBpjsFjPAaWYRLMRxPSSYwjXWRMmy19YnnaHq3RIGmGwWN1DCzDIZyPT1AfLmNJNxnLZkefGI82SCs0RKozcKydQaXfBPPVE9SHw1jSbcax6dMnJqcd0gKNkGoMHNNnYOkXwXx6BPX+Mpb0g/FrevSJtdMeqUnjowqDx2wZWLpNMJ8NIb1fjCP9YtxaO31i+rRLatDomCuDx3wZWLpHOJ89Qb37jCX9Y7xaG31itrRP5kljYy4MHPUYVLpBMJ8/Qb17jCX9ZaxaHX1ifrRR5kVDY6YMHO0wsLRJMK9PUG+fsaT/jFGT0Sfq0VaZNQ2MmTF4tMnA0gbBvC1CepuMI8NhbBqfftEGbZZZ0bCYOgNHNxhY6hHO2yWot8NYMizGpJXpE+3RbpkFjYqpMXB0j4FlvgTz7hDU6zGWDJPxaHn6RPu0X6ZJY2IqDB7dZmCZLcG8uwT1+TGODJtxaHv6RPdox0yDRsSaGDz6xcAyfcJ59wnps2UcITH+bEu/6DbtmbXQeFgVA0d/GVSmQzDvH0F9+owlbGbsKfSJ/tCmWS0Nh4kYOIbDwLI6gnn/CeprZyxhW0Mfc/SJ/hp622ZyGgxjM3gMk4FlPIL5sAjpq2McYTlDHWv0ieEYahtnchoKKzJ4kBhYRhHOh0tQH5+xhFGGOMboE8MzxHbO5DQSlmXgYFsGlq0J5mwmqC/PWMI4hjS+6BMMqb0zOY2D7Rg4WMnQBxbBnOUI6lsYS5jEEMYVfYJtDaHdMzmNgq0YPJjE0AYWwZxxDD2kG0dYjT6PJ/oEK+lz+2dyGgNJDB6szRAGFuGcSQ0xqBtLWK2+jiP6BOPqax9gchoCBg+moq8Di2DOWg0hqBtHWKu+jSH6BKvVt77A5HaoXQB1GUBgecI509DndrR+/fpNxhHYmj7BWmg/COjAVBhQYFj0ediefsE0aEfDJqAPmM4Py+vzrCfz17f2ZPwAmC3X2eES0IGpMZgAMFTGQGAaBHSAbfRtthOmSQgBgNkR0AEAAKABAjoAAAA0QEAHAACABgjoAAAA0AABHQAAABogoAMAAEADBHQAAABogIAOAAAADRDQAQAAoAECOgAAADRAQAcAAIAGCOgAAADQgJ1qFwAt27hx47rFf16/fv2mWrUAAAD9JqDDErYN5tv+e0EdgFE2bty4zlgBWyz13kofge0J6LDIcsF8uecZWABYbPE4YqyA0e+tfJAF2xPQIeMH86X+noEFgMTqK1jMpAesjoDOoK02mC/1GgYWgGGaJIgYKxiC1by/8n4KCgGdwZpGOF/q9QwsAMMghMDWpjXxoX8wZAI6gzPtYL7c6xtcAPrJ6ivYmkkPmB4BncGYdTBf6ucZWAD6RRCBLUx6wPTtULsAmId5h/PFP7fWzwZgemZ9PTdW0DXzbLPeTzEkZtDptVYu5j4BBuimeYeQxFhB22q+t7I6kSEQ0OmlVoL5trz5AuiG2iEkMVbQllbeW+kf9J2ATq+0MnisxCfAAO1qZSwRRGjBtPrDhnev26odbzhy05peV/+gr9yDTm+08oZqXF2rF6DvWr3PtcWaGIZZhfPN/26pfz+pVvvtWvXxv4nxmEGHisykA9TXhTfCZguZp1kG8+WeM40Zdf2DPhDQ6YUuvLkCoD1dGz8EdWZtGn1iNTPj0wjqfQnpXbsuMV2WuENlLsIAdXT5+tvl2um3tS5bn8ay9y7TtzGDDgAMjjfBMF3TDNbTWvbeJa5JbCag03kuaAAAdcxyxnsIQd37WLYloAMAABOZ51L0vgZ14ZylCOgAAABzIpgzioAOAAAwY4I54xDQAQAAZkQwZxKOWQMAAJgB4ZxJmUEHAACYIsGc1RLQAQAApkAwZ60scQcAAFgj4ZxpMIMOAACwSoI50ySgAwAATEgwZxYEdAAAgDEJ5sySe9ABAADGIJwza2bQAQAARhDMmRcBHQAAYAmCOfNmiTsAAMA2hHNqMIMOAACwQDCnJgEdAAAYPMGcFljiDgAA9MJqQvbGjRvXCee0QkAHAAAGSTCnNZa4AwAAE9lw5KZ1SbLh3es2zetnTZNgTqvMoAMAAKsyi/C81tcfFb4tZ6d1ZtABAIBVm8Vs+lqDvxBOVwnoAADAmk0jqM96Rh5aZ4k7AAAwNasN2cI5COgAwACtX79+5htbQRdNq29sOHLTunED9yTPhb6zxB0AoGN8wMAsbW5f07iPe9Syd6EctiegAwCDNM0QMi+COfO0fv36TdPqH8I4jMcSdwBg0NavX7+pC8G3CzXSP13pH9AXAjoAQNoNwAISLdAOYT4scQcAWNDSsndhiBa11Eegj8ygAwBso+ZsoZlKukAbhdkQ0AEAljHvsCz00CU+TILpE9ABAFYw6xAi6NBl2i9Mj3vQAQDGMIt7b4Ua+sT96bB2ZtABACYwjdlCM470mbYNqyegAwCswmpDtvDCEPgQClZHQAcAWINxQ4jAwhBp9zAZAR0AYI1GhRABBawcgXEJ6AAAU7JtGBdKYAsfVsHK7OIOADBlQggsz27vsDwz6AAAwNyZUYftCegAAEA1QjpsIaADAABVmU2HQkAHAACaIKgzdAI6AADQFEGdoRLQAQCAJgnpDI2ADgAANMtsOkMioAMAAM0T1BkCAR0AAOgMQZ0+E9ABAIDOEdLpIwEdGrBx48Z1tWtgiw1HbvL7AIAOMJtO3wjoAABApwnq9IWATqf1aea5T/8twNasygCYD0GdrhPQ6SyBllkSqGBprr1MW1/aVF/+O/pCSKerBHQ6qa+DYF//u7pKSGcatCMYDuN4W8ym00UuIgPW1QvWUAY/v592bHj3uk7+Lqivz+G8q9co2tLHMSPRP1rV1/ZGv2ikA9a1wWOoF1W/p3YI6oyrz8F8sa5dn2hLn8eLzfSRNg2h7dFdGueAdWXQcBHtzu8qGcbvS1BnOUMJ5tvq0jWK+oYwTiymf7RpaO2Q7tAwB6z1AcOFc3ut/86S4fzehHQWG2owX6wL1yfqGsr4sBx9pE1Db5e0R4McsJYHChfL0fzu2iGoI5xvreXrE/UMbWwYRR9pkzZKKzTEAWtxgHBxnIzfYTsE9eERzEdr8frE/A11TBiHPtImbZbaNMABa2lgcDFcvZZ+j4nfpaDef4L5ZFq7RjEfQx8LxqV/tEn7pSaNb8BaGBRcAKenhd9n4neaCOl9JpyvTivXJ2bPGLA6+kibtGdq0OgGrPZg4KI3G36v7RDU+0Mwn47a1ydmy/V/7fSRNmnbzJPGNmC1BgEXufnw+22HoN5dgvlsCCH94ro/ffpIe7Rz5kVDG7B5X/xd2OavxgDv97w0Ib1bBPPZE0C6z/V+tvSRtmjvzIuGNmDzuvC7oNU3z0He73s0Qb19wvl8CSHd4zo/X/pIO7R95kEjG7B5XPBdyNrid94OQb09gnldQkg3uMbXo4/Up/0zDxrZgM3yQu8C1ja/+3YI6vUJ5m0RQtrk2t4OfaQe/YB50MgGbBYXeBeu7pjVAK8NTE5Ir0Mwb5cA0g7X9DbpI/OnLzAvGtqATfPi7qLVXdMe5LWF1RPU50c47wYhpC7X8/bpI/OjPzAvGtqATeui7oLVD9pDOwT12RHMu0kImS/X8e7RR2ZLn2CeNLYBW+vF3MWqn7SLdgjq0yOY94MQMluu392nj0yXPkENGt2ArfYi7mLVf2sZ4LWP6RLS10Yw7x8BZPpct/tFH1k7fYKaNL4Bm/QC7mI1PKsZ5LWT2RDUJyec95sQMh2u2f2lj0xOf6AFGuGATXLhdsEaNm2lHYL6ygTzYRFCVse1ejj0kfHoE7RCQxy4lS7aLlYspr20Q1DfnmA+bELIeFynh0sfWZo+QWs0SJa8YLtYsZzlBnhtZv6E9C2EcxIBZBTXaBJ9ZDF9glZpmAAdN+SgLpizFCFka4II2xpyH9EfaJ0GCtATQwrqgjnjGHIISQQRVjakPqI/0BUaKkCP9D2kC+ZMakgBZDNBhEn1vZ/oE3SJxgrQQ30M6sI5a9H3AJIIIaxNH/uIPkEXabQAPdaHoC6YM019DCGJIML09KGP6A90mcYLMABdDOqCObPUhxCSCCLMThf7iP5AH2jEAAPRlZAumDMvXQwgmwkizEsX+on+QJ9ozAAD03JQF86poQsBZDFhhHlruY/oD/SNBg0wUC0FdcGcFrQcQhJBhPpa6iP6A32lYQMMXM2gLpjTopZCSCKI0J6afUR/oO80cACqhHThnJa1ENIFEVo3z36iPzAUGjoAvzGPoC6Y0yW1growQlfMuo/oCwyNBg/AdmYR1AVzumxeQV0Yoatm0Uf0B4ZIowdgSdMK6YI5fTHLkC6I0BfT6Cf6A0Om8QMw0lqCunBOH00zqAsi9NVq+on+AAI6AGOaJKgL5gzBWoO6MELfjdtH9AXYQmcAYCKjgrpgzhBNGtSFEYZoqX6iL8D2dAoAgDUaJ6QLIwAAADBn69ev39TCWeoAdItPcgds0ybvGxjPSe/ZoXYJMHS3S/K7i/68a5JXruJ1np/kS4v+fMZaigJgdjYc6b36EO1UuwAAYFmnJdklyXFJfmsKr/ecbf58zyQ/Wfj6WUm+PYWfAQCskoAOAO24apI7JXlBkh2S/MGMf979F3195yT/leSRC3/+0Yx/NgCwDQEdAOq748I/X5/kmpVqOHDhcdzCn/8kyf9L8sVK9QDA4AjoAFDXaUkeU7uIRTZvOvH6JN9IcnqSl2bLUngAYEbs/AQAdTw2ybvTVjjf1m+nbCz3zpSN6QCAGTKDDgDzs2/KfeVnJbl6unOaym2TfCvJG5L8XbbeCR4AmBIz6AAwHwcmeV+SC1KCelfC+WZXT5n1/2KSP09ySN1yAKB/BHQAmL1Tk5yf5Ca1C5mSv0ny1iRH1C4EAPrEEncAmI3fSvJnSf4oye9XrmUWfivJuUm+muTuSb6X5FdVKwKAjhPQAWD67pXk7PR/pdreSW6ecn/62UlenuS9VSsCgA7r+xsHAJing5M8O8k5GdYYu0OS+yZ5T5LnVq4FADrLDDoArN3OKaH84JSjyYbspCSHJfnHJG+uXAsAdMqQPt0HgFm4Ycqy7qMjnG92lyRnpix9PzjJXnXLAYBuENABYHWOS9md/YtJDq1cS4t2TnLtJJ9Kcl7KpnIAwAiWuAPAZO6Q5IFJHlG5ji45IuWYuY8k+YvKtQBAswR0ABjPHklukXKv+d6Va+miwxYeR6fs9n5a3XIAoD0COgCMtmuS2yZ5Rfp5nvm83STl1oAk+VDKEngAIAI6AIzyxJTl2cfVLqSHTk3y0yQnJ/mXJN+oWw4A1GeTOABY2oYkL41wPktXSfL8JO9M8rrKtQBAdWbQAWCLA5LcOsnpSfatXMuQ/P7CY4+UTeS+VLccAKjDDDoAFAcl+e8kZ0U4r+U+KcfWPS/JUZVrAYC5E9ABGLrdkrwyyVuT7Fe5FornJHlbyu/loMq1AMDcCOgADNXeKTuzfzrlTPMD65bDNnZM+b38R5IbpeymDwC9JqADMESPTvL9hX/+buVaGO1aST6XEtSPqFwLAMyUgA7AkByR5KSUmfMdK9fC+NYlOSzJ+1J+dwDQS3ZxB2AIrpnkNSk7tO9TuRbWZvOqh7NSzlIHgN4wgw5An+2aEuQ+n+SuEc774sgkpyT5TpLDY9d9AHrCDDoAffWAJMclObZ2IczEupSVERck+UySo5NcVLUioGU7JfnjCZ7/niQXz6gWWJaADkDf3C/JMUkeUrkO5ucmSd6S5ANJTqhcC9CG3ZK8dNGfr5PyQd64Pp7kvxf9+W+SfHEKdcFIAjoAfXHDlOXsN4wjuYbo4IXHHZO8McnfJrm0akXAPO2RZOckf5LkcSkBfS2ndPzhwmOze6ac/pEkf59ynfnxGl4flrSudgHUs2nTptol0BEnvcd2FTRtnyQ3TfKmuBeZLa5MucXhvNqFADO1a5LbJjk9yQ0yvxM6LktynyS/TPLhhX9O1YYjvVcfIjPoAHTZ01M2f7tD5Tpoz45Jzk3yrJTl75+qWw4wA09Iuf4fV+Fn75nkXQtfvyHlGMjTKtRBzwjoAHTV6UkeWbsImveCJI9NCejHJrmibjnAFNwvySNSPqBtwfELj6ulXHNg1axbBaBLrptyDvZ3Ipwzvs2bQ70v5Z5Ut/hBN90gZWf1f0074Xyxv0wZn+6RZL/KtdBRZtAB6IIDk9w+yatiA7jlXJrk/IWv90ty54q1tOp2Sb6U5BVJ3pnk7LrlAGPaJ+V0jpckudYqX+NXSV4/wfPvlOTaq/g510y5Fn8zyVFJPreK12DABHQAWrd/yj3EB9cupGHPTPKhlDPBkzK+PyzJnyX5g1pFNewxC4/Tk5yZMrMOtGnPlM0eD1vF370wycsWvv5mkrdN8Hf/MMktF74+Jsm9JvzZ10kZu45O8oUJ/y4DZonXgNnFnXHZxZ1K9k7yz0nWp8ygs7UfJ/m3JP+Q8iZ0KfsluXGStyfZZU51dc2lKctRP57k8sq1AFvbNeWDx1tP8HcuTfIXKTurfzdlyfla7ZHk+inX1DeljE/juiTJZ1OC+kR7YNjFfZjMoAPQmlsnuVuS58Q4tZSLU97s3TsrB8pvLzyOSvL8JIfPtrRO2jslAHwxZV+D/0ryi6oVAUlZ1n5exg/nn0pZSfTElOXs03R5ygehF6Yc5/n4JPdPcsgYf3f/hcfbUzaqdHY6I5lBHzAz6IzLDDpzdJ+4L3iUb6XM9n5ilX//kSkh/cFTq6h/zkpZ8v6yFZ4HzM5eKeH8iDGee1GS1yZ5YcrZ5PN0Usp+H+ME9aQcy3afjLlaxwz6MHnXDUALfj9lduHfahfSsD9NmQlfbThPklcuvM7dk3xkGkX10HEptw1sqFwHDNWuKZs4jhPOv5uym/uzMv9wniQnpgTuuyf50RjPv0uSd8TqMEYQ0AGoaa+UJYn/lbKs3X3S23tByq7FZ6QsbZ+Gd6TM+nwoyfen9Jp9c2LKvavHZnU7OQOT2ytlBcttVnjeL1L65o2SfH7GNa3kuynX1EOT/GCM5x8eK8UYQUAHoJY/SVnCeEiSq1aupUXvTlk++ewk/zuD1788ZVfkO6WcKfzrGfyMrrtmypL3j6e0133qlgO9tvme89uu8Lxfpdymc06SH866qAl8NsmRKdfTldam3yRl5RhsR0AHYN4em+QNSV6X8ZYwDs3nkjw6ZUXBhjn8vE8leWDKpnMnz+HnddG1Utrr+Sm7OQPTdbWU/jXOmHBckjfOtpxV+0TK9fT4FZ73O0nemrICALbi/gcA5uXQJKcmuWntQhp1Rcp9jJ9LOZZn3t6y8LgiyZNSlpqytUNT3oC/N8lTYzdmmJbrpPSvUa5Mct+UIL+UPZPsOM2isvo+/qYkf5wym77chOj1U64lv5fkp6v8OfSQXdwHzC7ujMsu7qzRAUkOSgl/Phhe2gdSjpV7f+1CFuyU5MwkN0/yu5VradWvUo5zOq12IdBxByV5T5JrjHjOL1JuMzlrxHP+O8nNplhXkjwm5QjGpGysOenxbQ9I8pqMHvuOTtkkdTt2cR8mb5QAmKVnpMwimDVf2hlJPpjk9NqFbONXKWf8Xjflg5WD6pbTpJ1SVoRcK2UWrJUPV6Br/i6jw/mvU5aNjwrnSemT0842r1r09ZlJLkjyign+/pkp96OfnuX3Wjk/5Xpr4ziSuAcdgNk4KWVW+IURzpfyoZTl7H+a9sL5Yl9PckzK/em/rFxLq05MeWP99pSwDozv2Kw8632fJG8e47VmPd38gJQVM8+Y8O+9PqOXyu+YMlMPSQR0AKbr+imB5bkpO4Szte8n+XDKeebvqFzLuC5K2Vn5gCRPSPKVuuU0aZ+UTf0+mxLWd61bDnTGHTJ69vxhWf6e81pemORpE/6du2X0EWxHpCzhBwEdgKk4KMnDU8LbhrqlNOnKlM2C7piyEdLldctZle8mOSXlnvRXV66lVVdLme17bcqtHcDSdk5ZafXEEc+5KMnG+ZQzsb9K8vSMn6UuTDmC7QvLfH/XlFVVV1t7aXSdgA7AWuyZsuTvrdn6Xj22dv+Ueyg/XbuQKXlEynF5H6hdSKPul3Lv6T8tfA1sbdeUlVbL+WqSe6QcA9mqF6XcHz+uT2T0yqkHpaxUYuAEdABWa6+UnXcfk+TAyrW06MdJnpeyuqCPm/+8IuXe9Fsm+d+UVQJs7aEps+mfTDlKCSiukuX3tdiUctxk6x9o/jrJ6yb8O3+d5Gsjvj/p69FDdnEHYFKHpXzS//AYR5by5ZSZkgdk8iN5uuaHKUtQr53kuJQwukvVitqza8pGiR9O2RDrMxl9LyoMwbkpy9yXsi7lvPNp+3HKh2UrOXHvyOcAACAASURBVHzM19shkx9DeXGS/0i5t36pidKDktwmyX9O+Lr0iDdWAEziMXHu8ygXpux6flHtQubsyiRvXPj6DkkeV6+UZl095Yim9yd5W8pMGgzRXTN61dVpSa6Ywc/9ZJLbj/G8py087+gxnrt/kjulrCYb1yNTbhNayrqUW2NuMsHr0TOWuAMwjiNSjpESzpf2yyT3yjDD+WJvTHJCymZHfVzWPw1HJDk5yStrFwKVPCDJfiO+f3Imu7d7XONOTJ6csnfEOLvH/3bKHiOT2DHJk0Z8/6cTvh49I6ADsJxdk9wg5eiot6ccE8PWvpLk8Skb+5yfYYfzxd6Rsov5b2f0/ZZD9ogk307ZbM8eDgzFVTI6KD8tybfmVMsoP0tZjj6OSQP1lRm9weYt4jSUQRPQAVjKzinHgn05yR8k2b1uOU16Vcr9hy9POYKMrV2R5Jspx8r9a5JL65bTpGslOTXJF1POQL5u3XJg5u6dcqLFcq5IO3t3fDSz2y/iJ0k+vsz3dk6y94x+Lh0goAOwrWcmOSdl0y+2d0HKrOcjaxfSERenvCG/d5JnVK6lVbum7N78ljhmiX4bddrDfyd517wKGcP/TfKlGb32lzP6Npefz+jn0gE2iQMgKcsO75pyLu1NK9fSoiuTfD9l06CvJPlR3XI66f0Ljx+nnB+8V91ymnRQym7vG5M8JOX/FfTJqOD5mYVHK3ZbeKxk11W+/k4pqwWWymOPSPmwYpLN5+gJM+gA3DAldL4pwvlSrkhZfnxASnASztfm1CT7Jjk9Zdd7tnZgynFs30tyYpJb1S0Hpma3JDcb8f1rzKuQMZ2clcfEnyT5/Cpf/9SUEx2Wsm+SfVb5unScgA4wXHunLDl+X5Jr1i2lWaemLM9+Q9q5L7IPfpnk0UkOSZlN/2bdcpq0c8pGUf+VEtih666T5Tc/+1GSM+ZXylh+lXLs2SifTBknVuPXSTaN+P6o2wHoMUvcAYbplCS3TbK+diGNOjtlE7jlZjeYjp+k7Hnw2pTl7/vWLadZ/5ay3PUpST5XuRZYrVFHp303yevnVcgYDk1y3zGet8saf87Oa/z79JAZdIBhuUGSf0w5q1o4394lSc5NOSJMOJ+fzya5Ucob4q9UrqVFO6fsf/DRJB9K6ccrzexBl+w4h58xziqoq6eE83dmvFMV7rOmipJvxOostmEGHWAYbpcyY/63tQtp1KUpZ70/OeOffct0/SDJWQuPE5McnuTIqhW1Z6+U2wK+nOS0JI+rWw50yn4pH76O8qyUzRrH8bYk315TRcljkhyTsvwfkgjoAH13QJJnp2xyZtfspT0jZefsC2oXwm+clDKj9m8Zb5npED02ZbbvfSlhHRjthknOnNJrnZ3k+Iy+h3xcy62G+dkUXpsOssQdoJ92TJktuCDlE3rhfHs/SVnq/1cRzlt0ZZIHJbl5ylnEv6xbTpOOT9mg6hMpy3KB2fppkvNSNg+d9dL0V8z49WmUgA7QP4cleWPKvW3Xr1xLiy5MuQ//6ln97rvMx89Tdkn+gyR3TvLBuuU062YpM+l3jaWyMEv7Jbl35jO7fb05/AwaJKAD9MexSV6S5AMLX7uNaWvfSjnX9tCUVQVmZLvjypRVDofHfdfL2SnJO1Lui31abCIHs/CMJHeb0886a04/h8Z48wbQD/dP8ro4smU530tyVMpu4XTbaSk7vR+b8kELWzs45baNeyR5b5Ln1i0HeuVZSS5Pcr+UjUVn6ZQZvz6NMoMO0F1XTXkz/q0I58v5n5QPL34/wnmfvDNlJn3/lA3+flC3nCYdluQ5STYk+Z26pUCv7JHk9kl2ndLrLXc+/N5Ten06RkAH6KarJXlLkk8luXaE86U8P+W86Dcl+X7lWpi+TSlHHB2a5IiUPRfY3okpH1Q9POMfHwWM9vRMZ7+Hw5PsOYXXoUcscQfonr9KCSWH1S6kUWcneWuSV9cuhLm5MMk9U2a1/qFyLa16VZKLUvrGU5NcVrccqOJdKWPEKPsmed4Yr3VSkodkbbu5n5TygTv8hoAO0A1XTfLgJI9K2bGZrf0yyddSlrN/IWX3b4blkwuP96a0A/deb+/AlPPT16fsiv+TuuUwMKNW7u6QZPfMfnf0j6TsY7GSXyZ50QrPeWCSR2RtAf3Ha/i79JSADtC+26WEjmnd79Y3P0pyr5R7ka+sXAv1XbjwWJfk7kluWbecJt065baPVyd5bZIP1S2Hgbg85QPUGy3xvesmeWWSB824ht3HfN4HklySss/Fci5LudVmLX4x4nvG/IFyDzpAu66bclzSu2KgXs5Lktw35c2UcM5iz01yq5Sj9S6sXEuLdk7ZBf+DsRs+83Fxyu0VS1mXtq7hH0py5grP2ZTRAXslt8ry+0J8LK5bgyWgA7TpzCT/nnK/uQ1ktndayrFpT03ynsq10LanJzkmyb1Tlq2yvdNS7k2/Q+U66L+rjvjenVP6aitW+mB89yR/t4bXPzLJjZf53r8n+cwaXpsOs8QdoC3PS/LIJPvVLqRRH0tZzv6drH1pIcNx0cLjjklek+T6dctp0tEpAf0bC19/K2ubHYSl/HjhsdcS37v2wqMrdkwJ2auxa0Z/WLHvKl+XHjCDDtCGo5L8Zcq5xcL59r6R5PUpx2l9O8I5q/OhlKP3Hp/kvMq1tGiPlPuDv5KyisfxjUzbW1I+JFvObZP81pxqmYbVnoZw/STPXOZ73499IQZNQAeo66ZJTk1ZzvasyrW06gkpR2g9ILPf4ZdheHnKkvfHJbmgci2tOjbJOVk+RMBqjbpt62FJfmdehaxgtxm97k5JNoz4/hdTNm9koAR0gDp2SfL+JO9MOfaI7W1IcnCSU1KOz4JpOy0lqH84juZbytFJXpDkE0nuF/thMB3PTQmhy2llU9QTk3xuBq+7T5Ljl/neWjeeowcEdID5OyTJ+5LcPsm16pbSpI0py/1Pil1smb0fJTk8yR+mLCu9om45TbpZkjcm+VqSG9YthR74ZkbfPvHvSW4xp1pG+VZWXsK+mo0nzx7xvZ+lrBhjwAR0gPl5SJJ/SgkBt6tbSpM+nXIk1i1T7sWHefl1ykzZYUkemHLbCdvbN2Xlz9PSrfuEac9pKf1uKXulnInegpWy0nVTNp8c150zegn/Hkl+NcHr0UMCOsB8PD7JPyd5aO1CGvWFJPdIORILanpTkhOSPL92IY3aP+X4x/9IuZcfVuPFGb3Z5/WTPHhOtazFgVl+ufpSHpDRO9U/KVbxDJ6ADjA7+6YsY78kycsq19Kq/0lZXnyblGOwoBXPTQmj56acHMDW1qdssnd6HFvH5NZldLDdJ6s/wmzefjrGc3ZK8vAkfzziOd9Pcn6WX1nAQAjoANO3S5I/SvKBlOWgjk3b3vkpqwpukOSDSS6tWw4s6dtJ7pNyf/pnK9fSqkemHMv2Z3HrDuPblORTC4/l/H8pM+2z2k19HPuM8ZzLx3jOHkletfDP5bwoyVfHKYp+E9ABpu/slDO7f792IY06Pcm9Ynks3XFJyo7mj4uj/pbzdymbe52a5DqVa6EbvpzkX1Z4zlNSd1f352Tle8LvlXJk6igr3TLz+ZRTXUBAB5iSq6TsPP7plDfybO3nKUdZ3SLJoyvXAqvx9ZSNrW6REtTHWdY6NFdNOTbyAykrh3asWw4d8LqUkztGeUPKEvGVjJqd3myXMZ6z2OvG+Nk3T3KTEd//hyRPHPH9S1OW8396stLoq3EaOwDLu2HKvZivyehjY4bqiiQfS1kG+4W4t47u+8LC41VJTknyqLrlNOl6Sb6R5K1J/jrlwzlYyneSvDtlHF3OUUnekuR+Gf3B2EeSfHeFnzfq/PWl7JZyq9pKmemby/z7v0/yhBX+7oeSXDxhXfTYutoFUM+mTaM2z4QtTnqPxTbLuHnKG9BRO7IO3fEp5ydDXz0vyR1SNjtkaX+bMqt+Tu1CaNbfJvk/KzznrUnum+QXsy9nKl6WstfKKGenfPCw5IfXG470Xn2IvOsGmNzuSc5L+URfOF/a5tAinNN3z03ZSO6eWXn2bqj+POVa8Ee1C6FZf57kb1Z4zjFJ3jaHWqZhnHC++XlWlrEVAR1gfOtSNjj7Wsqb8QOqVtOe76QcSXXtJCemLAuEIfhBygd2N06Z4XOO8fZ2SnJGylLgg1PuV4fF3p7kyhWec6eUzQivN/NqVu+lGS+cvyhlWT5sRUAHGM+9UzaIemSSa1aupUWfTdk86z4pO17DEH0vyVlJHhyrR5ayc8oHm59KmQk1o85i707yiDGed1TKcWQvnm05E7tHSjgftSHcZi9M8syUDVRhKzaJAxjtyJQZscfWLqRRP0vy5JQ324I5FG9YeDw8yd1TriFs7bCFx1Ep/58gSf5vygqU143x3KeknBTw57MsaEwPT9k4chwvTPKsGdZCx5lBB1jaNVKOfnlzhPPlPC5l1vy0lCOogK29OsmDUvrJlyrX0qqHJfl/KUuCr1K5Ftrwryn9Zpwd0v5PSvt5UJI9Z1nUEnZNcpuFn//KMf/OCyKcswIBHWBruyc5JOW+sD9Msnfdcpr0kSQnpATzL1SuBVr38ySfSHJoynFKP6xbTpNunrJZ1vdSrr/wuiQPzcr3pCel/ZyRclTZ7TP729B2SWmnG1OOELx5xjsZ60VJnj3DuugJAR1gixNS3hR8KMkNKtfSogtSdmc/JMmplWuBrvluypLu+2bl3aqHatck70ry1LS9CRjz8S9JHjLB8/dK2Zz0vJQ2NAuPTvKalPcJN8n4WepFKfecw4rcgw5QNip6UMoGL2zvuynLUD+csls1sHrvXXh8KckrKtfSoj2S/HXKPb0fT/IndcuhstemLHV/7QR/5zYLj7sluXzh3z0+q78V6/ey5UO11bxPeEHMnDOBcZZj0FObNo1zaw8kJ72nt4tt9ktZdnpmyu7CbO2KlCWDR8X9szAL+yfZkOToJNepW0qzLknZfOu5tQuhqv1TNoVb7YZwP8yWHdP/IskHRzx3v5TTGDbbPclvreJnfj3lfvpVz5xvONJ79SEygw4M0dWT3DnJKUn2rVxLq9646AHMxiUpS2Z3S9m9+nZJDqxZUIP2T/KclKXE709ZAs/wXJJyYsgVKbdZ3X7Cv7/Poq/PmFZRI7wj5QQHmFhvp8UAlnFyknOTvD7C+VLOSjnr/fgI5zAvP0/yx0nuGccVLudZSd6Z8sHqzSrXQj3PSHLXlKM9W/T5lOX0965dCN1lBh0Yiqsk+bskj6hdSKMuT/LvSR6YLcsAgfn6VMrs4PqUGXXHjm3vhCT3SzlB4i4pM6oMy89TPkS+YZJzkhyQ+pnmp0mOTfLZlFvDYNXMoAN9d3DKG7rvRzhfyo9Sjk27QZLjIpxDbV9L8uaUW3Gen7JRGlu7VsoS5/el3BbA8FyWcnzhDVNWnnwkyccq1PGfSf4spb/+R4RzpsAmcQNmkzjG1eFN4u6Ysgxut9qFNOonKcvw3lu7EGCkc2LJ7Cj/lOQDKasOGLYXpYz9t5nhz7g45UjWX6TsjzAzNokbptrLQQBmYb8kpyc5PML5cp6UejMOwGSOT7nv9sVJblS5lhY9bOFx1SQvq1wLdT0jZYXFrRf+fPuU3d/X6twkr174+qtJLpzCa8KSzKAPmBl0xtWhGfTrpbw5u13KcjO29s2UFQUbYiMq6KK9k9w0yWtSrnds75IkD0jymSTfq1wLbdh/mz//dZLDRjz/2ym3fC32g5QZ87kygz5MZtCBvnh+kmfXLqJh/5nkDnGPOXTZpSlLuX8nZW+NU+qW06T9U+5N/0LK8uNzYyO5odv2A+kHV6kCxtSZaTGAZfxRyrIz4Xxpl6Qc+XLXCOfQJy9P8icpt/OwvRsleUPK0ZEAnSGgA120c5I/SLIxyb+k3HvI1i5LOYro0JQ38pfWLQeYgTOTPDrlWLaPVK6lVcekHF/3/CR7Vq4FYEUCOtA1V0tyQcobrj9Msmvdcpr0vJT/T29O2cwG6LePJzkijnlazsEpq6x+kLLq6oZ1ywFYnoAOdMlTkpyd5Laxh8ZSzkvytCQnxj2XMDS/THKXJEcneUnlWlq1S5LXJ3l/kptXrgVgSd7gAl3wxJRlikfVLqRRn0sJ5v8ewRyG7pMLj7eknAd9Yt1ymrR/yv+fj6fMqP+sbjkAWwjoQMuuk+ReSV5au5BG/TTJ3VPOY/1R5VqAtrx/4bEuyUOSHFi1mvYcsPD4apLzk/xlkq9XrQgglrgDbbpekuOT/E/KBmds741J7pnkgxHOgeWdmOS6Sf5vks/WLaVJ10ryiCRfSzm6DqAqM+hAa05JWZZ549qFNOofU2bFzqxdCNApD02ZRb9nkr9Oskfdcpp0SsrYc3bKhnsAcyegA63YM+XM2qNrF9Koy5KckeSxtQsBOuuilFVJH0/yrjh2bCmPS/KgJF9OuYXof+uWAwyNJe5AbbdMOZ/2BxHOl3JxykzONSKcA9PxkZSjGE9I8tHKtbRor5RjPD+S5HZJdq9bDjAkAjpQyy2SPDXJx1LOp92lbjnN+XXKUUl3Szk6yS7DwDRdkeTUlAD6/JRbZ9ja9ZN8OOWWIvenA3NhiTtQw0Epu+YeULuQht0n5f8RwKw9N8k+Sc5JcvvKtbTo3guPuyV5XcpZ6gAzYQYdmJcdUnYS/kjKzuPC+fYuSnJSyv8b4RyYpx+m3GZ0k5Tjxq6oW06T7pHkNUnul2S/yrUAPWUGHZiXVyR5ZO0iGvWZlKX+D61dCDBol6UcxXa9lBB6ZrxX3NbOKcdcfi/JnZJ8um45QN+YQQfm4VURzpdzYcqslXAOtORNSY5LcnLtQhq1b5K3JfmHJFetXAvQIwI6MEtPSDnO5+G1C2nQZSmzL3dJWdoO0Jrzkzw9yfokZ8Vmldu6Tso4994ku1auBegJAR2YlcenzCzconYhDTohydVT3tR9u3ItACv5eMqS9+sl+UrdUpq0Psn7Uo6uA1gTAR2YhccleVntIhp0RspS/1OT/KJyLQCT2JTkf1N2eX9JkkvrltOc26bsgr9P7UKAbhPQgWl7YpKX1y6iMR9IOTbtT1PuxwfoqouTPDXl9pwnVq6lNYcneVeS3WsXAnSXgA5M0+OTvLR2EQ35QcqRRXdPcm7lWgCm6WMpK6UOSPKPlWtpyfok70+yV+1CgG4S0IFpOSGWtW/2y5QdkA9PObLosrrlAMzMxUkek3L9/8/KtbTiVknenrLXCMBEBHRgGp6Y5JTaRTTi5JSjie6fEs4BhuCJSe668M9vVa6lBYekrJwykw5MREAHpsEZ3snZSW6ZciTRWyrXAlDDpSkz6YenfEj567rlVHdokv+oXQTQLQI6sBZ7Jzk9yU1rF1LRV5K8Mcl9k2ysXAtAC76acpvP/ZN8tHIttd0iye/VLgLoDgEdWIuDUo4NG+K15MdJ/jbJEUmOTzmCCIAtzkpyuyR/keS8yrXUslPKGemHVK4D6IghvqkGpmOPJC+uXUQlT0hy5yRPjnstAVby4iT3S1ltNET7p+xNArAiAR1YrXemzIwMyUVJHpuyId7HKtcC0CW/TPKgJAcm+UySn9YtZ+4elXIrlPfewEguEsBq3CrDuqfuP1POd79ukldUrgWgq65I8o2U26OOSblPfSiumvLfu652IUDbBHRgNZ6a5Bq1i5iT9yY5Ksmf1S4EoEcuSNlE7lG1C5mz59UuAGibgA5M6u5J7lS7iBn7dZLvJLl1yn2DP65bDkBvvTLliMpTk1xeuZZ5eFSSXWoXAbRLQAcmsXuSOya5eu1CZuijKbM6B6bcZ/6juuUA9N7GJCck2Tfl3PCL65YzU1dP8ve1iwDaJaADk7hGyvL2vtqQsvHdWSn3SgIwPz9LcpeUlVoXVa5lVtalrM46uHYhQJsEdGBc61J2L++jNya5T5KTahcCQD6V5G5JHly7kBlZn+Sw2kUAbdqpdgFAZ2xKecPUFz9N8vWU/6b/jRlzgJZ8buHx3iSPSPKwlFuP+uKqSXZOOX4O4DfMoAPjukP6E2J/mOTolKN+vpn+/HcB9M23UlY3XTfJeZVrmaaTk9yodhFAewR0YFwvSbJn7SKm4Fkpy9k/ULsQACZybJInJfl07UKm5Ke1CwDaI6AD49g5yWW1i1iDy5O8POUonxemnL8LQLf8Osk/JLlrynGfXT+W7fXxXhzYhnvQgXE8M93d0OajKW/kfla7EACm4pKFx9WTPDTlDPUuulntAoD2COjAOHZO9z7l/3qSNyd5ToRzgD76eZLTkvwqyeHp3q7vP0tZFQDwG117ww3U8avaBUzoT1PO0X1yur8EEoDRXply3T82yfsr1zKJqyR5fu0igLYI6MA4rla7gDFdlOTeSc5IOZ4HgOE4J8kxKZuA/qByLePYOeV+eoDfENCBcTyhdgEreE+SDenfMTwATOayJLdPcmiSs9L+OeN2cge24h50oMs+leTVKbv6AsBmn09y3yT3THJIkqfXLQdgPAI60FVfTHK3lJ18AWAp5y88fpbkpMq1AKxIQAe66MspMyLfr10IAJ3wvJRbO5+WZLfKtSzW+hJ8YM7cgw50zUeTHBHhHIDJbEh7Y8f1Uz5wBkgioAPdc1aSi2sXAUAnPT7JptpFLPK7Se5XuwigHQI60DV71i4AgM56a+0ClnBZ7QKAdgjoAAAMxVVrFwAwioAOAAAADRDQAQAAoAECOgAAADRAQAcAAIAGCOgAAADQAAEdAAAAGrBT7QIAgF67V9p4v3FOkl/XLgIARmlhwAQAuu3kJLss8e93SvL4OdeynLOSXLTM965M8pQ51gIASxLQAYBRdt/mz89LcsSiP++QZP38ylm141b4/p2S/GqJf39CkgsX/flnU6sIALYhoAMAi+2Z5MYLXx+W5AXbfH/bwN4Xt1jm338oWwf3P05yycLXv06ycZZFATAsAjoAcOskhyx8feckx1SspTU7Lzw2O3eb7z8jyc8Xvv77uVQEQG8J6AAwTE/OllB+SJL9KtbSZS9a9PUxSX688PXTknx5/uUA0GUCOgDTtnNK2Ds/ydXm+HO/neS+SS5O2fSLrf12ykZu70iy68Kfma47L/r6DkkuS9k9/sUL/+4nSX4055oA6BABHYBp2iHJPyd5YIWf/dspu3S/OskjKvz8Ft0sye8kuV2Sv6hcy9BcbeHxhIVHknwyyYYk58WRbwAsQUAHYJr+Lcn9Ktfw8JRZ/IdmuCHoakmek+QBSa5VuRa2uFmSsxceX0/yvmx/TzsAAyagAzAtr0/9cL7Zn6acv/2T2oXM0W4p/833T7J3khvVLYcRjl3456NSjnD7YZL7ZMtmcwAMlIAOwLQcXLuAbZyX5I61i5iDA1P+378x/T0Cra/2SNlBP0l+kOT0JGfE0W0Ag7VD7QIA6IU7pszatmS32gXM2K5JnpjkPUneEuG863ZP8qQk/52yA/zt6pYDQA1m0AGYhocnOaB2EdvYVLuAGfqrJIcmOax2IczEXyX5XpILUpbBf79uOQDMixl0AKZhSPd61/SglJ3qnxbhvO/2TXJcks+m3L7gWDyAARDQAaB9N0/yyJT7kwW1YblmyuaLFyV5ZuVaAJgxS9wBoF1XT/LslHPlr1G5Fup7QZLrJHlnknMq1wLADAjoANCmPVPOyT6och205bFJHpLk+CTvSvKLqtUAMFWWuANAW3ZMcqskH4hwztJ2T3Jukv9Jcr26pQAwTQI6ALTln5P8V5Jb1C6Epu2Q5NopqyxuXLcUAKZFQAeAdvxrkgfXLoJOuW6StyZ5Q5KdK9cCwBq5Bx0A6ntKkickObB2IXTS9RYe+yW5W5LLaxYDwOqZQQeAup6c/P/t3XeY7Wdd9u1PEggtFAUBBR4hJFhBkN47hF4DSAcFy6MoEKqIgEhJEFGkKE1aqIKkUBJAMEiR3qQkgMBDSyBAIAXS3j9+kzc7Ozt7z+w9M/cq53kc65i11owzlzvDzFzr/t33t4NSztl1N64OqS4+OggAO0dBB4BxHl09Z3QIFsotq7dUFxwdBIC1U9ABYIzHppyzMW7RNIJtj9FBAFgbBR0ANt+jq2ePDsFCu1H17upio4MAsHoKOgBsLpe1s1luVr252mtwDgBWSUEHgM3zmJRzNtetq3dkcg/AXFDQAWBz7FHdZXQIltKNqvdWlxgdBIDtU9ABYOPtVr2suuHoICytG1d/MzoEANunoAPAxjpfdXD1oNFBWHo3qX5jdAgAzpuCDgAb68LVfUaHgOpq1RHV3qODALBtCjoAbJwrVO8fHQK2cPnqP0aHAGDbFHQA2DgHVFcfHQK2csnqdqNDAHBuCjoAbIxrVbcfHQK24SLVWzNVAGDmKOgAsP4uVr272md0EDgPF6huPjoEAOd0vtEBAGAB3bm6+OgQM+ptm/i1rBBv359Xx1UHVqcOzgJACjoAbIQXjg4w0JlNe++35YTqpZuY5SHVL5zH+56dv4Oqnt5U0AGYAX4xAcD6ekbT5cOL7NTqjJX7f1L9zxbvO7n69KYn2rZXbOd9724agXeWfTrniwfnbzm2Ap5Zvar6vdFBAFDQAWA9Xaa6RbXn6CAb4FPV6Sv396++t3L/pDFxdtlntnr84eotWzy+QfWslfsXra6yGaEG2K26SfWr1dcHZwFYego6AKyfe1XXHR1iHX2/el3TivmjB2fZDFu+2PDuppP4qy5RPW3l/p9taqLN8SvVk6qHjQ4CsOwUdABYH1ep/mB0iHX0J9VHqk+MDjIDflQ9YuX+oU1XSTx+XJwNccumqwY+ODoIwDJbhr1VALAZLlxdbXSIXfSd6nnVFasXpZxvy5HVE5r+jfapjmnadz/vrlRdP4s3AEMp6ACw6/ZoWoGcV1+t3lxdvnpk9iKvxterr1T7Vndtc8fHbZTnVHuPDgGwzBR0ANh1F2gqN/PmtOox1R2aDn47Y/sfznk4oqmkP3J0kHXwk9EBAJaZv6ACewAAIABJREFUgg4Au+781c9Gh1ijM6rbN72w8MXBWRbF85ouE9/eeLdZd/DoAADLTEEHgF13ePM1+/yk6o5N+6lZXx+uHto0W3weXb9pbz0AAyjoALDrzj86wBr8rLpP9Y7RQRbcg6qDmgr7PLlA9fLRIQCWlYIOALvmIU0Hhc2LOzWNCmPjPba6S/Xfo4Os0U9HBwBYVgo6AOyaG1a/MDrEKpxS7ZfL2jfbsdVtmq+RdTer/mx0CIBlpKADwK75wegAq/DdplPa3zU6yJL6cXXT6iOjg6zShapfHB0CYBkp6ACw865W3Xp0iFX4WHXY6BBL7qfVE0aHWIMTRwcAWEYKOgDsvKtW1xgdYgd+XB0wOgRVfar5GcH2iGb/extg4SjoALDz5mH2+X9XXxodgqp+2Nkj2E4fnGVHrpC/EwE2nR+8ALDY7jc6AOfyoGqP0SFW4X5NY9cA2CQKOgDsvFlfBf277CWeRbtXjxwdYhUeWV14dAiAZaKgA8DO2aP6pdEhduDI6qTRITiXM6o3VyePDrIDp1dnjg4BsEwUdADYOZev/nl0iB0wKmt2/b/qrtW3RgfZgR+NDgCwTBR0AFhMRzWNV2N2HdF0lcOs2r36y9EhAJaJgg4Ai+kD1dGjQ7BDuze7l5HvVv3x6BAAy0RBB4DFdKHRAViVhzeNX5tVLnEH2EQKOgDAOD+rXjo6xHbM+qQCgIWioAMAjPXk0QG244rVH44OAbAsFHQAgLFOqx48OsR5uFh1k9EhAJaFgg4AMNbp1XGjQ2zHSaMDACwLBR0AYLwvVP8xOgQAYynoAADjfa167+gQAIyloAPAYjp5dADW7FKjAwAwloIOAIvpetXeo0OwJu+tvj06xDacMjoAwLJQ0AFgMd28utboEKzJIdXRo0Nsw+2rG48OAbAMFHQAWFwXrfYYHYI1+WF15ugQW9m7+u3RIQCWgYIOAIvrpdWFRodgTe5e/WR0iK18o/ri6BAAy0BBB4CdMy+/Q584OgBrske12+gQWzk0I+AANsW8/HEBALPm29WTRodYhSdUzx4dgjU5fXSArZxvdACAZaGgA8DO+Vn16dEhVumx1TNGh2BVTqtuWh03OsiKQ6s/Hx0CYFko6ACw8y44OsAaPKF61ugQrMpnqjtU3x2c47Dqzk0vRgGwCVyyBAA7b95e6H5ctU/179VrBmdh+z5a3a76tYEZ3jLwawMsJQUdAHbeSdWJ1UVGB1mDe1R3adrn/L6mE8N/OjIQ5+lTKzcAlsS8vfIPALPksOplo0PshPNVBzcddPee6o5j4wAAZQUdAHbVrI3EWqvrNB0E9vrqm9V7q3cOTQQAS0pBB4Bds+foAOvkPitv/6jpkLLvV/uvPHfqkEQAsGQUdADYNV9t2ot+4dFB1slFqxuu3D9+5e0fVv+zcv+zzd6cbgBYCAo6AOyaA5sOXrvO6CAbYK+Vt6/d4rl/rf57i8cvzxguAFgXCjoA7LoLjQ6wiR68cjvLvTvnvO6HNZ0MDwCskYIOALvu7tXnW5z96Gtx060e37D6+cr9U6v9qlO2eP9PM9YNALZJQQeAXfeNlrOcb8vlt3r8ta0ef7R62lbP/UfTPHkAWGoKOgDsujOr51d/NjrIHLh201i3Lb2j6eT4LX2jeuGmJAKAGaGgA8CuO7V6QfUn1R6Ds8yj263ctnbfrR6/uHrDNj7utKYXSQBgrinoALA+jqmeUf3V6CAL5IZbPb5+215V/6/q8dt4/tPrnggANpCCDgDr4/TqfdX9qyuNjbKwdm+a0761/VZuW/vr6rhtPP9v1bHrmAsA1oWCDgDr571Nq7YK+mx46nk8//vV0Vs997XqiRsbBwC2T0EHgPX1R9Wtqr1GB+E8XXPltrV7b/X4RdVrtnruuwHABlHQAWB9fa/pVPL9Rwdhzfbe6vFBK7ct/X7nLOnHVx/eyFAALA8FHQDW3x+moC+ql231+OfV32/x+HOde9UdAFZFQQeA9XdS9aTqaU0Hm7G49qwet8XjM5peoDnLIdXztnh86maEAmA+KegAsP5+Vv1t9etNp7qzPHavbrTF4xt1ztF7/9zZK+zfqr6/SbkAmAMKOgBsnEOaDh47/+ggDLXlaLgDVm5VH61esXL/K9URmxkKgNmjoAPAxnlT9dPq7aODMJOuvXKrOrl6W3V69YDqzFGhABjHvjgA2FjvqO5U/WR0EGbahar7VPdrmsn+lZXbNavLVnuMiwbAZlHQAWDjHVY9a3QI5savNo1827v6WPWd6uXV7avrD8wFwAZT0AFgcxxZfX10CObWA6vDq/c1vdjzrJxtALBwFHQA2BwfrW5ZfW90EObaWWPdHld9pPq7pqLuXCGABaCgA8Dm+UrTJcqfbjoUDHbFNapHVT+ojqtuUF1qaCIAdomCDgCb62vV1ZsOAzt1cBYWw0WrS1T/1TQx4I/GxgFgZynoADDGW6u7jA7Bwrl29aKmov7YwVkAWCMFHQDGeUd1x+xLZ/3drnp2dUx126YVdgBmnIIOAGMd3jTn+kmjg7CQrly9s/pMtc/gLADsgIIOALPhb6u/Gh2ChXWFpsven9F0EjwAM0hBB4DZ8fTqxtUbqtMGZ2Hx7Fs9oWlF3Qx1gBmkoAPAbPlA0wnvv1J9eXAWFtPNq+9XB40OAsA5KegAMHtOb5prfePqxdXxY+OwgC5WHVD9/eggAJxNQQeA2XVs9cfV7as/H5yFxfQX1Zuqh4wOAoCCDgDz4CPVPzadwv1PTWPZfjw0EYvkntVLqgeODgKw7BR0AJgfX6n+rGks27WbDvs6ZWgiFsUe1Sur+48OArDMzjc6AACwU46ublfdqfrt6urVvYYmYhG8euXta4amAFhSVtABYL4dWj2zaeXzJtXnM6KNXfPK6sGjQwAsIwUdABbDqdVR1bWqS1YPqz6zcvvOwFzMn92rl1cPaLr0HYBNoqADwGI5pTqhemn1Oyu3mzeNa3vpwFzMl92qV1VnjA4CsEzsQQeAxfelpnFtVUd29u//f6kuMiQR8+DM6jnVo0cHAVgWCjoALJc3bnH/qGrPlfsvqX5zi/ddZtMSMat2qx7VdMXlEzIxAGDDKegAsLy+ucX9W2z1vldWl165v0d1601JxCz6i+r91b+PDgKw6BR0AGBbHrTV40d39mr7JarHbm4cBnto0xUXPxgdBGCRKegAwGr83VaPD9vGxzyladTblvZoulSa+Xanpm0PCjrABlLQAYCdcdQ2ntuvutBWz/1a2z49fvfqt9c7FBvqiOrG1ddGBwFYVAo6ALBeTl25bemjTaPetuUfqwucx/suW915nXKxPi7X9GLLLUcHAVhUCjoAMMojdvD++57H83tXf7POWVid36zumgPjADaEgg4AzKqDt/O+15/H8/tW/7qN5y+9jedYu8tWV01BB9gQCjoAMI+O2c7z25rh/pzqt7Z67vLZB78z9ql+sTp+dBCARaOgAwDL4IBtPHfZpvFhW/r9pkvoOW8PrF5cfWh0EIBFo6ADAMvqu9UztnrudU0r62f5x865yu5vp8mLqhtVPx0dBGCR+CUDAHC2r3XOMWI3qPbc4vEbq19Zub9b575sfln8TnXS6BAAi0ZBBwA4byev3M5y263e/w/VBVfuP3xTEs2GM6v7V68aHQRgkSjoAAA778+3uH9YdfGm4rp1kV80u1XPTEEHWFcKOgDA+jh05e1bq19uOu38lSvPLeKYtx+MDgCwaBR0AID1dWLTuLctR769oqm0X6PFKesXa9qD//nRQQAWxe6jAwAALIGHVPtVd6mePDjLevnV6i9HhwBYJAo6AMDm+XD1N9UNq7+rTh8bZ5edODoAwCJR0AEANt8HqwOqS1bvqr49Ns5OO2V0AIBFoqADAIzz46ZL329cHT04y864erXv6BAAi0JBBwAY76vVHasHN80Ynxc3qm42OgTAonCKOwCszsWqa1b/Mujrf6+6TXXSoK/Pxvvyyu3bTSPbLjA2zqq5zB1gnSjoALBjv9FUmK48MMM+1ZHVnarjB+Zg4x1Z3b16adNoNgCWhEvcAWDH/rSx5fwsN6jeWl1+dBA23Nuro0aHAGBzKegAsH03a5pdPStuUl1hdAg2xVOqb44OsQo/Hx0AYFEo6ACwfb9cXW50iK38YHQANsUXqpuODrEKe1d7jg4BsAgUdADYvtNGB9iG+1V7jA7BppiHQwGfUV1pdAiARaCgA8D8eXJWLJfFj6uDRodYhTNGBwBYBAo6AMyfk5uvWdnsvFOqt40OAcDmUNABYP6cmdnTy+SSowMAsDkUdACYP3tW/3d0CDbN56v/HB0CgI2noAPA/Dlf9YjRIdg0X6mOHB0CgI2noAPAfPrR6ABsqguPDgDAxlPQAWA+nTo6AACwvhR0AJhPv9Y0Dx0AWBAKOgDMp0tV1xsdAgBYPwo6AMyvX6kuPToEm+Kk0QEA2HgKOgBs356jA2zH3aubjg7Bhtu32m90iB3wNyXAOvDDFAC278jqraNDbMdpowOw4X6juuHoENvxzOobo0MALAIFHQC279jqq6NDbMerq4uODsGG+vnoADvwyerk0SEAFoGCDgA7NsuXuV+keuDoEGyoH48OsAMXHB0AYFEo6ACwY7P++/KZowOwYS5e/c3oEABsjln/gwMAZsEJzfZe7xOqi40OwYY4s7rl6BAAbA4FHQB27InVZ0aH2I7LVS8eHYINcZPRAVbBJe4A60RBB4DFcI3q6qNDsO5ePjrADny8+vDoEACLQkEHgNU5Y3SAHfj16rDqSqODsG52a9q+MMs+VH12dAiARaGgA8Dq3LH62egQO3C56jqjQ7Bunt/sv+Di8naAdaSgA8DqzPpK5lleX911dAh22Vkvtsz632oXHR0AYJHM+g99AJgVu1cXGB1ild5c/d7oEOy0X6neXl17dJAd+Fb1D6NDACwSBR0AVufk6l6jQ6zSHtXtRodgp+1bXW10iFU4pWkPOgDrREEHgNU5o/rG6BBr8IDqqaNDsGa/27R6PuvOrI4aHQJg0SjoALB636qOGB1iDZ6ckj5PblS9u7rw6CCrcGb1+6NDACwaBR0AVu//VYeODrFGT67eW+0/Ogjbdd3q36tfGB1klXavLj46BMCiOd/oAAAwZ06sftJ8nV598+rG1WnVWwdn4dyuWf1HdaHRQdbga03fTwCsIyvoALA2r6g+MjrETjhf9Zbqj6rfGZyFyeWaLhN/X/NVzqse3PRCFQDrSEEHgLV7ZvMzF31rL2q6TP+3RwdZcpeqDq9eWu01OMtavaX68ugQAItIQQeAtXtv9c3RIXbBFZouqf7P6pLVbmPjLJVLVm+sPtn8Xsnwseq7o0MALCIFHQB2zh1GB9hFl2ral/796gVN+9TZONetntj0771/dfmxcXba8c3XuEGAueKQOADYOYv0Ivcfr9yeWZ1avSwlbL38ZnXv6kktxvfM56vXjg4BsKgUdADYOd+pnlL9dYtzifgTVt7+XvXppmJ5ljM2P85cOquEP69pn/8+TVsKFsEp1Z+NDgGwyBR0ANg5p1RPrfat7jc4y3rbd+X2/ZXHP69u1/T/8xerMwflmlV7Vldu2l9+yMpz8zLPfC0+2/TCDQAbREEHgF1zWHXbpj3di2bLkvmJlbcv6Zxj5l7VdFn8Mrloda8tHt+6c15tsKj2Hx0AYNEp6ACwa15fPb7FLOjb8rCV21nuXX17i8fHV4/a1EQb75eqg7Z4vHfTAXvL5KXVD0eHAFh0CjoA7Lr7VF8YHWKQW2/judufx8feo9WP5/p59ZOdSnRul1zlx92tOmAbz1+k+T11fb28tTphdAiARaegA8Cu+1L10erao4PMiF87j+c/t4bPcXT1J+uQ5brV09fh8yyrE6snV28fHQRgGSjoALDrzqxuVb2xaT86u27f6sjRIejY6rmjQwAsi0WYxwkAs+CE6i2jQ8A6Or1znjcAwAZT0AFg/byq+pfRIWCd3LN6z+gQAMtEQQeA9XNK9YdNo8hgnn2p+vzoEADLRkEHgPX38OqFo0PATjq6usPKWwA2kYIOABvj30YHgJ3w9eom1VdGBwFYRgo6AGyM91Z/OjoErNF+rX5WPQDrTEEHgI3zguqPR4eAVTq8aawaAIOYgw4AG+vF1W7Zk85sO7y6V3XS6CAAy0xBB4CN96Kmkv6C0UFgG95V3b36+eggAMtOQQeAzXHWCrqSziw5omnfOQAzwB50ANg8L8yedGbHodVdRocA4GxW0AFgc521J/3p1S8OzsJy+nrTqvk3qlMGZwFgC1bQAWDzvai6VPXS0UFYOl+tblh9MQfCAcwcBR0Axjizelj1ktFBWBpfrG5TfWt0EAC2TUEHgLEeXt2y+sDoICysM6s7N13W/pXBWQDYDgUdAMZ7b3Xr6qjquMFZWCw/rW7VdCDc1wdnAWAHFHQAmA2nVDepbl59c3AWFsMrqns0vQAEwBxwijsAzJbPV3esrt904jvsjD+v/nF0CADWRkEHgNnzmZXb96qXZRwbq/Oj6q3VgU0HwgEwZ1ziDgCz69+bxrH9TfXhwVmYXd+tjqyuUD005RxgbinoADDbzqye3HTJ+1Orz46Nw4x5anWnpvFpPx2cBYBd5BJ3AJgfT2m65P2qTZcy7zk0DSM9s3p7xvMBLBQFHQDmyzdXbpet7lM9ovr1oYnYLN+uPlE9qDp+cBYANoBL3AFgPv2welH1G9Vzq1dW3xiaiI1yYtN/3+s3Xc6unAMsKCvoADD/Hr3y9qrVtaorV385Lg7r5OVNl7B/tXr/4CwAbAIFHQAWx2c7+xC511bPqG5aXai64KhQrNrp1QnVMU2XsX+pOmNoIgA2lYIOAIvpC9Xdqt2qGzad9l3TTPWrjwrFNv130wnsL6te13RyPwBLSEEHgMV2ZtNl0rdceXzR6oCV+08ekoiqA6tTVu4/rWn1HIAlp6ADwHL5SfXXK/ffWV1k5f7zcxr8RvtI9aSmy9bfOzgLADNIQQeA5fWhLe5fu7rAyv2z9q6f5dc2LdFi+NLK27P2kp/l5OqkzY8DwLxQ0AGAmvZA/3Tl/h9u9b4nVfts8Xiv6h6bEWoOvK76+RaPP1H946AsAMw5BR0A2JGnb+O539/Gc39R/fYGZxnpZZ3zqoPTq38dEwWARaSgAwA742XbeO7Q6pLn8fFPr26+hs+/Z2fvj99VP1zDxz65es95vM/YMwA2lIIOAKyXY1du23KPavc1fK59qxftcqL6cNMl+qulgAMwjIIOAGyWtZTfL1W32KggADCL1vJKNsAsOG10AAAA2AgKOjBvLlNdeHQIAObSodVuo0Ns5UKjAwCzQ0EH5s2fVr81OgQAc+eanXNc4Cz4bvXB0SGA2aGgA/PoKaMDADBXrlUdVl16dJCtfKZ6y+gQwOxQ0IF5dPvqy9VBo4MAMNMuVF29emd12cFZtuX8owMAs8Up7sC82rc6oDq9OiSXCAJwTpeu3t50aTvAXLCCDsy7x1X/VT25us7gLADMhr+q3pZyDswZBR1YjYNHB1iFpzb9MXb10UEAGObR1fuqp1XXGxsFYO1c4g6sxhdGB1ily1YfqL5U3bc6pukSeAAW2y2qN1aXHB1kDX5c3X10CGC2WEEHVuMXRwdYg4tUv1t9sXpptf/YOABsoH2qB1ZHNF/lvOrM6kejQwCzRUEHVuO1TYV33jy4aUXlUYNzALD+XlYdXr2y2mNwlp1xofwtDmzFDwVgNT5efX90iF3wd9XnqltVew3OAsCuOahpK9NDq6sMzrIr7lmdMToEMFsUdGC1PlqdNjrELvit6sjqs9XNmy6FB2B+3LB6VtOIzXku5mc5ZnQAYPYo6MBqPar6yegQ6+CK1XurN1TnHxsFgFW4TtPYtA80jdZcBIdXx48OAcwep7gDq7V7tdvoEOvoDtVR1X9Wjx2cBYBtu0Z1SHWZ0UHW2cHVsaNDALPHCjqwWmdUdxkdYp1dt3pMdVzTWDYAxtuj2rf6WNMLqYtWzk+oTh0dAphNVtCBtfhy9aHq+qODrLNLNZ1Uf4nqI02H4gGw+e5V3b560OggG+jI6k2jQwCzyQo6sBbfrV44OsQGekF1WPWS6uKDswAsm0c2nQ+yyOX8+9U/jQ4BzC4FHVirw5te/V9Ul63+oPpk9ar8nATYSHs1jcD8XPXcwVk2w/9W7xucAZhhLnEH1uqH1burG1UXGpxlI11p5XZG9crqP8bGAVgoe1XXrl5R/ergLJvpjqMDALPNyhCwMw6sfjQ6xCZ5UNNYtmdWtx2cBWARnL96Y9PP1mUq5we3GONKgQ2koAM76w9GB9hkj6/eXB1RXWFwFoB5dWDTyey3Gx1kgOdVJ40OAcw2l7gDO+vdTTNcLz06yCbaq7p19cGmPZPfzB9bVXerHjw6BDCzrlDdpKmgXmpwlhFOqv62+vToIMDss4IO7KyfVzesvjo6yACXr77YdInmAwZnmQU/ry44OgQwk65ZfaZ6TctZzqu+UD2j6WclwHYp6MCuOKbpwJujRwcZ5A5NJ70fODrIQL9UPWp0iPOwyIcYwqy7RNPIysNX7i+zp4wOAMwPBR3YVV+oPjs6xGCPaRoRdP/qYoOzbLY9q1uMDrENJ1X3Hh0CltDuTS9cfrLprJLLjI0z1KlNe+0PGx0EmB8KOrAe7t106M8y+63q1dU3qpu1PHvzrz86wHk4o/ry6BCwZG5avbxp688Vx0YZ7uTq7tU7RwcB5ouCDqyH05pGkB05OsgMuHjTzPRDWo79lv86OsB27Dk6ACyJ/apnVe9rGk257H7Q9MK1lXNgzRR0YL2cXN2zaa4tdd3qPdXLRgfZQE9rmmcMLKf/07RC/KbqcYOzzJJjq0NHhwDmk4IOrKcTmg5Oe//oIDPiatVDq+OqR1d7j42zrh5e/VVWqWEZXbj6taaRk7dtGkHJ9EL10dXtRwcB5peCDqy3U5pmhC/7nvQtXap6TtOp9zcbG2VdnL9pHvws26vabXQIWED3b1ox/2J1ucFZZsnPqvtUV6n+d2wUYJ4p6MBGOK1pBeGI0UFmzG5NI4deUl1pcJZd8dam7Qyz7MlNJygD6+OBTbPMX50V4q2dWd2l6ewRgF2ioAMb5adNJe4/qhMHZ5klF24aPXRU9fbmaw/3+Zr2Vd5hdJBVeE3TSe7Arrlo06r5y6r7Dc4yi05rGqX2rtFBgMWgoAMb6SdNM7Kv2jR+jLNdrumPukOaRhPNugs2XdZ6x9FBVuniowPAnLt0dfPqm02r5ucbG2cmvb+6W8o5sI4UdGAzfK1pDM8zmlYbONt+TaOJ/qlp/+Is2qN6XXXX0UHWYI/RAWCOPbF6W9NUDi92bdsTms4UMUoNWFcKOrBZvlD9ZfNxefQI/7c6uGlk0e8OzrK1tzVf5fwF1ZdHh4A59drqb6vrjQ4yow7u7LnvAOtOQQc22xHVZZpWaI4ZnGXW7NY0suj91cerfRq7ErxP0yX48/aiyiebtlcAq3Ol6pHV96r7Ds4yq75QXbZ6UC5pBzaQgg6McGz1zGrfpn3NnNNeTavoRzcdzLT/Jn/92zatoB1d3WmTv/Z6+IXRAWCO3KL6SvXcpn3nnNP3mw6dvHHTCxi2aQEbyoEfwGj3qh5e/VF1jcFZZtGDVm4vbTqV/NnVVzfoa12t6VL7hzW/M8Q/Vr1jdAiYA3tXj6se0Pz+732jPbr6YPXh0UGA5aGgA7PgX5pma1+laU74xfIH49b+YOXtHaofrtw/sLPn7v6ktY8V2/Lwp0OqX2/+V9D+p/r86BAwwy5evb5pusblBmeZVc9runrpc6ODAMtHQQdmxXErt0tWD25aMebcLtfZf1S/qjp95f7BTX9QrtaFq3/v7D3ui3Lq+S+NDgAz7KCmveaL8r/39fbJpjNAHjk6CLC8FHRg1pzeVDRPbdrz9wfb//Cld9Yf2g9YuS2zH1evHB0CZtB9qhs1bWHh3L7adFXB06qfDc4CLDkFHZhVr1q5vbk6oLrV2DjMgR9UbxgdAmbI71bPqG6TbUPnZf/qU5kqAswIBR2Yde9quuTwck2H9cz7Hmk2zjyeOA8b4Req9zRNythrcJZZdUz159XbRwcB2JIxa8A8OKVpDNCNmsbdnDI2DjPq+NEBYAbcv+mFzWuknG/L26vHN714oZwDM8cKOjBPjm7aZ/3q6gbVX4+Nwwx5QXXC6BAw0KOaXsS82+ggM+zg6n6jQwBsjxV0YB4dUT2laUzQwWOjMAN+1vR9cNLoIDDAbarPVn+Xcr4tp1Sfafp98eCxUQB2zAo6MM8+17QacmZ1zaY53iyff6o+NDoEbLIrVler3jY4xyw7qnp09fHqjMFZAFbFCjqwCO5f3bTptGL7kJfPBZtepIFlcMHqidWRKefb8+DqJtVHU86BOWIFHVgUx1Z/2TSW7ajqImPjsEmOrp4/OgRskt2aDja7+eggM+x51aHVe0cHAdgZVtCBRfPJ6lerh2au7TL4WPWl0SFgg+1TPaf6Xsr5thzbNFbuMtUjU86BOWYFHVhEP6hesXI7sLpedeOhidgIb63uOzoEbKBrVtdtmlLAtn21um1ekAUWhIIOLLrHNl3u/pam045ZHAeMDgAb6LrVIdWlRweZYX/YtKVJOQcWhoIOLIMTq3tWV6oOry6bn3/z7sDqO6NDwDrbrbpE0z7zfatLjo0zk06o/rZpn/kXBmcBWHf2oAPL4idNs3CvWN2ladWF+fSz6v3VyaODwDq6cfWv1XFN23KU83N7Y9O/y4Ep58CCUtCBZXN60+rUTarHD87C2v24ul/Tf0NYFI+u/rN6YLXH4Cyz6GPVM6t7V6cNzgKwoVziCSyzZ1efbpqjfr/BWVid46t/Gx0C1sntqkdU+40OMqPO2p706WxpAZaEFXRg2b2zenDTvvT/GRuFHfhBU6GBeXbh6teqrzRNIlDOz+30pn+fmzT9jFbOgaVB3dIkAAAQnUlEQVShoANMl0x+r2kP6MFNe0CZLd+sbpqZ58y3i1Rvqr5Y7V1dYGycmfRv1cObZr9/YnAWgE3nEneAsx3fdKn79aobVs8ZG4cVX6vuWn1+dBDYBU9t+rlyy9FBZtQRTeMw/3l0EICRFHSAc/vwyu2I6iHVI8fGWXpfaDqBH+bRA5sOgbva6CAz6qSmn7f3bJq2AbDUFHSA8/bZ6lFNs4lvWl1jbJyl9JHq7qNDwE74zeo61StGB5lRJzZdwv6gpqtkAEhBB1iNRzbtFf3r6l7VlcfGWRrvr+7UNPcc5sWlq99vWjU3y3zb/qF6d3XY6CAAs0ZBB1idn1VPrF7etJL+xrFxFt5R1d1yySvz5eXVtaqrjg4ywx7fNOISgG1Q0AHW5piV2+2r52c1fb39oOk0/a837U2FeXDlpkPg7jc6yIz6VtOLbn/RNDEDgPOgoAPsnHc0jQF6bHWzzOdeD99oeuHjC6ODwCrdrLpB9beDc8yq46ojqz9rmpIBwA6Ygw6waw5sKpV/nJm9u+I71R0zSo35cOXqRU0v1Cnn2/bj6s5NVxUo5wCrZAUdYH28uPq3at/q8KYXQC82NNF8OL3p4L2PNa2gwyw7f3W5pgMMLzc4y6w6oXpE9YHqK4OzAMwdK+gA6+e46oPVL1WXqp5XfWpootn2gere1VtSzpl9N2o6dfyYlPPz8rymn32vTDkH2ClW0AHW32krbx/ZtOL21Gr/pj3rTJ7S9O8Cs+4+TeX8/44OMsOOqP4zl/sD7DIFHWBjnZrxbFv6t6Z/i7ePDgKr8KDqX0eHmGH/r/rDphPajUQEWAcKOsDmOGs822Wq3ZouBb1xy3Gp7E+q/2066f7YphctYFb9QtPVLoc2Xa7NuZ1c3aP6UPWjwVkAFoqCDrC5jl15+3tNReCFK4/vMybOhjqkaZb5P1fvGxsFVuWyTfvMrzk6yAx7fXVw0wn2AKwzBR1gnB82FfWqNzcdLneXar9hiXbdt6u/Wbn/4pFBYI2eV90w5fy8vKZppvmrRgcBWGQKOsBs+LeVt6+t9q4uX71u5bndqr1GhFqFE6szqudUb2u63PXrQxPB6l20+pPqvtXVBmeZVZ+r7l/9T7anAGw4BR1gtvyk+vTK7ZIrz12kqfyeNRrzRgNyneWz1Y+3eHyPpisB/OHOvLlV02GF5x8dZEYdV32hulPTbHMANoGCDjC7ziq9P6puusXzf9m08neWvZvGuK2nE6oXbeP5v2laNYd5dZXqbtXT83fQeXl20xkSHxwdBGDZ+MUEMH+2njW8e+s/Cup71cfX+XPCSLtVb2oad7j34Cyz6u+arip47+ggAMtKQQeYf2dkrjhsz3Oa9lFfZnSQGfX16t+rA0YHAVh2CjoAsKjuUN2ietToIDPqmOoj1QObXugDYDAFHQBYNNetHlT98eggM+x/mw6A++LgHABsQUEHABbFBarfqg7v7CkInNNPqvtUn6n+3+AsAGxFQQcA5t0e1fWrf6qu2tkjCTnbR6q3Vs/NWESAmaWgAwDz7OFNYwjvOzrIDHtD06o5ADNOQQcA5tXjq2eODjHDPlk9qXrn6CAArI6CDgDMk0tXv1u9orrs4Cyz6PSmsWn3rr7UtOccgDmhoAOwLLa8xPe71fsG5WDnXKTp1PFnVb86OMsse1jTixcAzCEFHYBF97Dq5tXvbfHcz6qXNx2YdcyIUKzJHtXbqluODjLD/qH6QPXm0UEA2HkKOgCL6nrVi6vf2cb7LtA0I/vO1eeaVmadbD17Llo9rdqv+vXBWWbRydV/VQdUnx6cBYB1oKADsGh+ufrNplnYF9jBx15u5XZ49ZTqgxuajNX6jeq61b9U5x+cZVZ9o+n0+q9XZw7OAsA6MScUgEXyuOrt1bvbcTnf0q2bViJfkHFUo12v6VLtV6Scb8vPq2c3fc/+b8o5wEKxgg7AIvirpv3JN93Fz/MnK7f7VU+tPraLn4/Vu3j1muo61S8OzjKrHl8dlSs9ABaWgg7AvLpsU5n759Z/3NYdq5s1lf6jqx+u8+fnbOerXlndprrU4Cyz6qtN3+cHjg4CwMZS0AGYNxdvOjTs75v2m2+UvaqPVB+vDqresIFfa1ndvbprdd/RQWbUp5q+B/9odBAANoeCDsA8eUZ1w+omm/g1r1m9vqlI/t4OPpbVuWPTyfkPHx1kRv2w+svqrdV3B2cBYBMp6ADMsgs0HRT2e017w68+MMt9mk6Hf231wuqnA7PMqytUh1T7VhcZnGUWnVmdUN08Y9MAlpJT3AGYRXtWN6g+WR3fNG5rZDk/y9WaTtA+vrrV4Czz5KJN/z0/1PTfUTk/t/+qHlr9Uso5wNKygg7ALLlT9evVtav9B2fZnvNX76ie2LQi/KWxcWbaX1S3bTo3gHM7svrP6umjgwAwnoIOwGh7Vm+s9mia7byW+eUjna/pVO0/alrp3z8zqbf00Oqe1e1GB5lh72r6N7JdAoBKQQdgjMs3FbenNm23uszYOLtk75XbkdUfVP87NM14v9J0+f+/NL3owjmdXH2r6fv/WyuPAaBS0AHYPOer7rFy/xXVhQZm2Qi3rL5WPbd6T/X2sXE23S83na7/kqY955zbG6rXVIeNDgLAbFLQAdgMj28aj3bH0UE2waNWbg+p/nVslE3z99WNm0bSsW2PqZ4zOgQAs80p7gBspPNVf109s+Uo51t6adPe9Gs2P/vq12qv6uCmg+CU83M7sWks3zVSzgFYBSvoAGyku1dPGR1ikD2aRor9d/XZppPMvzc00fq5RtOBfk9vOtGec/tcdaPqx6ODADA/rKADsJEWbZ/5zti9+p3q0KbLnOfdftXHmubBK+fn9v3qoOoWKecArJEVdAA20pHVOzMDu6bZ7tduOr37XU0Fd55cqfrHpuLpBf5te1j10erTo4MAMJ/8ggVgI327ulv13tFBZsjNq2c1/dvcZnCW1bhi9e7q403nCFx4aJrZ9Nym8XIvTTkHYBco6ABstFOa9iv/x+ggM+aXm1bS719dZXCW8/LcptFxt6x+YXCWWXRU05UQj66+MzgLAAtAQQdgM5zRtPr6p02Fj7O9ujq8+qdmZ0/3g6tXVY8cnGNWfa3pe/m2TSMEAWBd2IMOwGY5qXpBdUj1gaZLgv0emuyzcvut6k7VTwdkuEB11eol1dXyIv62nFbdpelU/m8OzgLAAvLLF4DN9s2mMnqn6kODs8yam1U/aJqZfZ1N/LqXqT5SfbhpNJy/D87tQ03fs29POQdgg/gFDMAIpzad7n6DFmP02Hras2lP80eqB2zC13tMdVjTKLg9NuHrzZs3Vo9o+l595+AsACw4BR2A0Z7TtD/91aODzKBXNW0JuPYGfO7HVe+pDqyutQGff959orpzde/q+YOzALAkFHQAZsHh1UOa9qV/bnCWWXOnpjF1n6wusQ6fb7+mEW/Papppzjn9uGmk3M2qQ8dGAWDZKOgAzIrTm0ZV3aR6U3Xs2DgzZa+mveHvqfbfyc9xlep+1TuaRrxxbm9qGgl4reong7MAsIScngvArPlhda+mQ9Ju3HQJPJPfbdoT/e9NM7ifu4r/mz1XPm6/6sobF23u3b967egQACw3BR2AWfXfK7f3NK38HjA2zky568ptz6b90Seex8ddpOkAuJttTqy5c2L1oqZi/qnBWQBAQQdg5n1q5bZ7dcum08aZPLN6atMVB1tvCbhn9adNJZ5z+kb1meoe1c8HZwGA/5+CDsC8eHTT761nNq0e7zM2zszYs+mSd1bnmOr21dGjgwDA1hwSB8A8Oa1pbvftmlZBYS3u3fS9o5wDMJMUdADm0THVNZoOPvv64CzMtq9Xj20a4ffGpu8dAJhJCjoA8+r46l3VFZsKGGztdU3fHwc1jfADgJlmDzoAi+Cg6nvVraoHDM7CeP9dvap6weggALAWVtABWBSvqh5aXbP69OAsbL4zqx9VN6rukHIOwBxS0AFYJKdVn2gqaf9ZHTc2Dpvk9OrB1WWq/6q+PzQNAOwkBR2ARfTT6qbVnavnDM7CxnpZ9ZCmKyjMNAdgrtmDDsAi+/DK7ZPVawdnYX29s3phdejoIACwXqygA7AMDq4uVz23+ubgLOya71dHVHdPOQdgwSjoACyLb1ePrv5P0/gt87Dny0nVm6prV7etTh4bBwDWn0vcAVhG962uUr2j2ntwFnbsqdUHm1bOAWBhKegALKsvVzerfrtpZfYiQ9OwLSdWT27amgAAC88l7gAss282raJfsnr84Cyc7cvVq5v+uyjnACwNK+gAUD+rnt20z/nG1f5j4yyt46pXVs+qfjA4CwBsOivoAHC251f3qu5afWJwlmVzQnWb6jEp5wAsKQUdAM7tbdXNq49XPx6cZdF9vXpAtW/1qcFZAGAoBR0Atu2E6lrVras3D86yiD5QHVhdsXpNdezQNAAwA+xBB4Dt+2jTnvT7Vq8dnGVRvKO6e3XK6CAAMEusoAPA6hxc/W71nKbD5Fib06tvNF2VcK+UcwA4FwUdAFbvk02HmP1idXhT4WTHflrdodqnaV//T8fGAYDZpKADwNr9rLpjdcvq6MFZZt3zq3tX76pOHZwFAGaaPegAsPOOqW7fdOn7GwZnmTWvbDpc77DRQQBgXijoALBrjlm5faDpILmDxsYZ7rPV7arvNu07BwBWSUEHgPXx7aYD5KpuVd12YJYRvlcdVf1+04g6AGCN7EEHgPX1nGq/6hHVRwZn2SwHVHdqGkennAPATrKCDgAb4/nV65sOR/vt6vxj42yIg6rXNZ1uDwDsIgUdADbOcdV1qqtWL6yuXe0xNNH6+HT17uqxo4MAwCJxiTsAbKzTmlaYr189ZHCWXfXl6rnVNZsuawcA1pEVdADYPK+uvlPdpnrM4CxrcWZ1n+rj1VcGZwGAhWUFHQA211mXhl++OrL6/tg4O/SNphcU3phyDgAbSkEHgDG+1VR8r1W9uTpxbJxzeVfTKv+vNr2oAABsMJe4A8BYX28aT3br6kbVkwdm+UH1tJX7/zgwBwAsJQUdAGbDkSu3Q1Ye/0v169WFqt026GueUp3RNBLuTdWPq2M26GsBADugoAPAbPn4ytvrNv2e3r/60y3e/5vVXjv5ub9c/WiLx/tXxzYVdQBgMAUdAGbTaSu3g6v3bfH8XzQV653xZ9UXtnj8zZ38PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACz5v8DVl63Mj73zDAAAAAASUVORK5CYII="/> + +// <image id="image3_19_150" width="2048" height="2048" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAACAAAAAgACAMAAACFeSMCAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAC+lBMVEVRK9SIbuH///+FauH+/v/v6/tZNNbd1fexoOyzouzq5fqunOv8/P5yVNzb0/ZTLdWahOb18/1jQdnGuvGGbOHr5vpZNdb9/f50Vd3f2PdULtWdiOf39v1nRtnNwfOJb+Lu6vtcONe1pO3+/f94Wt7g2vdUL9WhjOj49/1oR9rOw/OMc+NdOde5qe55XN7i2/hVMNWkkOn6+f5sS9vTyvRSLNSQd+Tx7vxfPNe8ru5+Yt/l3/lWMtWoleltTdvVy/WTfOTz8PxgPdjAsu9/ZN/m4flXMtarmer7+v5uT9vZ0fZSLdSXgOX18/xjQdjDtvCuneuyoey1pe2vnuuxn+xmRdnWzfWXgeXy7/xxUtyOdePNwvOGa+F9YN/r5/qReeSplurCtPBaNtbXz/W4qe3o4/luTtv5+P3VzPVbN9eKcOJsTNvi3Ph3Wd2YgeachuekkOhYM9bw7fulkem7re7Hu/GnlOnv7Pve1/e5qu7n4vl6Xd6NdOPc1faAZOBbN9bQxvPRxvRqStprS9pzVdx7Xt6McuJ8X99/Y9+DaeDp5PrUy/SCZ+CVfuXCtfCfiueUfOXRx/T6+P6smuumkul2WN26q+62pu2+sO/s6PqEaeHIvPFiQNj08vyZgubXzvXZ0Paql+pkQtna0vZWMdXj3fh7X96HbeG7rO7e1vft6fvKvvJlRNn39f1oRtrk3vjY0PVwUdz8+/59Yd9eO9fx7vvt6frPxPOjj+h1V92zo+zk3/jo5PlqSdrEt/BhP9jz8fyWf+VfPNjSyPTIvPKbheZvUNusmuq9ru9dOteOduPLwPKfi+eBZuCijej29P2dh+dwUNyoleq/se+QeOTPxfN0Vt2DaOBhPtimk+m3qO2eiefKv/Kwn+vBs/CTe+TGufHAs++LcuLJvfKtm+vMwfKVfeW3p+2Zg+aqmOqSeuS0pOzFuPF3Wt15W96bhuaKceKPd+O9r++gi+iijuhlQ9nTyfTm4PlpSNqIbuLc1Pbg2ffh2viBZeBlDZ11AAAAAWJLR0QCZgt8ZAAAAAd0SU1FB+YHCw0zGmg5BjcAADAiSURBVHja7d2Lu5Z1mejxZ15XONKCBTqCLFFkliB4SASXouABESSWoOIhEcVCDWWk0jI842HSdGcpjZUlmg5mmnhA1MzjaJqMecxG02amzJmx0Wp32jPtaV/XNk0F5LDAdb/vjb/P5w947odXn/v9Xj/WeqgqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALrSX9TqYL3SP+WmLv9I31f3P0O3Giuyfqc/wb/0YTXUBtY9NCAAuncTAAJAAPiwBAAUFwC19wsAASAAfFgCAMoLgOYeAkAACAAEABQXALWeLQJAAAgABAAUFwC1XgJAAAgABACUFwC9NxQAAkAAIACguACobSQABIAAQABAeQFQ+ysBIAAEAAIAyguAjfsIAAEgABAAUFwA1P5SAAgAAYAAgPICoO8mAkAACAAEABQXALV+rQJAAAgABAAUFwC1TQWAABAACAAoLwD6byYABIAAQABAcQFQ21wACAABgACA8gKgNkAACAABgACA8gJgi4ECQAAIAAQAFBcAtb8WAAJAACAAoLwAaNtSAAgAAYAAgOICoDZosAAQAAIAAQDFBUBtKwEgAAQAAgDKC4AhQwWAABAACAAoLgBqWwsAASAAEABQXgDUthEAAkAAIACgvAB437YCQAAIAAQAFBcAte0EgAAQAAgAKC8A2j4gAASAAEAAQHEBUNt+mAAQAAIAAQDFBUBtBwEgAAQAAgDKC4DhIwSAABAACAAoLgBqO7YLAAEgABAAUFwA1HYSAAJAACAAoLwA2HmkABAAAgABAMUFQG0XASAABAACAMoLgKZdBYAAEAAIACguAGqjRgsAASAAEABQXADUdhMAAkAAIACgvAAYvrsAEAACAAEAxQVAbY9SXgYgAASAABAAIACWsqcAEAACAAEA5QXAmL0EgAAQAAgAKC4AamMFgAAQAAgAKC8AansLAAEgABAAUF4AjBsvAASAAEAAQHEBUNtHAAgAAYAAgPICYMIHBYAAEAAIACguAGoTOwSAABAACAAoLgBq+woAASAAEABQXgBMmiwABIAAQABAcQFQ208ACAABgACA8gKgtp4AEAACAAEA5QVA924CQAAIAAQAFBcAtf0FgAAQAAgAKC8AmnsIAAEgABAAUFwA1Hq2CAABIAAQAFBcANR6CQABIAAQAFBeAPTeUAAIAAGAAIDiAqC2kQAQAAIAAQDlBUDtrwSAABAACAAoLwA27iMABIAAQABAcQFQO0AACAABgACA8gKg7yYCQAAIAAQAFBcAtX6tAkAACAAEABQXALVNBYAAEAAIACgvAIZsJgAEgABAAEBxAVDbXAAIAAGAAIDyAqA2QAAIAAGAAIDyAmCLgQJAAAgABAAUFwC1KQJAAAgABACUFwBtWwoAASAAEABQXADUBg0WAAJAACAAoLgAqG0lAASAAEAAQHkBMGSoABAAAgABAMUFQG1rAVBQADSv6yZ2+hM8MOPtN4X8V23L+Ec9yLqH9AFQ20YAlBMAB3sGG+qQkP+qH/LBggBYuy+3bQWAAEAAAMUFQG07ASAAEABAeQHQ9gEBIAAQAEBxAVDbfpgAEAAIAKC4AKjtIAAEAAIAKC8Aho8QAAIAAQAUFwC1HdsFgABAAADFBUBtJwEgABAAQHkBcOhIASAAEABAcQFQ20UACAAEAFBeADTtKgAEAAIAKC4AaqNGCwABgAAAiguA2m4CQAAgAIDyAmDC7gJAACAAgOICoLbHe+VlAAJAAAgAQACsgT0FgABAAADlBcCYvQSAAEAAAMUFQG2sABAACACgvACo7S0ABAACACgvAMaNFwACAAEAFBcAtX0EgABAAADlBUDzVAEgABAAQHEBUJvYIQAEAAIAKC4AavsKAAGAAADKC4BJkwWAAEAAAMUFQG0/ASAAEABAeQFQW08ACAAEAFBeAHTvJgAEAAIAKC4AavsLAAGAAADKC4DmHgJAACAAgOICoNazRQAIAAQAUFwA1HoJAAGAAADKC4DeGwoAAYAAAIoLgNpGAkAAIACAvAFw2N7TYr4pDhcAAgABAKQNgA9UR8R8U0zvIwAEAAIAyBoAR1bVoJivigMEgABAAABZA+DDVdUr5qui7yYCQAAgAICkAfCRqprRO+a7ol+rABAACAAgZwAc9dpFjw76TYBNBYAAQAAAOQPgmNcu+tGmmC+LIZsJAAGAAABSBsDMP1312KAjgM0FgABAAAApA6B23GtXnRX1OqBZAkAAIACAlAHwN69dteP4oADYYqAAEAAIACBjABzxp8vuGXUEMEUACAAEAJAxALb502UHbxwUAG2zBYAAQAAACQPgY69f9+NRRwCDBgsAAYAAAPIFwCdev+4JJ0YVwFYCQAAgAIB8AXDgGxf+ZFQADBkqAAQAAgBIFwCfeuPCA3tHFcA0ASAAEABAugA46c9X/nRUALzxY4YCQAAgAIBMAbDjn6/c531RATBnWwEgABAAQLIAOPnNS/cKOwI4RQAIAAQAkCwATn3z0oPHRQVA22kCQAAgAIBcATDnrWufHnYEsP0wASAAEABAqgDo/9a1288IK4AdBIAAQAAAqQKgqeWti58ZFgDDRwgAAYAAADIFQG3u21c/K6wAzhYAAgABAKQKgMlvX/2c4WEFsJMAEAAIACBTAJy71OX3DwuAQ0cKAAGAAAASBcDfLnX5E7qHFcAuAkAAIACARAHwmaWvf15YADSdLwAEAAIAyBMAn11mwNZhBTBqtAAQAAgAIE0AXLDMgMCfA9xNAAgABACQJgD+YtkJ7w8LgAm7CwABgAAAsgTAcv9ab7cLwwrgf7ULAAGAAACSBMCRy434XFgA1PYUAAIAAQAkCYCLlp/x+bAAGLOXABAACAAgRwD0Wn7GyJ3DCmCsABAACAAgRwB84R1DLo77S4AzBYAAQAAAKQLgE+8Y0n5JWACMGy8ABAACAMgQACv49fxz5oUVwD4CQAAgAIAMAfDFFYz5u7AAaJ4qAAQAAgBIEAAHrWBM68lhBTCxQwAIAAQA0PgAmLKiOZf2DSuAfQWAAEAAAI0PgC+tcNCXwwJg0mQBIAAQAEDDA+ArKxw097KwAthPAAgABADQ8ABYyffxV+NeBrCeABAACACg0QHwtZWMOiksALp3EwACAAEANDgANl/JqMvnhxXA/gJAACAAgAYHwNkrm3VF3MsAeggAAYAAABobAMeubFbHlaW+DEAACAABALz3A+ColQ4bMTysAHoJAAGAAAAaGgBfX/m0q8ICoPfVAkAAIACARgbA36982oJrwgpgIwEgABAAQCMDoOcqxn2jKawArhUAAgABADQwAM5Y1bxvhgXA9D4CQAAgAIDGBcB1q5p33PVhBXCAABAACACgcQHQb5UDtwkLgL6bCAABgAAAGhYAg1Y98VthBdCvVQAIAAQA0KgA2H7VE29YGFYAmwoAAYAAABoVAMevZuSmYQEw5EYBIAAQAECDAuCm1YzsuDmsAKYJAAGAAAAaFACjVjfzlkVhBTBAAAgABADQmAAYt9qh+4cFwBYDBYAAQAAADQmAY1Y7dPypYQUwRQAIAAQA0JAAuHD1U28NeyNw25YCQAAgAIBGBED3TowdG3YEMGiwABAACACgAQEwvRNjF98WVgBbCQABgAAAGhAAt3dm7pFxLwMYKgAEAAIAqH8AbNGpwWeFFcAdAkAAIACA+gfAnE4N3qx/WAFsIwAEAAIAqHsA3Na5yd8OC4A52woAAYAAAOodADt3bnLrdWEFsJ0AEAAIAKDeATCmk6Pv7Bv2MoDTBIAAQAAAdQ6A+Z2d/Z2wI4C7FggAAYAAAOobAL07/ZVyd1gB7CAABAACAKhvACzs9PD1wgJg3j0CQAAgAICkAVDdG1YAO7YLAAGAAACSBsB994cVwE4CQAAgAICkAVD9Q1gAHPqAABAACAAgaQC0PxhWALsIAAGAAACSBkB17ryoAGjaVQAIAAQAkDQAqt3CjgBGjRYAAgABACQNgGHbhxXAbgJAACAAgKQBUM1uiwqACbsLAAGAAACSBkB1dNgRwB5ZXgYgAASAAAAEwPLm3h5WAHsKAAGAAACSBkA1KywAxuwlAAQAAgBIGgDVd8MKYKwAEAAIACBrAEyeFFYAZwoAAYAAAJIGQPVQWACMGy8ABAACAEgaAB1HhRXAPgJAACAAgKQBUD28KCoAmqcKAAGAAACSBkD1vbAjgIkdAkAAIACApAGw4KawAthXAAgABACQNACq85uiAmDSZAEgABAAQNIAqB4JOwLYTwAIAAQAkDUAlpwYVgDrCQABgAAAkgZA9Y9hAdC9jwAQAAgAIGkAVI+GFcD+AkAAIACArAFw8MKwlwH0EAACAAEAJA2A6vthRwA9WwSAAEAAAEkDoOWMsALoJQAEAAIASBoA1dRFUQHQ+2oBIAAQAEDSAKgOCjsC2EgACAAEAJA1AE44JqwArhUAAgABACQNgOqxsACYPkMACAAEAJA0AKqPhBXAAQJAACAAgKwBMHLnqADou4kAEAAIACBpAFR7hh0B9GsVAAIAAQAkDYD2s8MKYFMBIAAQAEDSAKjOmRkVAENuFAACAAEAJA2AaoewI4BpAkAAIACArAHQenJYAQwQAAIAAQAkDYDq0r5RAbDFQAEgABAAQNIAqKaEHQFMEQACAAEAZA2AGdOjAqBtSwEgABAAQNIAqC4IOwIYNFgACAAEAJA0AKqNwgrgcQGQKQA+NGBd00MACAAQAIEBcN/8sJcBDBUAiQJg3XOKABAAIAACA6D6WNgCv0MACAABIABAAGQNgI5Dwjb4NgJAAAgAAQACIGkAVCOGR23wOdsKAAEgAAQACICkAVB9OGyFbycABIAAEAAgALIGwILjo1Z422kCQAAIAAEAAiBpAFSfaYra4XctEAACQAAIABAASQOg+lLYEv+kABAAAkAAgADIGgDH3R61xIePEAACQAAIABAASQOgOi9si+/YLgAEgAAQACAAkgZA9a2wNb6TABAAAkAAgADIGgA3PBG1xg99QAAIAAEgAEAAJA2A6smwPb6LABAAAkAAgADIGgAdN0ft8aZdBYAAEAACAARA0gConloUtchHjRYAAkAACAAQAEkDoHp/2CZ/WgAIAAEgAEAAZA2A8eOiNvmE3QWAABAAAgAEQNIAqI4IeyPwHvV6GYAAEAACABAAa+wHYbv8YgEgAASAAAABkDUAFp8YtcvH7CUABIAAEAAgAJIGQPVM2DIfKwAEgAAQACAAsgZA9cOwbX6mABAAAkAAgADIGgCb9Y/a5uPGCwABIAAEAAiApAFQPR62zvcRAAJAAAgAEABZA6B1/ah13jxVAAgAASAAQAAkDYDqn/pG7fOJHQJAAAgAAQACIGkAVBuELfQ6LCsBIAAEACAA1s4Jd0ct9EmTBYAAEAACAARA0gCong3b6PsJAAEgAAQACICsAVDdG7bS1xMAAkAACAAQAFkD4Ln7o1Z69z4CQAAIAAEAAiBpAFQXhe30/QWAABAAAgAEQNYAaH8waqc39xAAAkAACAAQAEkDoDp3XtRS79kiAASAABAAIACSBkD1o7Ct/pAAEAACQACAAMgaAMO2j9rqva8WAAJAAAgAEABJA6Ca3Ra11k8SAAJAAAgAEABZA6B6PmyvXysABIAAEAAgALIGwNzLovb69BkCQAAIAAEAAiBpAFQDwhb7AQJAAAgAAQACIGsAVN+NWuxtswWAABAAAgAEQNYAuHx+1Gbv1yoABIAAEAAgAJIGQNUrbLW/IAAEgAAQACAAsgZAx5VRq33IjQJAAAgAAQACIGkAVA9PiNrt0wSAABAAAgAEQNYAqPYJW+6zBIAAEAACAARA1gBYcE3Uct9ioAAQAAJAAIAASBoA1flNUdt9igAQAAJAAIAAyBoA1S5R271tSwEgAASAAAABkDUAlsyJWu+DBgsAASAABAAIgKQBUB0Wtt8fFwACQAAIABAAWQOg+nHUfh8yVAAIAAEgAEAAZA2AGxZGLfg7BIAAEAACAARA1gCovhC24U8XAAJAAAgAEABZA6DljKgNP2dbASAABIAAAAGQNACqWxatMyteAAgAAQAIgC7zz1Ervuk0ASAABIAAAAGQNQBOODVqx9+1QAAIAAEgAEAAJA2A6rGwJf9JASAABIAAAAGQNQCqf4la8sNHCAABIAAEAAiArAEw8raoLb9juwAQAAJAAIAASBoA1b+GrflnBIAAEAACAARA1gCozo5a84c+IAAEgAAQACAAsgbAPTOj9vwjAkAACAABAAIgawBUn4ja8027CgABIAAEAAiArAHQel3Uoh81WgAIAAEgAEAAJA2A6s6+UZv+aQEgAASAAAABkDUAqr+O2vQTdhcAAkAACAAQAFkDYMb0qFW/R1e9DEAACAABAAiALndB2K6/WAAIAAEgAEAAZA2A6idRu37MXgJAAAgAAQACIGsA3Hd/1LL/qQAQAAJAAIAAyBoA1YfCtv2ZAkAACAABAAIgawC0HxK17ceNFwACQAAIABAASQOgGjEvat1/TwCEBsC/XrCueVgACAAQAHkCoHo6KgCapwqAyAA42DMoAAAB8C4MOz6qACZ2CAABIAAEAAiApAFQfaYpqgC6YJkJAAEgAAABEOSUqACYNFkACAABIABAAGQNgONujyqAewWAABAAAgAEQNYAqF4M+8Wv9QSAABAAAgAEQNYAqH4WFQDd+wgAASAABAAIgKwBMHlSVAEcKAAEgAAQACAAsgZA9fGwlwH0EAACQAAIABAAWQOg4+aoAujZIgAEgAAQACAAkgZA9dSiqAJ4SAAIAAEgAEAAZA2A6qWoAOh9tQAQAAJAAIAAyBoAC+6KKoCTBIAAEAACAARA1gCojgh7I/C1AkAACAABAAIgawBUX4kKgOkzBIAAEAACAARA1gBYfGJUAWwgAASAABAAIACyBkC1U1QAtM0WAAJAAAgAEABZA6D6t6gC6NcqAASAABAAIACyBsDB/aMK4AUBIAAEgAAAAZA1AKqtogJgyI0CQAAIAAEAAiBrALSuH1UA0wSAABAAAgAEQNYAqKY2RxXALAEgAASAAAABkDUAqgOiAmCLgQJAAAgAAQACIGsAnHBMVAF8WQAIAAEgAEAAZA2A6nNhLwPYUgAIAAEgAEAAZA2Aar+oAhg0WAAIAAEgAEAAZA2AkTtHFcDjAkAACAABAAIgawBU/x4VADOHCgABIAAEAAiArAHQfklUAdwhAASAABAAIACyBkB1zryoAjhdAAgAASAAQABkDYDq76ICYM62AkAACAABAAIgawC09osqgFMEgAAQAAIABEDWAKhmtwUFQNNpAkAACAABAAIgawBU/xF1BHDXAgEgAASAAAABkDUA5l4WVQCfFAACQAAIABAAWQOg+mpUAAwfIQAEgAAQACAAsgZA9bWoAtixXQAIAAEgAEAAZA2Ay+dHFcAzAkAACAABAAIgawBUL0cFwKEPCAABIAAEAAiArAHQcWVUATwiAASAABAAIACyBkD1N8OjXgawqwAQAAJAAIAAyBoA1c+jjgBGjRYAAkAACAAQAFkDYME1UQXwdKfvoU0ACAABAAiAOvtGU1AATNi9s7fQLAAEgAAABEC9fSrqCGCPzr4MYIIAEAACABAA9Xbc9VEFcHEn72CmABAAAgAQAHV3elQAjNmrczfQXwAIAAEACID6+3FUAfy0c/N7CwABIAAAAVB/NyyMKoAzOzV/vgAQAAIAEAAN8EJUAFzYrTPjDxUAAkAAAAKgATq+HlUA3+vM+NsEgAAQAIAAaIRbFgUFQPPUTkyfIwAEgAAABEBDHBh1BDCxY/XDrxcAAkAAAAKgIcafGlUAnVh2lwkAASAAAAHQGLdGvRG49+TVzu4uAASAAAAEQIP8NOoI4N7Vjr5bAAgAAQAIgAZZfFtUARy+utHjBIAAEACAAGiU/4wKgI37rGbyKAEgAAQAIAAa5qyoAjhwNYOvEQACQAAAAqBhNusfFADNPVY9eHsBIAAEACAAGufbUUcAPVtWOXeQABAAAgAQAI3Tel1UATy0yrknCwABIAAAAdBAd/YNCoAnrl7V2PUFgAAQAIAAaKRXoo4ATlrV1J4CQAAIAEAANFK3u6MK4NpVTJ0oAASAAAAEQEOtFxUA02esfOiVAkAACABAADTWq1EFsMHKZ14iAASAAAAEQGPdd39QALTNXunMRwWAABAAgABosH2jjgD6tdbv1EEAIAAAAbBm2h+MKoAXVjZyrAAQAAIAEACNdu68oAAYcuNKJp4iAASAAAAEQMPtFnUEMG0lA78jAASAAAAEQMMNOz6qAGateOBLAkAACABAADTeL9qCAuB9A+t05CAAEACAAFhz20UdAXx5heMeFwACQAAAAiCBubdHvQzglysa9ysBIAAEACAAMvjfUUcAgwavYNpFAkAACABAAKTws6gCeHwFw34tAASAAAAEQAqTJwUFwMyh7xw2QAAIAAEACIAcfhV1BHDHO2ddIAAEgAAABEAOHV+PKoDD3jHrCAEgAAQAIACSeGpRUADM2Xb5Ub8QAAJAAAACIIsvRh0BfHP5SVMFgAAQAIAAyGLBTUEB0LTrcpPOFQACQAAAAiCN85uCCmDU6GUH3SAABIAAAARAHr+J+kuADy87Z4kAEAACABAAeSw5MSgAJnx0mTmtTQJAAAgAQADk8euoI4CvdywzZ6EAEAACABAAiTwaVQDLrsDbBYAAEACAAEjk4IVBAdB7w6XHHC8ABIAAAARAJr+NOgJ4dekpNwsAASAAAAGQSev6UQVw+FJTpgkAASAAAAGQytTmoADYuM/bQ/YTAAJAAAACIJeDoo4A3v/2jO0EgAAQAIAAyOWEY4ICoPmWt2bsIwAEgAAABEAyn4s6Aji2/c0RTwoAASAAAAGQzeejCuDINyccJgAEgAAABEA2I3cOCoCdF/95wt4CQAAIAEAApHNx1BHA838eMFUACAABAAiAdNovCQqAtl+8MWCyABAAAgAQAPmcMzOoANZvef36g5sEgAAQAIAAyGeHqL8EuOKN6x8qAASAAAAEQD6tJwcFwJg3fg6wnwAQAAIAEAAJXdo3qACmvH75fxMAAkAAAAIgoy8HBUDf198HuJ0AEAACABAAGc24LKgAHvzT1X8kAASAAAAEQEpfjfo5wAGvXXxPASAABAAgAHI6KSgA7h5dVWcKAAEgAAABkNPkSUEF8LuqGioABIAAAARAUlcEBcD8JVXLcAEgAAQAIABy6jgkqABeqqprBIAAEACAAEhqxPCYb7mZV1c/EwACQAAAAiCrq4KOAJ6vDhQAAkAAAAIgqwV3xXzNLfrV5wWAABAAgABI6xtNtXWCAEAAAAKgK31TAAgAASAAQACUFwDHXS8ABIAAEAAgAIoLgGobASAABIAAAAFQXgBU3xIAAkAACAAQAOUFwA1PCAABIAAEAAiA4gKg2lQACAABIABAAJQXAB03CwABIAAEAAiA4gKgumWRABAAAkAAgAAoLgCq/QWAABAAAgAEQHkBMP5UASAABIAAAAFQXABUtzYJAAEgAAQACIDiAqAaKwAEgAAQACAAyguAxScKAAEgAAQACIDiAqA6UgAIAAEgAEAAlBcA1VkCQAAIAAEAAqC8ANisvwAQAAJAAIAAKC4Aqt8JAAEgAAQACIDyAqD1OgEgAASAAAABUFwAVHf2FQACQAAIABAAxQVA9R0BIAAEgAAAAVBeAJxwtwAQAAJAAIAAKC4AqmcFgAAQAAIABEB5AVDdKwAEgAAQACAAyguA++4XAAJAAAgAeLfaf3/ExVc9/8ir0x78P1u/+pvt9vnQ3kNbBUBu/yAABIAAEADwbgx95pRBw9/5oDSP+5eXb2kRAHmj7UEBIAAEgACAtTTs8J9ev6qnpfe0i5YIgKTOnScABIAAEACwFlr2/lQn/h550eZHzhUAKX1aAAgAASAAYI0tOPKmTn9vvnKDAMh4frO9ABAAAkAAwJqZ++T1a/LULHr1TgGQz+w2ASAABIAAgDXQ+uSkNX5wHq33KYAAWL2jBYAAEAACADrviEFr8+QMeXq0AMh2kHO7ABAAAkAAQCfttdbvkPuvzwqAZGYJAAEgAAQAdM6t16/9w9P0yjABkMt3BYAAEAACADqh9el39y/J9/xvAZDK5PkCQAAIAAEAq/+6OOrdPj+T/iAAUnlIAAgAASAAYHX+e9y7f4CathIAmXQcJQAEgAAQALBql97WJY/QKx0CIJGHJwgAASAABACsyuFDuugZ+kldfh9QAHTSPgJAAAgAAQCrMKC5yx6iHw8WAHksuEkACAABIABgpT47rwufopNaBUAe5zcJAAEgAAQArMQvFnbpYzQ2/ucABECnPSIAAlzx4nvIZgJAAFCsqV396+JHC4A8lswRAKzSvwsAAUCpllzY5Q/S9wVAHv8oABAAAgBWoGPrrn+Q+j4mAPJ4VAAgAAQAvNNVEU/SmBsFQBoHLxQACAABAMt7ti3kUfq/sa8DEABr4vsCAAEgAGA5Yf9o/PcEQBotZwgABIAAgGUdHbVUmnsIgDSmLhIACAABAEu7tC1sq/RsEQBpHCQAEAACAJbSenLgWvmCAEjjhGMEAAJAAMDbPha5Vp5YLADSeEwAIAAEALxl8N2heyXw5wAFwJr6iABAAAgAeNPFsXtl4QMCII2RtwkABIAAgDe0jApeLF8UAHnsKQAQAAIA3nBe9GJZOFcApNF+tgBAAAgAeN3W6+5mEQBr7pyZAgABIADgNc81h2+WYwVAIjsIAASAAIDX/LYOq2WEAMgj9K0PAkAACABYZ/Srw2r5uQBI5NK+AgABIADg9/VYLf8jADKZIgAQAAIA/rMeq6XpOQGQyIzpAgABIAAo3iN12S3nCYBMLhAACAABQPHurstuOVoApLKRAEAACAAK9/v67Ja7BEAq990vABAAAoCyPVuf3dI2WgCk8jEBgAAQAJTt43VaLh8UAKl0HCIAEAACgKJNqdNy+YMAyGXEPAGAABAAlOyOOi2X3wmAZJ4WAAgAAUDJ/qtOy+WbAiCZYccLAASAAKBgO9dpufxEAGTzmSYBgAAQAJSrXn8TvLUASOdLAgABIAAoVku9lsshAiCd424XAAgAAUCpjqvXcuknAPI5TwAgAAQApbq8XsvlVAGQ0LcEAAJAAFCokfVaLscLgIRueEIAIAAEAGUaXa/lMlEAZPSkAEAACAAKtahOy+USAZBRx80CAAEgACjT/Dotl+8KgJSeWiQAEAACgCJNr9NyGSsAcnpJACAABABFqtc/CneVAMhp/DgBgAAQAJRolzotl18LgKSOaBIACAABQIG+XaflcqcAyOoHAgABIAAo0Kw6LZeBAiCrxScKAASAAKA8H63Pbrk+5u4FQFd4RgAgAAQA5Wmvz78H/HkBkNgPBQACQABQno3qslsuEgCJbdZfACAABADF6VWX3XKjAMjscQGAABAAFKcuPwTQPejmBUDXaF1fACAABAClab+wDqtligDI7Z/6CgABIAAEAKW5qg6r5W8FQHIbCAABIAAEAKW5J/5NcH+MuncB0FVOuFsACAABIAAozZXhm+UFAZDeswJAAAgAAUBpLopeLBP2EgD53SsABIAAEAAUZvTtwYvlP8JuXQB0nefuFwACQAAIAAqzaexeGX61AHASJAAEgACAhEcA14fulVfi7lwAdKH2BwWAABAAAoDCfD9yrczbUACsG86dJwAEgAAQAJRl/LjAtfLpwBsXAF3qRwJAAAgAAUBhjoh7F8BNCwTAumLY9gJAAAgAAUBhfhC1VNp+GXnbAqBrzW4TAAJAAPhCoCyLbwtaKhuE3rYA6GLPCwABIAB8IVCYWTF/CfDHbgJgXTL3MgEgAAQAFOafI56k+++JvWkB0NUGCAABIACgMC1nBfwAwFeDb1oAdLmvCQABIACgMM91/RuBd4i+ZwHQ5S6fLwAEgACAwtz5RBc/R79pFwDrnl4CQAAIACjNL/t36WN0Umv4HQuArtdxpQAQAAIASvP/JnThU7T1gvgbFgABHp4gAASAAIDSzOrbZQ/R2aPrcL8CIMLPBYAAEABQnD8M6aJnaKPx9bhdARBhwTUCQAAIACjO7BO75BF6paMudysAQpzfJAAEgACA4gy9690/QH1frtPNCoAYuwgAASAAoDyLt363z8+cvet1rwIgxpI5AkAACAAoT/u+7+4HAX54ed1uVQAEOUwACAABACX64P+s/cMz78n2+t2oAIjyYwEgAAQAlGj8S8PX8tm55KP1vM8H9u5yt/qvH/TJLuUbdf/ztDzG6my47v1vemnIB3G155/C/X7s2nz9j3vRJwcA67TPnrymX/9jfjvMxwYA67rTHl2T3wc/5sluPjIAeC+45SszO/ft33TsgA4fFwC8V4w/fOzq/43A45++xycFAO8tM07f7o9tK/3y7/6Rl/3QLAC8Nw284Kr9/n7nZb/6J1130oEvbuizAYD3uLlP3fq5F/e84uWLX7xg16lLfB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkMb/B1e+V0B3UNUyAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDIyLTA3LTExVDEzOjUxOjI2KzAwOjAw3pkGaAAAACV0RVh0ZGF0ZTptb2RpZnkAMjAyMi0wNy0xMVQxMzo1MToyNiswMDowMK/EvtQAAAAASUVORK5CYII="/> + +// </defs> + +// </svg> + +// </div> + +// ++++ diff --git a/docs/en/serverless/transclusion/apm/guide/install-agents/go.asciidoc b/docs/en/serverless/transclusion/apm/guide/install-agents/go.asciidoc new file mode 100644 index 0000000000..98afdf21a7 --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/install-agents/go.asciidoc @@ -0,0 +1,43 @@ +// Comes from sandbox.elastic.dev/test-books/apm/guide/transclusion/tab-widgets/install-agents/go.mdx + +**1. Install the agent** + +Install the {apm-agent} package using `go get`: + +[source,go] +---- +go get -u go.elastic.co/apm/v2 +---- + +**2. Configure the agent** + +To simplify development and testing, +the agent defaults to sending data to Elastic at `http://localhost:8200`. +To send data to an alternative location, you must configure `ELASTIC_APM_SERVER_URL`. + +[source,go] +---- +# The APM integration host and port +export ELASTIC_APM_SERVER_URL= + +# If you do not specify `ELASTIC_APM_SERVICE_NAME`, the Go agent will use the +# executable name. For example, if your executable is called "my-app.exe", then your +# service will be identified as "my-app". +export ELASTIC_APM_SERVICE_NAME= + +# Secret tokens are used to authorize requests to the APM integration +export ELASTIC_APM_SECRET_TOKEN= +---- + +**3. Instrument your application** + +Instrumentation is the process of extending your application's code to report trace data to Elastic APM. Go applications must be instrumented manually at the source code level. To instrument your applications, use one of the following approaches: + +* {apm-go-ref}/builtin-modules.html[Built-in instrumentation modules]. +* {apm-go-ref}/custom-instrumentation.html[Custom instrumentation] and context propagation with the Go Agent API. + +**Learn more in the {apm-agent} reference** + +* {apm-go-ref}/supported-tech.html[Supported technologies] +* {apm-go-ref}/configuration.html[Advanced configuration] +* {apm-go-ref}/getting-started.html[Detailed guide to instrumenting Go source code] diff --git a/docs/en/serverless/transclusion/apm/guide/install-agents/java.asciidoc b/docs/en/serverless/transclusion/apm/guide/install-agents/java.asciidoc new file mode 100644 index 0000000000..2cb79a45d7 --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/install-agents/java.asciidoc @@ -0,0 +1,44 @@ +// Comes from sandbox.elastic.dev/test-books/apm/guide/transclusion/tab-widgets/install-agents/java.mdx + +Manually set up and configure the agent with the `-javaagent` JVM option. No application code change is required, but this requires an +application restart. See below for more information on this setup method. + +**1. Download the {apm-agent}** + +The first step in getting started with the Elastic APM Java agent is to retrieve a copy of the agent JAR. +Java agent releases are published to https://repo.maven.apache.org/maven2/[Maven central]. In order to get a copy you can either: + +* download the https://oss.sonatype.org/service/local/artifact/maven/redirect?r=releases&g=co.elastic.apm&a=elastic-apm-agent&v=LATEST[latest agent] +or a https://mvnrepository.com/artifact/co.elastic.apm/elastic-apm-agent[previous release] from Maven central. +* download with `curl`: ++ +[source,bash] +---- +curl -o 'elastic-apm-agent.jar' -L 'https://oss.sonatype.org/service/local/artifact/maven/redirect?r=releases&g=co.elastic.apm&a=elastic-apm-agent&v=LATEST' +---- + +**2. Add `-javaagent` flag** + +When starting your application, add the JVM flag: `-javaagent:/path/to/elastic-apm-agent-<version>.jar`. + +**3. Configure** + +Different application servers have different ways of setting the `-javaagent` flag and system properties. +Start your application (for example a Spring Boot application or other embedded servers) and add the `-javaagent` JVM flag. +Use the `-D` prefix to configure the agent using system properties: + +[source,bash] +---- +java -javaagent:/path/to/elastic-apm-agent-<version>.jar -Delastic.apm.service_name=my-cool-service -Delastic.apm.application_packages=org.example,org.another.example -Delastic.apm.server_url=http://127.0.0.1:8200 -jar my-application.jar +---- + +Refer to {apm-java-ref}/setup-javaagent.html[Manual setup with `-javaagent` flag] to learn more. + +**Alternate setup methods** + +* **Automatic setup with `apm-agent-attach-cli.jar`** +Automatically set up the agent without needing to alter the configuration of your JVM or application server. This method requires no changes to application code +or JVM options, and allows attaching to a running JVM. Refer to the {apm-java-ref}/setup-attach-cli.html[Java agent documentation] for more information on this setup method. +* **Programmatic API setup to self-attach** +Set up the agent with a one-line code change and an extra `apm-agent-attach` dependency. This method requires no changes to JVM options, and +the agent artifact is embedded within the packaged application binary. Refer to the {apm-java-ref}/setup-attach-api.html[Java agent documentation] for more information on this setup method. diff --git a/docs/en/serverless/transclusion/apm/guide/install-agents/net.asciidoc b/docs/en/serverless/transclusion/apm/guide/install-agents/net.asciidoc new file mode 100644 index 0000000000..e8380f3477 --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/install-agents/net.asciidoc @@ -0,0 +1,20 @@ +// Comes from sandbox.elastic.dev/test-books/apm/guide/transclusion/tab-widgets/install-agents/net.mdx + +**Set up the {apm-agent}** + +* **Profiler runtime instrumentation**: +The agent supports auto instrumentation without any code change and without +any recompilation of your projects. See {apm-dotnet-ref}/setup-auto-instrumentation.html[Profiler auto instrumentation]. +* **NuGet packages**: +The agent ships as a set of {apm-dotnet-ref}/packages.html[NuGet packages] available on https://nuget.org[nuget.org]. +You can add the Agent and specific instrumentations to a .NET application by +referencing one or more of these packages and following the package documentation. +* **Host startup hook**: +On .NET Core 3.0+ or .NET 5+, the agent supports auto instrumentation without any code change and without +any recompilation of your projects. See {apm-dotnet-ref}t/setup-dotnet-net-core.html[Zero code change setup on .NET Core] +for more details. + +**Learn more in the {apm-agent} reference** + +* {apm-dotnet-ref}/supported-technologies.html[Supported technologies] +* {apm-dotnet-ref}/configuration.html[Advanced configuration] diff --git a/docs/en/serverless/transclusion/apm/guide/install-agents/node.asciidoc b/docs/en/serverless/transclusion/apm/guide/install-agents/node.asciidoc new file mode 100644 index 0000000000..6f8045d79a --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/install-agents/node.asciidoc @@ -0,0 +1,45 @@ +// Comes from sandbox.elastic.dev/test-books/apm/guide/transclusion/tab-widgets/install-agents/node.mdx + +**1. Install the {apm-agent}** + +Install the {apm-agent} for Node.js as a dependency to your application. + +[source,js] +---- +npm install elastic-apm-node --save +---- + +**2. Initialization** + +It's important that the agent is started before you require _any_ other modules in your Node.js application - i.e. before `http` and before your router etc. + +This means that you should probably require and start the agent in your application's main file (usually `index.js`, `server.js` or `app.js`). + +Here's a simple example of how Elastic APM is normally required and started: + +[source,js] +---- +// Add this to the VERY top of the first file loaded in your app +var apm = require('elastic-apm-node').start({ + // Override service name from package.json + // Allowed characters: a-z, A-Z, 0-9, -, _, and space + serviceName: '', + + // Use if APM integration requires a token + secretToken: '', + + // Use if APM integration uses API keys for authentication + apiKey: '', + + // Set custom APM integration host and port (default: http://127.0.0.1:8200) + serverUrl: '', +}) +---- + +The agent will now monitor the performance of your application and record any uncaught exceptions. + +**Learn more in the {apm-agent} reference** + +* {apm-node-ref}/supported-technologies.html[Supported technologies] +* {apm-node-ref}/advanced-setup.html[Babel/ES Modules] +* {apm-node-ref}/configuring-the-agent.html[Advanced configuration] diff --git a/docs/en/serverless/transclusion/apm/guide/install-agents/php.asciidoc b/docs/en/serverless/transclusion/apm/guide/install-agents/php.asciidoc new file mode 100644 index 0000000000..733cd416ab --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/install-agents/php.asciidoc @@ -0,0 +1,75 @@ +// Comes from sandbox.elastic.dev/test-books/apm/guide/transclusion/tab-widgets/install-agents/php.mdx + +**1. Install the agent** + +Install the PHP agent using one of the https://github.com/elastic/apm-agent-php/releases/latest[published packages]. + +To use the RPM Package (RHEL/CentOS and Fedora): + +[source,php] +---- +rpm -ivh <package-file>.rpm +---- + +To use the DEB package (Debian and Ubuntu): + +[source,php] +---- +dpkg -i <package-file>.deb +---- + +To use the APK package (Alpine): + +[source,php] +---- +apk add --allow-untrusted <package-file>.apk +---- + +If you can’t find your distribution, you can install the agent by building it from the source. +The following instructions will build the APM agent using the same docker environment that Elastic uses to build our official packages. + +[NOTE] +==== +The agent is currently only available for Linux operating system. +==== + +. Download the https://github.com/elastic/apm-agent-php/[agent source]. +. Execute the following commands to build the agent and install it: + +[source,bash] +---- +cd apm-agent-php +# for linux glibc - libc distributions (Ubuntu, Redhat, etc) +export BUILD_ARCHITECTURE=linux-x86-64 +# for linux with musl - libc distributions (Alpine) +export BUILD_ARCHITECTURE=linuxmusl-x86-64 +# provide a path to php-config tool +export PHP_CONFIG=php-config + +# build extensions +make -f .ci/Makefile build + +# run extension tests +PHP_VERSION=`$PHP_CONFIG --version | cut -d'.' -f 1,2` make -f .ci/Makefile run-phpt-tests + +# install agent extensions +sudo cp agent/native/_build/${BUILD_ARCHITECTURE}-release/ext/elastic_apm-*.so `$PHP_CONFIG --extension-dir` + +# install automatic loader +sudo cp agent/native/_build/${BUILD_ARCHITECTURE}-release/loader/code/elastic_apm_loader.so `$PHP_CONFIG --extension-dir` +---- + +**2. Enable and configure the APM agent** + +Enable and configure your agent inside of the `php.ini` file: + +[source,ini] +---- +extension=elastic_apm_loader.so +elastic_apm.bootstrap_php_part_file=<repo root>/agent/php/bootstrap_php_part.php +---- + +**Learn more in the {apm-agent} reference** + +* {apm-php-ref}/supported-technologies.html[Supported technologies] +* {apm-py-ref}/configuration.html[Configuration] diff --git a/docs/en/serverless/transclusion/apm/guide/install-agents/python.asciidoc b/docs/en/serverless/transclusion/apm/guide/install-agents/python.asciidoc new file mode 100644 index 0000000000..c69a41e638 --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/install-agents/python.asciidoc @@ -0,0 +1,98 @@ +// Comes from sandbox.elastic.dev/test-books/apm/guide/transclusion/tab-widgets/install-agents/python.mdx + +Django and Flask are two of several frameworks that the Elastic APM Python Agent +supports. For a complete list of supported technologies, refer to the +{apm-py-ref}/supported-technologies.html[Elastic APM Python Agent documentation]. + +_Django_ + +[source,python] +---- +$ pip install elastic-apm +---- + +**1. Install the {apm-agent}** + +Install the {apm-agent} for Python as a dependency. + +[source,python] +---- +$ pip install elastic-apm +---- + +**2. Configure the {apm-agent}** + +Agents are libraries that run inside of your application process. +APM services are created programmatically based on the `SERVICE_NAME`. + +[source,python] +---- +# Add the agent to the installed apps +INSTALLED_APPS = ( + 'elasticapm.contrib.django', + # ... +) + +ELASTIC_APM = { + # Set required service name. Allowed characters: + # a-z, A-Z, 0-9, -, _, and space + 'SERVICE_NAME': '', + + # Use if APM integration requires a token + 'SECRET_TOKEN': '', + + # Set custom APM integration host and port (default: http://localhost:8200) + 'SERVER_URL': '', +} + +# To send performance metrics, add our tracing middleware: +MIDDLEWARE = ( + 'elasticapm.contrib.django.middleware.TracingMiddleware', + #... +) +---- + +_Flask_ + +**1. Install the {apm-agent}** + +Install the {apm-agent} for Python as a dependency. + +[source,python] +---- +$ pip install elastic-apm[flask] +---- + +**2. Configure the {apm-agent}** + +Agents are libraries that run inside of your application process. +APM services are created programmatically based on the `SERVICE_NAME`. + +[source,python] +---- +# initialize using environment variables +from elasticapm.contrib.flask import ElasticAPM +app = Flask(__name__) +apm = ElasticAPM(app) + +# or configure to use ELASTIC_APM in your application settings +from elasticapm.contrib.flask import ElasticAPM +app.config['ELASTIC_APM'] = { + # Set required service name. Allowed characters: + # a-z, A-Z, 0-9, -, _, and space + 'SERVICE_NAME': '', + + # Use if APM integration requires a token + 'SECRET_TOKEN': '', + + # Set custom APM integration host and port (default: http://localhost:8200) + 'SERVER_URL': '', +} + +apm = ElasticAPM(app) +---- + +**Learn more in the {apm-agent} reference** + +* {apm-py-ref}/supported-technologies.html[Supported technologies] +* {apm-py-ref}/configuration.html[Advanced configuration] diff --git a/docs/en/serverless/transclusion/apm/guide/install-agents/ruby.asciidoc b/docs/en/serverless/transclusion/apm/guide/install-agents/ruby.asciidoc new file mode 100644 index 0000000000..8b72a6800a --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/install-agents/ruby.asciidoc @@ -0,0 +1,80 @@ +// Comes from sandbox.elastic.dev/test-books/apm/guide/transclusion/tab-widgets/install-agents/ruby.mdx + +**1. Install the {apm-agent}** + +Add the agent to your Gemfile. + +[source,ruby] +---- +gem 'elastic-apm' +---- + +**2. Configure the agent** + +_Ruby on Rails_ + +APM is automatically started when your app boots. +Configure the agent by creating the config file `config/elastic_apm.yml`: + +[source,ruby] +---- +# config/elastic_apm.yml: + +# Set service name - allowed characters: a-z, A-Z, 0-9, -, _ and space +# Defaults to the name of your Rails app +service_name: 'my-service' + +# Use if APM integration requires a token +secret_token: '' + +# Set custom APM integration host and port (default: http://localhost:8200) +server_url: 'http://localhost:8200' +---- + +_Rack_ + +For Rack or a compatible framework, like Sinatra, include the middleware in your app and start the agent. + +[source,ruby] +---- +# config.ru + +app = lambda do |env| + [200, {'Content-Type' => 'text/plain'}, ['ok']] +end + +# Wraps all requests in transactions and reports exceptions +use ElasticAPM::Middleware + +# Start an instance of the Agent +ElasticAPM.start(service_name: 'NothingButRack') + +run app + +# Gracefully stop the agent when process exits. +# Makes sure any pending transactions are sent. +at_exit { ElasticAPM.stop } +---- + +Create a config file `config/elastic_apm.yml`: + +[source,ruby] +---- +# config/elastic_apm.yml: + +# Set service name - allowed characters: a-z, A-Z, 0-9, -, _ and space +# Defaults to the name of your Rack app's class. +service_name: 'my-service' + +# Use if APM integration requires a token +secret_token: '' + +# Set custom APM integration host and port (default: http://localhost:8200) +server_url: 'http://localhost:8200' +---- + + +**Learn more in the {apm-agent} reference** + +* {apm-ruby-ref}/supported-technologies.html[Supported technologies] +* {apm-ruby-ref}/configuration.html[Advanced configuration] diff --git a/docs/en/serverless/transclusion/apm/guide/open-telemetry/otel-get-started.asciidoc b/docs/en/serverless/transclusion/apm/guide/open-telemetry/otel-get-started.asciidoc new file mode 100644 index 0000000000..574d4bee28 --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/open-telemetry/otel-get-started.asciidoc @@ -0,0 +1,5 @@ +Elastic integrates with OpenTelemetry, allowing you to reuse your existing instrumentation +to easily send observability data to Elastic. + +For more information on how to combine Elastic and OpenTelemetry, +refer to <<apm-agents-opentelemetry>>. diff --git a/docs/en/serverless/transclusion/apm/guide/spec/v2/error.asciidoc b/docs/en/serverless/transclusion/apm/guide/spec/v2/error.asciidoc new file mode 100644 index 0000000000..d531a8e3a7 --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/spec/v2/error.asciidoc @@ -0,0 +1,3 @@ + + +<DocCode children={snippet} /> diff --git a/docs/en/serverless/transclusion/apm/guide/spec/v2/metadata.asciidoc b/docs/en/serverless/transclusion/apm/guide/spec/v2/metadata.asciidoc new file mode 100644 index 0000000000..d531a8e3a7 --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/spec/v2/metadata.asciidoc @@ -0,0 +1,3 @@ + + +<DocCode children={snippet} /> diff --git a/docs/en/serverless/transclusion/apm/guide/spec/v2/metricset.asciidoc b/docs/en/serverless/transclusion/apm/guide/spec/v2/metricset.asciidoc new file mode 100644 index 0000000000..d531a8e3a7 --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/spec/v2/metricset.asciidoc @@ -0,0 +1,3 @@ + + +<DocCode children={snippet} /> diff --git a/docs/en/serverless/transclusion/apm/guide/spec/v2/span.asciidoc b/docs/en/serverless/transclusion/apm/guide/spec/v2/span.asciidoc new file mode 100644 index 0000000000..d531a8e3a7 --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/spec/v2/span.asciidoc @@ -0,0 +1,3 @@ + + +<DocCode children={snippet} /> diff --git a/docs/en/serverless/transclusion/apm/guide/spec/v2/transaction.asciidoc b/docs/en/serverless/transclusion/apm/guide/spec/v2/transaction.asciidoc new file mode 100644 index 0000000000..d531a8e3a7 --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/spec/v2/transaction.asciidoc @@ -0,0 +1,3 @@ + + +<DocCode children={snippet} /> diff --git a/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-receive-widget.asciidoc b/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-receive-widget.asciidoc new file mode 100644 index 0000000000..77785d9122 --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-receive-widget.asciidoc @@ -0,0 +1,71 @@ + + +++++ +<div class="tabs" data-tab-group="transclusion-apm-guide-tab-widgets-distributed-trace-receive-widget"> + <div role="tablist" aria-label="transclusion-apm-guide-tab-widgets-distributed-trace-receive-widget"> + <button role="tab" aria-selected="true" aria-controls="transclusion-apm-guide-tab-widgets-distributed-trace-receive-widget-go-panel" id="transclusion-apm-guide-tab-widgets-distributed-trace-receive-widget-go-button"> + Go + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-apm-guide-tab-widgets-distributed-trace-receive-widget-java-panel" id="transclusion-apm-guide-tab-widgets-distributed-trace-receive-widget-java-button" tabindex="-1"> + Java + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-apm-guide-tab-widgets-distributed-trace-receive-widget-net-panel" id="transclusion-apm-guide-tab-widgets-distributed-trace-receive-widget-net-button" tabindex="-1"> + .NET + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-apm-guide-tab-widgets-distributed-trace-receive-widget-nodejs-panel" id="transclusion-apm-guide-tab-widgets-distributed-trace-receive-widget-nodejs-button" tabindex="-1"> + Node.js + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-apm-guide-tab-widgets-distributed-trace-receive-widget-php-panel" id="transclusion-apm-guide-tab-widgets-distributed-trace-receive-widget-php-button" tabindex="-1"> + PHP + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-apm-guide-tab-widgets-distributed-trace-receive-widget-python-panel" id="transclusion-apm-guide-tab-widgets-distributed-trace-receive-widget-python-button" tabindex="-1"> + Python + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-apm-guide-tab-widgets-distributed-trace-receive-widget-ruby-panel" id="transclusion-apm-guide-tab-widgets-distributed-trace-receive-widget-ruby-button" tabindex="-1"> + Ruby + </button> + </div> + <div tabindex="0" role="tabpanel" id="transclusion-apm-guide-tab-widgets-distributed-trace-receive-widget-go-panel" aria-labelledby="transclusion-apm-guide-tab-widgets-distributed-trace-receive-widget-go-button"> +++++ +include::./distributed-trace-receive/go.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-apm-guide-tab-widgets-distributed-trace-receive-widget-java-panel" aria-labelledby="transclusion-apm-guide-tab-widgets-distributed-trace-receive-widget-java-button" hidden=""> +++++ +include::./distributed-trace-receive/java.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-apm-guide-tab-widgets-distributed-trace-receive-widget-net-panel" aria-labelledby="transclusion-apm-guide-tab-widgets-distributed-trace-receive-widget-net-button" hidden=""> +++++ +include::./distributed-trace-receive/net.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-apm-guide-tab-widgets-distributed-trace-receive-widget-nodejs-panel" aria-labelledby="transclusion-apm-guide-tab-widgets-distributed-trace-receive-widget-nodejs-button" hidden=""> +++++ +include::./distributed-trace-receive/node.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-apm-guide-tab-widgets-distributed-trace-receive-widget-php-panel" aria-labelledby="transclusion-apm-guide-tab-widgets-distributed-trace-receive-widget-php-button" hidden=""> +++++ +include::./distributed-trace-receive/php.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-apm-guide-tab-widgets-distributed-trace-receive-widget-python-panel" aria-labelledby="transclusion-apm-guide-tab-widgets-distributed-trace-receive-widget-python-button" hidden=""> +++++ +include::./distributed-trace-receive/python.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-apm-guide-tab-widgets-distributed-trace-receive-widget-ruby-panel" aria-labelledby="transclusion-apm-guide-tab-widgets-distributed-trace-receive-widget-ruby-button" hidden=""> +++++ +include::./distributed-trace-receive/ruby.asciidoc[] + +++++ + </div> +</div> +++++ diff --git a/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-receive/go.asciidoc b/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-receive/go.asciidoc new file mode 100644 index 0000000000..106addcf8b --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-receive/go.asciidoc @@ -0,0 +1,30 @@ +// Need help with this example + +. Parse the incoming `TraceContext` with +https://godoc.org/go.elastic.co/apm/module/apmhttp#ParseTraceparentHeader[`ParseTraceparentHeader`] or +https://godoc.org/go.elastic.co/apm/module/apmhttp#ParseTracestateHeader[`ParseTracestateHeader`]. +. Start a new transaction or span as a child of the incoming transaction with +{apm-go-ref}/api.html#tracer-api-start-transaction-options[`StartTransactionOptions`] or +{apm-go-ref}/api.html#transaction-start-span-options[`StartSpanOptions`]. + +Example: + +[source,go] +---- +// Receive incoming TraceContext +traceContext, _ := apmhttp.ParseTraceparentHeader(r.Header.Get("Traceparent")) <1> +traceContext.State, _ = apmhttp.ParseTracestateHeader(r.Header["Tracestate"]...) <2> + +opts := apm.TransactionOptions{ + TraceContext: traceContext, <3> +} +transaction := apm.DefaultTracer.StartTransactionOptions("GET /", "request", opts) <4> +---- + +<1> Parse the `TraceParent` header + +<2> Parse the `Tracestate` header + +<3> Set the parent trace context + +<4> Start a new transaction as a child of the received `TraceContext` diff --git a/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-receive/java.asciidoc b/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-receive/java.asciidoc new file mode 100644 index 0000000000..29a00a52c0 --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-receive/java.asciidoc @@ -0,0 +1,36 @@ +. Create a transaction as a child of the incoming transaction with +{apm-java-ref}/public-api.html#api-transaction-inject-trace-headers[`startTransactionWithRemoteParent()`]. +. Start and name the transaction with {apm-java-ref}/public-api.html#api-transaction-activate[`activate()`] +and {apm-java-ref}/public-api.html#api-set-name[`setName()`]. + +Example: + +[source,java] +---- +// Hook into a callback provided by the framework that is called on incoming requests +public Response onIncomingRequest(Request request) throws Exception { + // creates a transaction representing the server-side handling of the request + Transaction transaction = ElasticApm.startTransactionWithRemoteParent(request::getHeader, request::getHeaders); <1> + try (final Scope scope = transaction.activate()) { <2> + String name = "a useful name like ClassName#methodName where the request is handled"; + transaction.setName(name); <3> + transaction.setType(Transaction.TYPE_REQUEST); <4> + return request.handle(); + } catch (Exception e) { + transaction.captureException(e); + throw e; + } finally { + transaction.end(); <5> + } +} +---- + +<1> Create a transaction as the child of a remote parent + +<2> Activate the transaction + +<3> Name the transaction + +<4> Add a transaction type + +<5> Eventually, end the transaction diff --git a/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-receive/net.asciidoc b/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-receive/net.asciidoc new file mode 100644 index 0000000000..02957e8ad8 --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-receive/net.asciidoc @@ -0,0 +1,13 @@ +Deserialize the incoming distributed tracing context, and pass it to any of the +{apm-dotnet-ref}/public-api.html#api-start-transaction[`StartTransaction`] or +{apm-dotnet-ref}/public-api.html#convenient-capture-transaction[`CaptureTransaction`] APIs — +all of which have an optional `DistributedTracingData` parameter. +This will create a new transaction or span as a child of the incoming trace context. + +Example starting a new transaction: + +[source,csharp] +---- +var transaction2 = Agent.Tracer.StartTransaction("Transaction2", "TestTransaction", + DistributedTracingData.TryDeserializeFromString(serializedDistributedTracingData)); +---- diff --git a/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-receive/node.asciidoc b/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-receive/node.asciidoc new file mode 100644 index 0000000000..33a0429f6f --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-receive/node.asciidoc @@ -0,0 +1,16 @@ +. Decode and store the `traceparent` in the receiving service. +. Pass in the `traceparent` as the `childOf` option to manually start a new transaction +as a child of the received `traceparent` with +{apm-node-ref}/agent-api.html#apm-start-transaction[`apm.startTransaction()`]. + +Example receiving a `traceparent` over raw UDP: + +[source,js] +---- +const traceparent = readTraceparentFromUDPPacket() <1> +agent.startTransaction('my-service-b-transaction', { childOf: traceparent }) <2> +---- + +<1> Read the `traceparent` from the incoming request. + +<2> Use the `traceparent` to initialize a new transaction that is a child of the original `traceparent`. diff --git a/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-receive/php.asciidoc b/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-receive/php.asciidoc new file mode 100644 index 0000000000..09230932ff --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-receive/php.asciidoc @@ -0,0 +1,24 @@ +. Receive the distributed tracing data on the server side. +. Begin a new transaction using the agent's public API. For example, use {apm-php-ref}/public-api.html#api-elasticapm-class-begin-current-transaction[`ElasticApm::beginCurrentTransaction`] +and pass the received distributed tracing data (serialized as string) as a parameter. +This will create a new transaction as a child of the incoming trace context. +. Don't forget to eventually end the transaction on the server side. + +Example: + +[source,php] +---- +$receiverTransaction = ElasticApm::beginCurrentTransaction( <1> + 'GET /data-api', + 'data-layer', + /* timestamp */ null, + $distDataAsString <2> +); +---- + +<1> Start a new transaction + +<2> Pass in the received distributed tracing data (serialized as string) + +Once this new transaction has been created in the receiving service, +you can create child spans, or use any other agent API methods as you typically would. diff --git a/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-receive/python.asciidoc b/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-receive/python.asciidoc new file mode 100644 index 0000000000..3b5a7a06e4 --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-receive/python.asciidoc @@ -0,0 +1,19 @@ +. Create a `TraceParent` object from a string or HTTP header. +. Start a new transaction as a child of the `TraceParent` by passing in a `TraceParent` object. + +Example using HTTP headers: + +[source,python] +---- +parent = elasticapm.trace_parent_from_headers(headers_dict) <1> +client.begin_transaction('processors', trace_parent=parent) <2> +---- + +<1> Create a `TraceParent` object from HTTP headers formed as a dictionary + +<2> Begin a new transaction as a child of the received `TraceParent` + +[TIP] +==== +See the {apm-py-ref}/api.html#traceparent-api[`TraceParent` API] for additional examples. +==== diff --git a/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-receive/ruby.asciidoc b/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-receive/ruby.asciidoc new file mode 100644 index 0000000000..cd0d862a7c --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-receive/ruby.asciidoc @@ -0,0 +1,23 @@ +Start a new transaction or span as a child of the incoming transaction or span with +{apm-ruby-ref}/api.html#api-agent-with_transaction[`with_transaction`] or +{apm-ruby-ref}/api.html#api-agent-with_span[`with_span`]. + +Example: + +[source,ruby] +---- +# env being a Rack env +context = ElasticAPM::TraceContext.parse(env: env) <1> + +ElasticAPM.with_transaction("Do things", trace_context: context) do <2> + ElasticAPM.with_span("Do nested thing", trace_context: context) do <3> + end +end +---- + +<1> Parse the incoming `TraceContext` + +<2> Create a transaction as a child of the incoming `TraceContext` + +<3> Create a span as a child of the newly created transaction. `trace_context` is optional here, +as spans are automatically created as a child of their parent's transaction's `TraceContext` when none is passed. diff --git a/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-send-widget.asciidoc b/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-send-widget.asciidoc new file mode 100644 index 0000000000..dd4b82da78 --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-send-widget.asciidoc @@ -0,0 +1,71 @@ + + +++++ +<div class="tabs" data-tab-group="transclusion-apm-guide-tab-widgets-distributed-trace-send-widget"> + <div role="tablist" aria-label="transclusion-apm-guide-tab-widgets-distributed-trace-send-widget"> + <button role="tab" aria-selected="true" aria-controls="transclusion-apm-guide-tab-widgets-distributed-trace-send-widget-go-panel" id="transclusion-apm-guide-tab-widgets-distributed-trace-send-widget-go-button"> + Go + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-apm-guide-tab-widgets-distributed-trace-send-widget-java-panel" id="transclusion-apm-guide-tab-widgets-distributed-trace-send-widget-java-button" tabindex="-1"> + Java + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-apm-guide-tab-widgets-distributed-trace-send-widget-net-panel" id="transclusion-apm-guide-tab-widgets-distributed-trace-send-widget-net-button" tabindex="-1"> + .NET + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-apm-guide-tab-widgets-distributed-trace-send-widget-nodejs-panel" id="transclusion-apm-guide-tab-widgets-distributed-trace-send-widget-nodejs-button" tabindex="-1"> + Node.js + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-apm-guide-tab-widgets-distributed-trace-send-widget-php-panel" id="transclusion-apm-guide-tab-widgets-distributed-trace-send-widget-php-button" tabindex="-1"> + PHP + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-apm-guide-tab-widgets-distributed-trace-send-widget-python-panel" id="transclusion-apm-guide-tab-widgets-distributed-trace-send-widget-python-button" tabindex="-1"> + Python + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-apm-guide-tab-widgets-distributed-trace-send-widget-ruby-panel" id="transclusion-apm-guide-tab-widgets-distributed-trace-send-widget-ruby-button" tabindex="-1"> + Ruby + </button> + </div> + <div tabindex="0" role="tabpanel" id="transclusion-apm-guide-tab-widgets-distributed-trace-send-widget-go-panel" aria-labelledby="transclusion-apm-guide-tab-widgets-distributed-trace-send-widget-go-button"> +++++ +include::./distributed-trace-send/go.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-apm-guide-tab-widgets-distributed-trace-send-widget-java-panel" aria-labelledby="transclusion-apm-guide-tab-widgets-distributed-trace-send-widget-java-button" hidden=""> +++++ +include::./distributed-trace-send/java.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-apm-guide-tab-widgets-distributed-trace-send-widget-net-panel" aria-labelledby="transclusion-apm-guide-tab-widgets-distributed-trace-send-widget-net-button" hidden=""> +++++ +include::./distributed-trace-send/net.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-apm-guide-tab-widgets-distributed-trace-send-widget-nodejs-panel" aria-labelledby="transclusion-apm-guide-tab-widgets-distributed-trace-send-widget-nodejs-button" hidden=""> +++++ +include::./distributed-trace-send/node.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-apm-guide-tab-widgets-distributed-trace-send-widget-php-panel" aria-labelledby="transclusion-apm-guide-tab-widgets-distributed-trace-send-widget-php-button" hidden=""> +++++ +include::./distributed-trace-send/php.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-apm-guide-tab-widgets-distributed-trace-send-widget-python-panel" aria-labelledby="transclusion-apm-guide-tab-widgets-distributed-trace-send-widget-python-button" hidden=""> +++++ +include::./distributed-trace-send/python.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-apm-guide-tab-widgets-distributed-trace-send-widget-ruby-panel" aria-labelledby="transclusion-apm-guide-tab-widgets-distributed-trace-send-widget-ruby-button" hidden=""> +++++ +include::./distributed-trace-send/ruby.asciidoc[] + +++++ + </div> +</div> +++++ diff --git a/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-send/go.asciidoc b/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-send/go.asciidoc new file mode 100644 index 0000000000..df124a4b7d --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-send/go.asciidoc @@ -0,0 +1,23 @@ +. Start a transaction with +{apm-go-ref}/api.html#tracer-api-start-transaction[`StartTransaction`] or a span with +{apm-go-ref}/api.html#transaction-start-span[`StartSpan`]. +. Get the active `TraceContext`. +. Send the `TraceContext` to the receiving service. + +Example: + +[source,go] +---- +transaction := apm.DefaultTracer.StartTransaction("GET /", "request") <1> +traceContext := transaction.TraceContext() <2> + +// Send TraceContext to receiving service +traceparent := apmhttp.FormatTraceparentHeader(traceContext)) <3> +tracestate := traceContext.State.String() +---- + +<1> Start a transaction + +<2> Get `TraceContext` from current Transaction + +<3> Format the `TraceContext` or `tracestate` as a `traceparent` header. diff --git a/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-send/java.asciidoc b/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-send/java.asciidoc new file mode 100644 index 0000000000..2f05ddf46f --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-send/java.asciidoc @@ -0,0 +1,31 @@ +. Start a transaction with {apm-java-ref}/public-api.html#api-start-transaction[`startTransaction`], +or a span with {apm-java-ref}/public-api.html#api-span-start-span[`startSpan`]. +. Inject the `traceparent` header into the request object with +{apm-java-ref}/public-api.html#api-transaction-inject-trace-headers[`injectTraceHeaders`] + +Example of manually instrumenting an RPC framework: + +[source,java] +---- +// Hook into a callback provided by the RPC framework that is called on outgoing requests +public Response onOutgoingRequest(Request request) throws Exception { + Span span = ElasticApm.currentSpan() <1> + .startSpan("external", "http", null) + .setName(request.getMethod() + " " + request.getHost()); + try (final Scope scope = transaction.activate()) { + span.injectTraceHeaders((name, value) -> request.addHeader(name, value)); <2> + return request.execute(); + } catch (Exception e) { + span.captureException(e); + throw e; + } finally { + span.end(); <3> + } +} +---- + +<1> Create a span representing an external call + +<2> Inject the `traceparent` header into the request object + +<3> End the span diff --git a/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-send/net.asciidoc b/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-send/net.asciidoc new file mode 100644 index 0000000000..27ee934ed6 --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-send/net.asciidoc @@ -0,0 +1,14 @@ +. Serialize the distributed tracing context of the active transaction or span with +{apm-dotnet-ref}/public-api.html#api-current-transaction[`CurrentTransaction`] or +{apm-dotnet-ref}/public-api.html#api-current-span[`CurrentSpan`]. +. Send the serialized context the receiving service. + +Example: + +[source,csharp] +---- +string outgoingDistributedTracingData = + (Agent.Tracer.CurrentSpan?.OutgoingDistributedTracingData + ?? Agent.Tracer.CurrentTransaction?.OutgoingDistributedTracingData)?.SerializeToString(); +// Now send `outgoingDistributedTracingData` to the receiving service +---- diff --git a/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-send/node.asciidoc b/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-send/node.asciidoc new file mode 100644 index 0000000000..370fde5a3b --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-send/node.asciidoc @@ -0,0 +1,20 @@ +. Start a transaction with {apm-node-ref}/agent-api.html#apm-start-transaction[`apm.startTransaction()`], +or a span with {apm-node-ref}/agent-api.html#apm-start-span[`apm.startSpan()`]. +. Get the serialized `traceparent` string of the started transaction/span with +{apm-node-ref}/agent-api.html#apm-current-traceparent[`currentTraceparent`]. +. Encode the `traceparent` and send it to the receiving service inside your regular request. + +Example using raw UDP to communicate between two services, A and B: + +[source,js] +---- +agent.startTransaction('my-service-a-transaction'); <1> +const traceparent = agent.currentTraceparent; <2> +sendMetadata(`traceparent: ${traceparent}\n`); <3> +---- + +<1> Start a transaction + +<2> Get the current `traceparent` + +<3> Send the `traceparent` as a header to service B. diff --git a/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-send/php.asciidoc b/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-send/php.asciidoc new file mode 100644 index 0000000000..4aabaa6aa6 --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-send/php.asciidoc @@ -0,0 +1,11 @@ +. On the client side (i.e., the side sending the request) get the current distributed tracing context. +. Serialize the current distributed tracing context to a format supported by the request's transport and send it to the server side (i.e., the side receiving the request). + +Example: + +[source,php] +---- +$distDataAsString = ElasticApm::getSerializedCurrentDistributedTracingData(); <1> +---- + +<1> Get the current distributed tracing data serialized as string diff --git a/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-send/python.asciidoc b/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-send/python.asciidoc new file mode 100644 index 0000000000..31c15d8fdc --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-send/python.asciidoc @@ -0,0 +1,18 @@ +. Start a transaction with {apm-py-ref}/api.html#client-api-begin-transaction[`begin_transaction()`]. +. Get the `trace_parent` of the active transaction. +. Send the `trace_parent` to the receiving service. + +Example: + +[source,python] +---- +client.begin_transaction('new-transaction') <1> + +elasticapm.get_trace_parent_header('new-transaction') <2> + +# Send `trace_parent_str` to another service +---- + +<1> Start a new transaction + +<2> Return the string representation of the current transaction's `TraceParent` object diff --git a/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-send/ruby.asciidoc b/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-send/ruby.asciidoc new file mode 100644 index 0000000000..9e8798e6e6 --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/tab-widgets/distributed-trace-send/ruby.asciidoc @@ -0,0 +1,17 @@ +. Start a span with {apm-ruby-ref}/api.html#api-agent-with_span[`with_span`]. +. Get the active `TraceContext`. +. Send the `TraceContext` to the receiving service. + +Example: + +[source,ruby] +---- +ElasticAPM.with_span "Name" do |span| <1> + header = span.trace_context.traceparent.to_header <2> + # send the TraceContext Header to a receiving service... +end +---- + +<1> Start a span + +<2> Get the `TraceContext` diff --git a/docs/en/serverless/transclusion/apm/guide/tab-widgets/no-data-indexed/fleet-managed.asciidoc b/docs/en/serverless/transclusion/apm/guide/tab-widgets/no-data-indexed/fleet-managed.asciidoc new file mode 100644 index 0000000000..0affe08c6f --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/tab-widgets/no-data-indexed/fleet-managed.asciidoc @@ -0,0 +1,15 @@ +**Are the URL and API key correct?** + +Double check that the intake URL and API key are correct in your APM agent configuration. +Reference the relevant {apm-agents-ref}/index.html[{apm-agent} documentation] for details on how to set these configuration variables. + +To create a new API key, see <<apm-keep-data-secure-create-a-new-api-key,Create a new API key>>. + +If you see requests coming through the managed intake service but they are not accepted (a response code other than `202`), +see <<apm-troubleshooting-common-response-codes,managed intake service response codes>> to narrow down the possible causes. + +**Are there instrumentation gaps?** + +APM agents provide auto-instrumentation for many popular frameworks and libraries. +If the {apm-agent} is not auto-instrumenting something that you were expecting, data won't be sent to Elastic. +Reference the relevant {apm-agents-ref}/index.html[{apm-agent} documentation] for details on what is automatically instrumented. diff --git a/docs/en/serverless/transclusion/container-details.asciidoc b/docs/en/serverless/transclusion/container-details.asciidoc new file mode 100644 index 0000000000..8b673759cf --- /dev/null +++ b/docs/en/serverless/transclusion/container-details.asciidoc @@ -0,0 +1,65 @@ +// This is collapsed by default + +.Overview +[%collapsible] +===== +The **Overview** tab displays key metrics about the selected container, such as CPU, memory, network, and disk usage. +The metrics shown may vary depending on the type of container you're monitoring. + +Change the time range to view metrics over a specific period of time. + +Expand each section to view more detail related to the selected container, such as metadata, +active alerts, and metrics. + +Hover over a specific time period on a chart to compare the various metrics at that given time. + +Click **Show all** to drill down into related data. + +[role="screenshot"] +image::images/overview-overlay-containers.png[Container overview] +===== + +.Metadata +[%collapsible] +===== +The **Metadata** tab lists all the meta information relating to the container: + +* Host information +* Cloud information +* Agent information + +All of this information can help when investigating events—for example, filtering by operating system or architecture. + +[role="screenshot"] +image::images/metadata-overlay-containers.png[Container metadata] +===== + +.Metrics +[%collapsible] +===== +The **Metrics** tab shows container metrics organized by type. + +[role="screenshot"] +image::images/metrics-overlay-containers.png[Metrics] +===== + +.Logs +[%collapsible] +===== +The **Logs** tab displays logs relating to the container that you have selected. By default, the logs tab displays the following columns. + +|=== +| | + +| **Timestamp** +| The timestamp of the log entry from the `timestamp` field. + +| **Message** +| The message extracted from the document. The content of this field depends on the type of log message. If no special log message type is detected, the {ecs-ref}/ecs-base.html[Elastic Common Schema (ECS)] base field, `message`, is used. +|=== + +To view the logs in the {logs-app} for a detailed analysis, click **Open in Logs**. + +[role="screenshot"] +image::images/logs-overlay-containers.png[Container logs] +===== diff --git a/docs/en/serverless/transclusion/fleet/tab-widgets/download-widget.asciidoc b/docs/en/serverless/transclusion/fleet/tab-widgets/download-widget.asciidoc new file mode 100644 index 0000000000..1812b3c7f7 --- /dev/null +++ b/docs/en/serverless/transclusion/fleet/tab-widgets/download-widget.asciidoc @@ -0,0 +1,53 @@ + + +++++ +<div class="tabs" data-tab-group="transclusion-fleet-tab-widgets-download-widget"> + <div role="tablist" aria-label="transclusion-fleet-tab-widgets-download-widget"> + <button role="tab" aria-selected="true" aria-controls="transclusion-fleet-tab-widgets-download-widget-macos-panel" id="transclusion-fleet-tab-widgets-download-widget-macos-button"> + macOS + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-fleet-tab-widgets-download-widget-linux-panel" id="transclusion-fleet-tab-widgets-download-widget-linux-button" tabindex="-1"> + Linux + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-fleet-tab-widgets-download-widget-windows-panel" id="transclusion-fleet-tab-widgets-download-widget-windows-button" tabindex="-1"> + Windows + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-fleet-tab-widgets-download-widget-deb-panel" id="transclusion-fleet-tab-widgets-download-widget-deb-button" tabindex="-1"> + DEB + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-fleet-tab-widgets-download-widget-rpm-panel" id="transclusion-fleet-tab-widgets-download-widget-rpm-button" tabindex="-1"> + RPM + </button> + </div> + <div tabindex="0" role="tabpanel" id="transclusion-fleet-tab-widgets-download-widget-macos-panel" aria-labelledby="transclusion-fleet-tab-widgets-download-widget-macos-button"> +++++ +include::./download/mac.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-fleet-tab-widgets-download-widget-linux-panel" aria-labelledby="transclusion-fleet-tab-widgets-download-widget-linux-button" hidden=""> +++++ +include::./download/linux.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-fleet-tab-widgets-download-widget-windows-panel" aria-labelledby="transclusion-fleet-tab-widgets-download-widget-windows-button" hidden=""> +++++ +include::./download/win.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-fleet-tab-widgets-download-widget-deb-panel" aria-labelledby="transclusion-fleet-tab-widgets-download-widget-deb-button" hidden=""> +++++ +include::./download/deb.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-fleet-tab-widgets-download-widget-rpm-panel" aria-labelledby="transclusion-fleet-tab-widgets-download-widget-rpm-button" hidden=""> +++++ +include::./download/rpm.asciidoc[] + +++++ + </div> +</div> +++++ diff --git a/docs/en/serverless/transclusion/fleet/tab-widgets/download/deb.asciidoc b/docs/en/serverless/transclusion/fleet/tab-widgets/download/deb.asciidoc new file mode 100644 index 0000000000..85e4e9c438 --- /dev/null +++ b/docs/en/serverless/transclusion/fleet/tab-widgets/download/deb.asciidoc @@ -0,0 +1,11 @@ +[IMPORTANT] +==== +To simplify upgrading to future versions of {agent}, we recommended +that you use the tarball distribution instead of the DEB distribution. +==== + +[source,sh] +---- +curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-{version}-amd64.deb +sudo dpkg -i elastic-agent-{version}-amd64.deb +---- diff --git a/docs/en/serverless/transclusion/fleet/tab-widgets/download/linux.asciidoc b/docs/en/serverless/transclusion/fleet/tab-widgets/download/linux.asciidoc new file mode 100644 index 0000000000..ed8aa3235a --- /dev/null +++ b/docs/en/serverless/transclusion/fleet/tab-widgets/download/linux.asciidoc @@ -0,0 +1,5 @@ +[source,sh] +---- +curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-{version}-linux-x86_64.tar.gz +tar xzvf elastic-agent-{version}-linux-x86_64.tar.gz +---- diff --git a/docs/en/serverless/transclusion/fleet/tab-widgets/download/mac.asciidoc b/docs/en/serverless/transclusion/fleet/tab-widgets/download/mac.asciidoc new file mode 100644 index 0000000000..8f5a474e73 --- /dev/null +++ b/docs/en/serverless/transclusion/fleet/tab-widgets/download/mac.asciidoc @@ -0,0 +1,5 @@ +[source,sh] +---- +curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-{version}-darwin-x86_64.tar.gz +tar xzvf elastic-agent-{version}-darwin-x86_64.tar.gz +---- diff --git a/docs/en/serverless/transclusion/fleet/tab-widgets/download/rpm.asciidoc b/docs/en/serverless/transclusion/fleet/tab-widgets/download/rpm.asciidoc new file mode 100644 index 0000000000..a47754e918 --- /dev/null +++ b/docs/en/serverless/transclusion/fleet/tab-widgets/download/rpm.asciidoc @@ -0,0 +1,11 @@ +[IMPORTANT] +==== +To simplify upgrading to future versions of {agent}, we recommended +that you use the tarball distribution instead of the RPM distribution. +==== + +[source,sh] +---- +curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-{version}-x86_64.rpm +sudo rpm -vi elastic-agent-{version}-x86_64.rpm +---- diff --git a/docs/en/serverless/transclusion/fleet/tab-widgets/download/win.asciidoc b/docs/en/serverless/transclusion/fleet/tab-widgets/download/win.asciidoc new file mode 100644 index 0000000000..aeaa72430c --- /dev/null +++ b/docs/en/serverless/transclusion/fleet/tab-widgets/download/win.asciidoc @@ -0,0 +1,12 @@ +[source,powershell] +---- +# PowerShell 5.0+ +wget https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-{version}-windows-x86_64.zip -OutFile elastic-agent-{version}-windows-x86_64.zip +Expand-Archive .\elastic-agent-{version}-windows-x86_64.zip +---- + +Or manually: + +. Download the {agent} Windows zip file from the +https://www.elastic.co/downloads/beats/elastic-agent[download page]. +. Extract the contents of the zip file. diff --git a/docs/en/serverless/transclusion/fleet/tab-widgets/run-standalone-widget.asciidoc b/docs/en/serverless/transclusion/fleet/tab-widgets/run-standalone-widget.asciidoc new file mode 100644 index 0000000000..548d6f6eea --- /dev/null +++ b/docs/en/serverless/transclusion/fleet/tab-widgets/run-standalone-widget.asciidoc @@ -0,0 +1,53 @@ + + +++++ +<div class="tabs" data-tab-group="transclusion-fleet-tab-widgets-run-standalone-widget"> + <div role="tablist" aria-label="transclusion-fleet-tab-widgets-run-standalone-widget"> + <button role="tab" aria-selected="true" aria-controls="transclusion-fleet-tab-widgets-run-standalone-widget-macos-panel" id="transclusion-fleet-tab-widgets-run-standalone-widget-macos-button"> + macOS + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-fleet-tab-widgets-run-standalone-widget-linux-panel" id="transclusion-fleet-tab-widgets-run-standalone-widget-linux-button" tabindex="-1"> + Linux + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-fleet-tab-widgets-run-standalone-widget-windows-panel" id="transclusion-fleet-tab-widgets-run-standalone-widget-windows-button" tabindex="-1"> + Windows + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-fleet-tab-widgets-run-standalone-widget-deb-panel" id="transclusion-fleet-tab-widgets-run-standalone-widget-deb-button" tabindex="-1"> + DEB + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-fleet-tab-widgets-run-standalone-widget-rpm-panel" id="transclusion-fleet-tab-widgets-run-standalone-widget-rpm-button" tabindex="-1"> + RPM + </button> + </div> + <div tabindex="0" role="tabpanel" id="transclusion-fleet-tab-widgets-run-standalone-widget-macos-panel" aria-labelledby="transclusion-fleet-tab-widgets-run-standalone-widget-macos-button"> +++++ +include::./run-standalone/content/mac.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-fleet-tab-widgets-run-standalone-widget-linux-panel" aria-labelledby="transclusion-fleet-tab-widgets-run-standalone-widget-linux-button" hidden=""> +++++ +include::./run-standalone/content/linux.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-fleet-tab-widgets-run-standalone-widget-windows-panel" aria-labelledby="transclusion-fleet-tab-widgets-run-standalone-widget-windows-button" hidden=""> +++++ +include::./run-standalone/content/win.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-fleet-tab-widgets-run-standalone-widget-deb-panel" aria-labelledby="transclusion-fleet-tab-widgets-run-standalone-widget-deb-button" hidden=""> +++++ +include::./run-standalone/content/deb.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-fleet-tab-widgets-run-standalone-widget-rpm-panel" aria-labelledby="transclusion-fleet-tab-widgets-run-standalone-widget-rpm-button" hidden=""> +++++ +include::./run-standalone/content/rpm.asciidoc[] + +++++ + </div> +</div> +++++ diff --git a/docs/en/serverless/transclusion/fleet/tab-widgets/run-standalone/content/deb.asciidoc b/docs/en/serverless/transclusion/fleet/tab-widgets/run-standalone/content/deb.asciidoc new file mode 100644 index 0000000000..b1af19e084 --- /dev/null +++ b/docs/en/serverless/transclusion/fleet/tab-widgets/run-standalone/content/deb.asciidoc @@ -0,0 +1,15 @@ +[TIP] +==== +You must run this command as the root user because some +integrations require root privileges to collect sensitive data. +==== + +[source,shell] +---- +sudo systemctl enable elastic-agent <1> +sudo systemctl start elastic-agent +---- + +<1> The DEB package includes a service unit for Linux systems with systemd. On +these systems, you can manage {agent} by using the usual systemd commands. If +you don't have systemd, run `sudo service elastic-agent start`. diff --git a/docs/en/serverless/transclusion/fleet/tab-widgets/run-standalone/content/linux.asciidoc b/docs/en/serverless/transclusion/fleet/tab-widgets/run-standalone/content/linux.asciidoc new file mode 100644 index 0000000000..cd317a4d83 --- /dev/null +++ b/docs/en/serverless/transclusion/fleet/tab-widgets/run-standalone/content/linux.asciidoc @@ -0,0 +1,10 @@ +[TIP] +==== +You must run this command as the root user because some +integrations require root privileges to collect sensitive data. +==== + +[source,shell] +---- +sudo ./elastic-agent install +---- diff --git a/docs/en/serverless/transclusion/fleet/tab-widgets/run-standalone/content/mac.asciidoc b/docs/en/serverless/transclusion/fleet/tab-widgets/run-standalone/content/mac.asciidoc new file mode 100644 index 0000000000..cd317a4d83 --- /dev/null +++ b/docs/en/serverless/transclusion/fleet/tab-widgets/run-standalone/content/mac.asciidoc @@ -0,0 +1,10 @@ +[TIP] +==== +You must run this command as the root user because some +integrations require root privileges to collect sensitive data. +==== + +[source,shell] +---- +sudo ./elastic-agent install +---- diff --git a/docs/en/serverless/transclusion/fleet/tab-widgets/run-standalone/content/rpm.asciidoc b/docs/en/serverless/transclusion/fleet/tab-widgets/run-standalone/content/rpm.asciidoc new file mode 100644 index 0000000000..ace6c3593a --- /dev/null +++ b/docs/en/serverless/transclusion/fleet/tab-widgets/run-standalone/content/rpm.asciidoc @@ -0,0 +1,15 @@ +[TIP] +==== +You must run this command as the root user because some +integrations require root privileges to collect sensitive data. +==== + +[source,shell] +---- +sudo systemctl enable elastic-agent <1> +sudo systemctl start elastic-agent +---- + +<1> The RPM package includes a service unit for Linux systems with systemd. On +these systems, you can manage {agent} by using the usual systemd commands. If +you don't have systemd, run `sudo service elastic-agent start`. diff --git a/docs/en/serverless/transclusion/fleet/tab-widgets/run-standalone/content/win.asciidoc b/docs/en/serverless/transclusion/fleet/tab-widgets/run-standalone/content/win.asciidoc new file mode 100644 index 0000000000..98f60d6efb --- /dev/null +++ b/docs/en/serverless/transclusion/fleet/tab-widgets/run-standalone/content/win.asciidoc @@ -0,0 +1,10 @@ +Open a PowerShell prompt as an Administrator (right-click the PowerShell icon +and select **Run As Administrator**). + +From the PowerShell prompt, change to the directory where you installed {agent}, +and run: + +[source,shell] +---- +.\elastic-agent.exe install +---- diff --git a/docs/en/serverless/transclusion/fleet/tab-widgets/start-widget.asciidoc b/docs/en/serverless/transclusion/fleet/tab-widgets/start-widget.asciidoc new file mode 100644 index 0000000000..32dc42652c --- /dev/null +++ b/docs/en/serverless/transclusion/fleet/tab-widgets/start-widget.asciidoc @@ -0,0 +1,53 @@ + + +++++ +<div class="tabs" data-tab-group="transclusion-fleet-tab-widgets-start-widget"> + <div role="tablist" aria-label="transclusion-fleet-tab-widgets-start-widget"> + <button role="tab" aria-selected="true" aria-controls="transclusion-fleet-tab-widgets-start-widget-macos-panel" id="transclusion-fleet-tab-widgets-start-widget-macos-button"> + macOS + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-fleet-tab-widgets-start-widget-linux-panel" id="transclusion-fleet-tab-widgets-start-widget-linux-button" tabindex="-1"> + Linux + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-fleet-tab-widgets-start-widget-windows-panel" id="transclusion-fleet-tab-widgets-start-widget-windows-button" tabindex="-1"> + Windows + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-fleet-tab-widgets-start-widget-deb-panel" id="transclusion-fleet-tab-widgets-start-widget-deb-button" tabindex="-1"> + DEB + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-fleet-tab-widgets-start-widget-rpm-panel" id="transclusion-fleet-tab-widgets-start-widget-rpm-button" tabindex="-1"> + RPM + </button> + </div> + <div tabindex="0" role="tabpanel" id="transclusion-fleet-tab-widgets-start-widget-macos-panel" aria-labelledby="transclusion-fleet-tab-widgets-start-widget-macos-button"> +++++ +include::./start/mac.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-fleet-tab-widgets-start-widget-linux-panel" aria-labelledby="transclusion-fleet-tab-widgets-start-widget-linux-button" hidden=""> +++++ +include::./start/linux.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-fleet-tab-widgets-start-widget-windows-panel" aria-labelledby="transclusion-fleet-tab-widgets-start-widget-windows-button" hidden=""> +++++ +include::./start/win.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-fleet-tab-widgets-start-widget-deb-panel" aria-labelledby="transclusion-fleet-tab-widgets-start-widget-deb-button" hidden=""> +++++ +include::./start/deb.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-fleet-tab-widgets-start-widget-rpm-panel" aria-labelledby="transclusion-fleet-tab-widgets-start-widget-rpm-button" hidden=""> +++++ +include::./start/rpm.asciidoc[] + +++++ + </div> +</div> +++++ diff --git a/docs/en/serverless/transclusion/fleet/tab-widgets/start/deb.asciidoc b/docs/en/serverless/transclusion/fleet/tab-widgets/start/deb.asciidoc new file mode 100644 index 0000000000..56ef404972 --- /dev/null +++ b/docs/en/serverless/transclusion/fleet/tab-widgets/start/deb.asciidoc @@ -0,0 +1,20 @@ +The DEB package includes a service unit for Linux systems with systemd. On these +systems, you can manage {agent} by using the usual systemd commands. + +// tag::start-command[] + +Use `systemctl` to start the agent: + +[source,shell] +---- +sudo systemctl start elastic-agent +---- + +Otherwise, use: + +[source,shell] +---- +sudo service elastic-agent start +---- + +// end::start-command[] diff --git a/docs/en/serverless/transclusion/fleet/tab-widgets/start/linux.asciidoc b/docs/en/serverless/transclusion/fleet/tab-widgets/start/linux.asciidoc new file mode 100644 index 0000000000..bdb8d7bbc0 --- /dev/null +++ b/docs/en/serverless/transclusion/fleet/tab-widgets/start/linux.asciidoc @@ -0,0 +1,4 @@ +[source,shell] +---- +sudo service elastic-agent start +---- diff --git a/docs/en/serverless/transclusion/fleet/tab-widgets/start/mac.asciidoc b/docs/en/serverless/transclusion/fleet/tab-widgets/start/mac.asciidoc new file mode 100644 index 0000000000..93b377bad1 --- /dev/null +++ b/docs/en/serverless/transclusion/fleet/tab-widgets/start/mac.asciidoc @@ -0,0 +1,4 @@ +[source,shell] +---- +sudo launchctl load /Library/LaunchDaemons/co.elastic.elastic-agent.plist +---- diff --git a/docs/en/serverless/transclusion/fleet/tab-widgets/start/rpm.asciidoc b/docs/en/serverless/transclusion/fleet/tab-widgets/start/rpm.asciidoc new file mode 100644 index 0000000000..1689335e28 --- /dev/null +++ b/docs/en/serverless/transclusion/fleet/tab-widgets/start/rpm.asciidoc @@ -0,0 +1,20 @@ +The RPM package includes a service unit for Linux systems with systemd. On these +systems, you can manage {agent} by using the usual systemd commands. + +// tag::start-command[] + +Use `systemctl` to start the agent: + +[source,shell] +---- +sudo systemctl start elastic-agent +---- + +Otherwise, use: + +[source,shell] +---- +sudo service elastic-agent start +---- + +// end::start-command[] diff --git a/docs/en/serverless/transclusion/fleet/tab-widgets/start/win.asciidoc b/docs/en/serverless/transclusion/fleet/tab-widgets/start/win.asciidoc new file mode 100644 index 0000000000..f996204532 --- /dev/null +++ b/docs/en/serverless/transclusion/fleet/tab-widgets/start/win.asciidoc @@ -0,0 +1,4 @@ +[source,shell] +---- +Start-Service Elastic Agent +---- diff --git a/docs/en/serverless/transclusion/fleet/tab-widgets/stop-widget.asciidoc b/docs/en/serverless/transclusion/fleet/tab-widgets/stop-widget.asciidoc new file mode 100644 index 0000000000..e5e529f93d --- /dev/null +++ b/docs/en/serverless/transclusion/fleet/tab-widgets/stop-widget.asciidoc @@ -0,0 +1,53 @@ + + +++++ +<div class="tabs" data-tab-group="transclusion-fleet-tab-widgets-stop-widget"> + <div role="tablist" aria-label="transclusion-fleet-tab-widgets-stop-widget"> + <button role="tab" aria-selected="true" aria-controls="transclusion-fleet-tab-widgets-stop-widget-macos-panel" id="transclusion-fleet-tab-widgets-stop-widget-macos-button"> + macOS + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-fleet-tab-widgets-stop-widget-linux-panel" id="transclusion-fleet-tab-widgets-stop-widget-linux-button" tabindex="-1"> + Linux + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-fleet-tab-widgets-stop-widget-windows-panel" id="transclusion-fleet-tab-widgets-stop-widget-windows-button" tabindex="-1"> + Windows + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-fleet-tab-widgets-stop-widget-deb-panel" id="transclusion-fleet-tab-widgets-stop-widget-deb-button" tabindex="-1"> + DEB + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-fleet-tab-widgets-stop-widget-rpm-panel" id="transclusion-fleet-tab-widgets-stop-widget-rpm-button" tabindex="-1"> + RPM + </button> + </div> + <div tabindex="0" role="tabpanel" id="transclusion-fleet-tab-widgets-stop-widget-macos-panel" aria-labelledby="transclusion-fleet-tab-widgets-stop-widget-macos-button"> +++++ +include::./stop/mac.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-fleet-tab-widgets-stop-widget-linux-panel" aria-labelledby="transclusion-fleet-tab-widgets-stop-widget-linux-button" hidden=""> +++++ +include::./stop/linux.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-fleet-tab-widgets-stop-widget-windows-panel" aria-labelledby="transclusion-fleet-tab-widgets-stop-widget-windows-button" hidden=""> +++++ +include::./stop/win.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-fleet-tab-widgets-stop-widget-deb-panel" aria-labelledby="transclusion-fleet-tab-widgets-stop-widget-deb-button" hidden=""> +++++ +include::./stop/deb.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-fleet-tab-widgets-stop-widget-rpm-panel" aria-labelledby="transclusion-fleet-tab-widgets-stop-widget-rpm-button" hidden=""> +++++ +include::./stop/rpm.asciidoc[] + +++++ + </div> +</div> +++++ diff --git a/docs/en/serverless/transclusion/fleet/tab-widgets/stop/deb.asciidoc b/docs/en/serverless/transclusion/fleet/tab-widgets/stop/deb.asciidoc new file mode 100644 index 0000000000..8cad0af59a --- /dev/null +++ b/docs/en/serverless/transclusion/fleet/tab-widgets/stop/deb.asciidoc @@ -0,0 +1,25 @@ +The DEB package includes a service unit for Linux systems with systemd. On these +systems, you can manage {agent} by using the usual systemd commands. + +// tag::stop-command[] + +Use `systemctl` to stop the agent: + +[source,shell] +---- +sudo systemctl stop elastic-agent +---- + +Otherwise, use: + +[source,shell] +---- +sudo service elastic-agent stop +---- + +[NOTE] +==== +{agent} will restart automatically if the system is rebooted. +==== + +// end::stop-command[] diff --git a/docs/en/serverless/transclusion/fleet/tab-widgets/stop/linux.asciidoc b/docs/en/serverless/transclusion/fleet/tab-widgets/stop/linux.asciidoc new file mode 100644 index 0000000000..5194e9989e --- /dev/null +++ b/docs/en/serverless/transclusion/fleet/tab-widgets/stop/linux.asciidoc @@ -0,0 +1,9 @@ +[source,shell] +---- +sudo service elastic-agent stop +---- + +[NOTE] +==== +{agent} will restart automatically if the system is rebooted. +==== diff --git a/docs/en/serverless/transclusion/fleet/tab-widgets/stop/mac.asciidoc b/docs/en/serverless/transclusion/fleet/tab-widgets/stop/mac.asciidoc new file mode 100644 index 0000000000..c64a311506 --- /dev/null +++ b/docs/en/serverless/transclusion/fleet/tab-widgets/stop/mac.asciidoc @@ -0,0 +1,9 @@ +[source,shell] +---- +sudo launchctl unload /Library/LaunchDaemons/co.elastic.elastic-agent.plist +---- + +[NOTE] +==== +{agent} will restart automatically if the system is rebooted. +==== diff --git a/docs/en/serverless/transclusion/fleet/tab-widgets/stop/rpm.asciidoc b/docs/en/serverless/transclusion/fleet/tab-widgets/stop/rpm.asciidoc new file mode 100644 index 0000000000..57f7b70ca1 --- /dev/null +++ b/docs/en/serverless/transclusion/fleet/tab-widgets/stop/rpm.asciidoc @@ -0,0 +1,25 @@ +The RPM package includes a service unit for Linux systems with systemd. On these +systems, you can manage {agent} by using the usual systemd commands. + +// tag::stop-command[] + +Use `systemctl` to stop the agent: + +[source,shell] +---- +sudo systemctl stop elastic-agent +---- + +Otherwise, use: + +[source,shell] +---- +sudo service elastic-agent stop +---- + +[NOTE] +==== +{agent} will restart automatically if the system is rebooted. +==== + +// end::stop-command[] diff --git a/docs/en/serverless/transclusion/fleet/tab-widgets/stop/win.asciidoc b/docs/en/serverless/transclusion/fleet/tab-widgets/stop/win.asciidoc new file mode 100644 index 0000000000..3c369383ea --- /dev/null +++ b/docs/en/serverless/transclusion/fleet/tab-widgets/stop/win.asciidoc @@ -0,0 +1,12 @@ +[source,shell] +---- +Stop-Service Elastic Agent +---- + +If necessary, use Task Manager on Windows to stop {agent}. This will kill the +`elastic-agent` process and any sub-processes it created (such as {beats}). + +[NOTE] +==== +{agent} will restart automatically if the system is rebooted. +==== diff --git a/docs/en/serverless/transclusion/host-details.asciidoc b/docs/en/serverless/transclusion/host-details.asciidoc new file mode 100644 index 0000000000..59147da7b1 --- /dev/null +++ b/docs/en/serverless/transclusion/host-details.asciidoc @@ -0,0 +1,128 @@ +// This is collapsed by default + +.Overview +[%collapsible] +===== +The **Overview** tab displays key metrics about the selected host, such as CPU usage, +normalized load, memory usage, and max disk usage. + +Change the time range to view metrics over a specific period of time. + +Expand each section to view more detail related to the selected host, such as metadata, +active alerts, services detected on the host, and metrics. + +Hover over a specific time period on a chart to compare the various metrics at that given time. + +Click **Show all** to drill down into related data. + +[role="screenshot"] +image::images/overview-overlay.png[Host overview] +===== + +.Metadata +[%collapsible] +===== +The **Metadata** tab lists all the meta information relating to the host, +including host, cloud, and agent information. + +This information can help when investigating events—for example, +when filtering by operating system or architecture. + +[role="screenshot"] +image::images/metadata-overlay.png[Host metadata] +===== + +.Metrics +[%collapsible] +===== +The **Metrics** tab shows host metrics organized by type and is more complete than the view available in the _Overview_ tab. + +[role="screenshot"] +image::images/metrics-overlay.png[Metrics] +===== + +.Processes +[%collapsible] +===== +The **Processes** tab lists the total number of processes (`system.process.summary.total`) running on the host, +along with the total number of processes in these various states: + +* Running (`system.process.summary.running`) +* Sleeping (`system.process.summary.sleeping`) +* Stopped (`system.process.summary.stopped`) +* Idle (`system.process.summary.idle`) +* Dead (`system.process.summary.dead`) +* Zombie (`system.process.summary.zombie`) +* Unknown (`system.process.summary.unknown`) + +The processes listed in the **Top processes** table are based on an aggregation of the top CPU and the top memory consuming processes. +The number of top processes is controlled by `process.include_top_n.by_cpu` and `process.include_top_n.by_memory`. + +|=== +| | + +| **Command** +| Full command line that started the process, including the absolute path to the executable, and all the arguments (`system.process.cmdline`). + +| **PID** +| Process id (`process.pid`). + +| **User** +| User name (`user.name`). + +| **CPU** +| The percentage of CPU time spent by the process since the last event (`system.process.cpu.total.pct`). + +| **Time** +| The time the process started (`system.process.cpu.start_time`). + +| **Memory** +| The percentage of memory (`system.process.memory.rss.pct`) the process occupied in main memory (RAM). + +| **State** +| The current state of the process and the total number of processes (`system.process.state`). Expected values are: `running`, `sleeping`, `dead`, `stopped`, `idle`, `zombie`, and `unknown`. +|=== + +[role="screenshot"] +image::images/processes-overlay.png[Host processes] +===== + +.Logs +[%collapsible] +===== +The **Logs** tab displays logs relating to the host that you have selected. By default, the logs tab displays the following columns. + +|=== +| | + +| **Timestamp** +| The timestamp of the log entry from the `timestamp` field. + +| **Message** +| The message extracted from the document. The content of this field depends on the type of log message. If no special log message type is detected, the {ecs-ref}/ecs-base.html[Elastic Common Schema (ECS)] base field, `message`, is used. +|=== + +To view the logs in the {logs-app} for a detailed analysis, click **Open in Logs**. + +[role="screenshot"] +image::images/logs-overlay.png[Host logs] +===== + +.Anomalies +[%collapsible] +===== +The **Anomalies** tab displays a list of each single metric {anomaly-detect} job for the specific host. By default, anomaly +jobs are sorted by time, showing the most recent jobs first. + +Along with the name of each anomaly job, detected anomalies with a severity score equal to 50 or higher are listed. These +scores represent a severity of "warning" or higher in the selected time period. The **summary** value represents the increase between +the actual value and the expected ("typical") value of the host metric in the anomaly record result. + +To drill down and analyze the metric anomaly, select **Actions** → **Open in Anomaly Explorer**. +You can also select **Actions** → **Show in Inventory** to view the host Inventory page, filtered by the specific metric. + +[role="screenshot"] +image::images/anomalies-overlay.png[Anomalies] +===== + +// TODO: Find out if OSQuery tab will be included in serverless. It does not currently appear in serverless builds diff --git a/docs/en/serverless/transclusion/kibana/apm/service-overview/dependencies.asciidoc b/docs/en/serverless/transclusion/kibana/apm/service-overview/dependencies.asciidoc new file mode 100644 index 0000000000..e57448802b --- /dev/null +++ b/docs/en/serverless/transclusion/kibana/apm/service-overview/dependencies.asciidoc @@ -0,0 +1,9 @@ +The **Dependencies** table displays a list of downstream services or external connections relevant +to the service at the selected time range. The table displays latency, throughput, failed transaction rate, and the impact of +each dependency. By default, dependencies are sorted by _Impact_ to show the most used and the slowest dependency. +If there is a particular dependency you are interested in, click **<<apm-dependencies,View dependencies>>** to learn more about it. + +//// +/* TODO: FIX THIS IMAGE +![Dependencies view in the Applications UI](../../../../images/dependencies/spans-dependencies.png) */ +//// diff --git a/docs/en/serverless/transclusion/kibana/apm/service-overview/ftr.asciidoc b/docs/en/serverless/transclusion/kibana/apm/service-overview/ftr.asciidoc new file mode 100644 index 0000000000..ab0bd415c9 --- /dev/null +++ b/docs/en/serverless/transclusion/kibana/apm/service-overview/ftr.asciidoc @@ -0,0 +1,13 @@ +The failed transaction rate represents the percentage of failed transactions from the perspective of the selected service. +It's useful for visualizing unexpected increases, decreases, or irregular patterns in a service's transactions. + +[TIP] +==== +HTTP **transactions** from the HTTP server perspective do not consider a `4xx` status code (client error) as a failure +because the failure was caused by the caller, not the HTTP server. Thus, `event.outcome=success` and there will be no increase in failed transaction rate. + +HTTP **spans** from the client perspective however, are considered failures if the HTTP status code is ≥ 400. +These spans will set `event.outcome=failure` and increase the failed transaction rate. + +If there is no HTTP status, both transactions and spans are considered successful unless an error is reported. +==== diff --git a/docs/en/serverless/transclusion/kibana/apm/service-overview/throughput-transactions.asciidoc b/docs/en/serverless/transclusion/kibana/apm/service-overview/throughput-transactions.asciidoc new file mode 100644 index 0000000000..4de89d8b09 --- /dev/null +++ b/docs/en/serverless/transclusion/kibana/apm/service-overview/throughput-transactions.asciidoc @@ -0,0 +1,14 @@ +The **Throughput** chart visualizes the average number of transactions per minute for the selected service. + +The **Transactions** table displays a list of _transaction groups_ for the +selected service and includes the latency, traffic, error rate, and the impact for each transaction. +Transactions that share the same name are grouped, and only one entry is displayed for each group. + +By default, transaction groups are sorted by _Impact_ to show the most used and slowest endpoints in your +service. If there is a particular endpoint you are interested in, click **View transactions** to view a +list of similar transactions on the <<apm-transactions,transactions overview>> page. + +//// +/* TODO: Figure out this image +![Traffic and transactions](../../../../images/services/traffic-transactions.png) */ +//// diff --git a/docs/en/serverless/transclusion/kibana/logs/log-overview.asciidoc b/docs/en/serverless/transclusion/kibana/logs/log-overview.asciidoc new file mode 100644 index 0000000000..6c5d4706d2 --- /dev/null +++ b/docs/en/serverless/transclusion/kibana/logs/log-overview.asciidoc @@ -0,0 +1,6 @@ +Logs provide detailed information about specific events, and are crucial to successfully debugging slow or erroneous transactions. + +If you've correlated your application's logs and traces, you never have to search for relevant data; it's already available to you. Viewing log and trace data together allows you to quickly diagnose and solve problems. + +To learn how to correlate your logs with your instrumented services, +refer to <<correlate-application-logs>>. diff --git a/docs/en/serverless/transclusion/observability/application-logs/apm-agent-log-sending.asciidoc b/docs/en/serverless/transclusion/observability/application-logs/apm-agent-log-sending.asciidoc new file mode 100644 index 0000000000..4ba3817015 --- /dev/null +++ b/docs/en/serverless/transclusion/observability/application-logs/apm-agent-log-sending.asciidoc @@ -0,0 +1,23 @@ +Elastic APM agents can automatically capture and send logs directly to the managed intake service — enabling you to +easily ingest log events without needing a separate log shipper like {filebeat} or {agent}. + +**Supported APM agents/languages** + +* Java + +**Requirements** + +The Elastic APM agent for Java. + +**Pros** + +* Simple to set up as it only relies on the APM agent. +* No modification of the application required. +* No need to deploy {filebeat}. +* No need to store log files in the file system. + +**Cons** + +* Experimental feature. +* Limited APM agent support. +* Not resilient to outages. Log messages can be dropped when buffered in the agent or in the managed intake service. diff --git a/docs/en/serverless/transclusion/observability/application-logs/correlate-logs.asciidoc b/docs/en/serverless/transclusion/observability/application-logs/correlate-logs.asciidoc new file mode 100644 index 0000000000..9cb154b0a2 --- /dev/null +++ b/docs/en/serverless/transclusion/observability/application-logs/correlate-logs.asciidoc @@ -0,0 +1,14 @@ +Correlate your application logs with trace events to: + +* view the context of a log and the parameters provided by a user +* view all logs belonging to a particular trace +* easily move between logs and traces when debugging application issues + +Learn more about log correlation in the agent-specific ingestion guides: + +* {apm-go-ref}/logs.html[Go] +* {apm-java-ref}/logs.html#log-correlation-ids[Java] +* {apm-dotnet-ref}/log-correlation.html[.NET] +* {apm-node-ref}/log-correlation.html[Node.js] +* {apm-py-ref}/logs.html#log-correlation-ids[Python] +* {apm-ruby-ref}/log-correlation.html[Ruby] diff --git a/docs/en/serverless/transclusion/observability/application-logs/ecs-logging-logs.asciidoc b/docs/en/serverless/transclusion/observability/application-logs/ecs-logging-logs.asciidoc new file mode 100644 index 0000000000..4a41a84f59 --- /dev/null +++ b/docs/en/serverless/transclusion/observability/application-logs/ecs-logging-logs.asciidoc @@ -0,0 +1,21 @@ +Elastic Common Schema (ECS) loggers format your logs into ECS-compatible JSON, +removing the need to manually parse logs. + +**Requirements** + +* (Optional) Elastic APM agent for your programming language (for log correlation) +* The Elastic ECS logger for your language or framework +* {filebeat} configured to monitor and capture application logs + +**Pros** + +* Popular logging frameworks supported +* Simplicity: no manual parsing with {filebeat}, and a configuration can be reused across applications +* Decently human-readable JSON structure +* APM log correlation +* Resilient in case of outages + +**Cons** + +* Not all frameworks are supported +* Requires modification of the application and its log configuration diff --git a/docs/en/serverless/transclusion/observability/application-logs/log-reformatting.asciidoc b/docs/en/serverless/transclusion/observability/application-logs/log-reformatting.asciidoc new file mode 100644 index 0000000000..36d905c127 --- /dev/null +++ b/docs/en/serverless/transclusion/observability/application-logs/log-reformatting.asciidoc @@ -0,0 +1,26 @@ +Elastic APM agents can automatically reformat application logs to Elastic Common Schema (ECS) format +without needing to add an ECS logger dependency or modify the application. + +**Requirements** + +* The Elastic APM agent for your programming language +* {filebeat} configured to monitor and capture application logs + +**Pros** + +All the benefits of using ECS logging, without having to modify the application or its configuration: + +* Simplicity: no manual parsing with {filebeat}, and a configuration can be reused across applications +* Decently human-readable JSON structure +* APM log correlation + +**Cons** + +* Requires an Elastic APM agent +* Not all APM agents support this feature + +**Supported APM agents/languages** + +* Ruby +* Python +* Java diff --git a/docs/en/serverless/transclusion/observability/application-logs/plaintext-logs.asciidoc b/docs/en/serverless/transclusion/observability/application-logs/plaintext-logs.asciidoc new file mode 100644 index 0000000000..4b162ca7b1 --- /dev/null +++ b/docs/en/serverless/transclusion/observability/application-logs/plaintext-logs.asciidoc @@ -0,0 +1,19 @@ +Use {filebeat} to parse and ingest raw, plain-text application logs. + +**Requirements** + +* (Optional) Elastic APM agent for your programming language (for log correlation) +* Raw, plain-text application logs stored on the file system +* {filebeat} configured to monitor and capture application logs + +**Pros** + +* All programming languages/frameworks are supported +* Existing application logs can be ingested +* Does not require modification of the application or its configuration, unless log correlation is required + +**Cons** + +* Must parse application logs to be useful—meaning writing and maintaining Grok patterns and spending CPU cycles on parsing +* Parsing is tied to the application log format, meaning it can differ per application and needs to be maintained over time +* Log correlation requires modifying the application log format and inject IDs in log messages diff --git a/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/deb.asciidoc b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/deb.asciidoc new file mode 100644 index 0000000000..800b7676a2 --- /dev/null +++ b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/deb.asciidoc @@ -0,0 +1,5 @@ +[source,sh] +---- +curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-{version}-amd64.deb +sudo dpkg -i filebeat-{version}-amd64.deb +---- diff --git a/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/linux.asciidoc b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/linux.asciidoc new file mode 100644 index 0000000000..b678409fc7 --- /dev/null +++ b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/linux.asciidoc @@ -0,0 +1,5 @@ +[source,sh] +---- +curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-{version}-linux-x86_64.tar.gz +tar xzvf filebeat-{version}-linux-x86_64.tar.gz +---- diff --git a/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/macos.asciidoc b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/macos.asciidoc new file mode 100644 index 0000000000..827f7ba922 --- /dev/null +++ b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/macos.asciidoc @@ -0,0 +1,5 @@ +[source,sh] +---- +curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-{version}-darwin-x86_64.tar.gz +tar xzvf filebeat-{version}-darwin-x86_64.tar.gz +---- diff --git a/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/rpm.asciidoc b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/rpm.asciidoc new file mode 100644 index 0000000000..2ee8725c08 --- /dev/null +++ b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/rpm.asciidoc @@ -0,0 +1,5 @@ +[source,sh] +---- +curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-{version}-x86_64.rpm +sudo rpm -vi filebeat-{version}-x86_64.rpm +---- diff --git a/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/windows.asciidoc b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/windows.asciidoc new file mode 100644 index 0000000000..7fcef2fe02 --- /dev/null +++ b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/windows.asciidoc @@ -0,0 +1,18 @@ +. Download the {filebeat} Windows zip file: https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-{version}-windows-x86_64.zip[https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-{version}-windows-x86_64.zip] +. Extract the contents of the zip file into `C:\Program Files`. +. Rename the `filebeat-((version))-windows-x86_64` directory to `((filebeat))`. +. Open a PowerShell prompt as an Administrator (right-click the PowerShell icon +and select **Run As Administrator**). +. From the PowerShell prompt, run the following commands to install +{filebeat} as a Windows service: ++ +[source,powershell] +---- +PS > cd 'C:\Program Files\{filebeat}' +PS C:\Program Files\{filebeat}> .\install-service-filebeat.ps1 +---- + +If script execution is disabled on your system, you need to set the +execution policy for the current session to allow the script to run. For +example: +`PowerShell.exe -ExecutionPolicy UnRestricted -File .\install-service-filebeat.ps1`. diff --git a/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/widget.asciidoc b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/widget.asciidoc new file mode 100644 index 0000000000..dd4ac755b2 --- /dev/null +++ b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/widget.asciidoc @@ -0,0 +1,53 @@ + + +++++ +<div class="tabs" data-tab-group="transclusion-observability-tab-widgets-filebeat-install-widget"> + <div role="tablist" aria-label="transclusion-observability-tab-widgets-filebeat-install-widget"> + <button role="tab" aria-selected="true" aria-controls="transclusion-observability-tab-widgets-filebeat-install-widget-macos-panel" id="transclusion-observability-tab-widgets-filebeat-install-widget-macos-button"> + macOS + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-observability-tab-widgets-filebeat-install-widget-linux-panel" id="transclusion-observability-tab-widgets-filebeat-install-widget-linux-button" tabindex="-1"> + Linux + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-observability-tab-widgets-filebeat-install-widget-windows-panel" id="transclusion-observability-tab-widgets-filebeat-install-widget-windows-button" tabindex="-1"> + Windows + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-observability-tab-widgets-filebeat-install-widget-deb-panel" id="transclusion-observability-tab-widgets-filebeat-install-widget-deb-button" tabindex="-1"> + DEB + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-observability-tab-widgets-filebeat-install-widget-rpm-panel" id="transclusion-observability-tab-widgets-filebeat-install-widget-rpm-button" tabindex="-1"> + RPM + </button> + </div> + <div tabindex="0" role="tabpanel" id="transclusion-observability-tab-widgets-filebeat-install-widget-macos-panel" aria-labelledby="transclusion-observability-tab-widgets-filebeat-install-widget-macos-button"> +++++ +include::./content/macos.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-observability-tab-widgets-filebeat-install-widget-linux-panel" aria-labelledby="transclusion-observability-tab-widgets-filebeat-install-widget-linux-button" hidden=""> +++++ +include::./content/linux.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-observability-tab-widgets-filebeat-install-widget-windows-panel" aria-labelledby="transclusion-observability-tab-widgets-filebeat-install-widget-windows-button" hidden=""> +++++ +include::./content/windows.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-observability-tab-widgets-filebeat-install-widget-deb-panel" aria-labelledby="transclusion-observability-tab-widgets-filebeat-install-widget-deb-button" hidden=""> +++++ +include::./content/deb.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-observability-tab-widgets-filebeat-install-widget-rpm-panel" aria-labelledby="transclusion-observability-tab-widgets-filebeat-install-widget-rpm-button" hidden=""> +++++ +include::./content/rpm.asciidoc[] + +++++ + </div> +</div> +++++ diff --git a/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-logs/content/docker.asciidoc b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-logs/content/docker.asciidoc new file mode 100644 index 0000000000..5183851789 --- /dev/null +++ b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-logs/content/docker.asciidoc @@ -0,0 +1,25 @@ +. Make sure your application logs to stdout/stderr. +. Follow the {filebeat-ref}/running-on-docker.html[Run {filebeat} on Docker] guide. +. Enable {filebeat-ref}/configuration-autodiscover-hints.html[hints-based autodiscover]. + +ifdef::ecs_logs[] +. Add these labels to your containers that log using ECS-compatible JSON. This will make sure the logs are parsed appropriately. In `docker-compose.yml`: + +[source,yaml] +---- +labels: + co.elastic.logs/json.overwrite_keys: true <1> + co.elastic.logs/json.add_error_key: true <2> + co.elastic.logs/json.expand_keys: true <3> +---- + +<1> Values from the decoded JSON object overwrite the fields that {filebeat} normally adds (type, source, offset, etc.) in case of conflicts. + +<2> {filebeat} adds an "error.message" and "error.type: json" key in case of JSON unmarshalling errors. + +<3> {filebeat} will recursively de-dot keys in the decoded JSON, and expand them into a hierarchical object structure. +endif::[] + +ifdef::plaintext[] + +endif::[] diff --git a/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-logs/content/kubernetes.asciidoc b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-logs/content/kubernetes.asciidoc new file mode 100644 index 0000000000..3f171135bd --- /dev/null +++ b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-logs/content/kubernetes.asciidoc @@ -0,0 +1,25 @@ +. Make sure your application logs to stdout/stderr. +. Follow the {filebeat-ref}/running-on-kubernetes.html[Run {filebeat} on Kubernetes] guide. +. Enable {filebeat-ref}/configuration-autodiscover-hints.html[hints-based autodiscover] (uncomment the corresponding section in `filebeat-kubernetes.yaml`). + +ifdef::ecs_logs[] +. Add these annotations to your pods that log using ECS-compatible JSON. This will make sure the logs are parsed appropriately. ++ +[source,yaml] +---- +annotations: +co.elastic.logs/json.overwrite_keys: true <1> +co.elastic.logs/json.add_error_key: true <2> +co.elastic.logs/json.expand_keys: true <3> +---- ++ +<1> Values from the decoded JSON object overwrite the fields that {filebeat} normally adds (type, source, offset, etc.) in case of conflicts. ++ +<2> {filebeat} adds an "error.message" and "error.type: json" key in case of JSON unmarshalling errors. ++ +<3> {filebeat} will recursively de-dot keys in the decoded JSON, and expand them into a hierarchical object structure. +endif::[] + +ifdef::plaintext[] + +endif::[] diff --git a/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-logs/content/logs.asciidoc b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-logs/content/logs.asciidoc new file mode 100644 index 0000000000..a6334e036d --- /dev/null +++ b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-logs/content/logs.asciidoc @@ -0,0 +1,58 @@ +ifdef::intro_text[] +. Follow the {filebeat-ref}/filebeat-installation-configuration.html[Filebeat quick start] to learn how to +install {filebeat} and connect to Elastic. +endif::[] + +ifdef::ecs_logs[] +. Add the following configuration to your `filebeat.yaml` file to start collecting log data. + +[source,yaml] +---- +filebeat.inputs: +- type: filestream <1> + paths: /path/to/logs.json + parsers: + - ndjson: + overwrite_keys: true <2> + add_error_key: true <3> + expand_keys: true <4> + fields: + service.name: your_service_name <5> + service.version: your_service_version <5> + service.environment: your_service_environment <5> + +processors: <6> + - add_host_metadata: ~ + - add_cloud_metadata: ~ + - add_docker_metadata: ~ + - add_kubernetes_metadata: ~ +---- + +<1> Use the filestream input to read lines from active log files. + +<2> Values from the decoded JSON object overwrite the fields that {filebeat} normally adds (type, source, offset, etc.) in case of conflicts. + +<3> {filebeat} adds an "error.message" and "error.type: json" key in case of JSON unmarshalling errors. + +<4> {filebeat} will recursively de-dot keys in the decoded JSON, and expand them into a hierarchical object structure. + +<5> The `service.name` (required), `service.version` (optional) and `service.environment` (optional) of the service you're collecting logs from, used for <<correlate-application-logs-log-correlation,Log correlation>>. + +<6> Processors enhance your data. See {filebeat-ref}/filtering-and-enhancing-data.html[processors] to learn more. +endif::[] + +ifdef::plaintext[] +. Configure `filebeat.yaml` file to start collecting log data. +. Add the following configuration to your `filebeat.yaml` file to start collecting log data. + +[source,yaml] +---- +filebeat.inputs: +- type: filestream <1> + paths: /path/to/logs.log <2> +---- + +<1> Reads lines from an active log file. + +<2> A list of glob-based paths that will be crawled and fetched. +endif::[] diff --git a/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-logs/widget.asciidoc b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-logs/widget.asciidoc new file mode 100644 index 0000000000..2d1b77da61 --- /dev/null +++ b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-logs/widget.asciidoc @@ -0,0 +1,35 @@ + + +++++ +<div class="tabs" data-tab-group="transclusion-observability-tab-widgets-filebeat-logs-widget"> + <div role="tablist" aria-label="transclusion-observability-tab-widgets-filebeat-logs-widget"> + <button role="tab" aria-selected="true" aria-controls="transclusion-observability-tab-widgets-filebeat-logs-widget-log-file-panel" id="transclusion-observability-tab-widgets-filebeat-logs-widget-log-file-button"> + Log file + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-observability-tab-widgets-filebeat-logs-widget-kubernetes-panel" id="transclusion-observability-tab-widgets-filebeat-logs-widget-kubernetes-button" tabindex="-1"> + Kubernetes + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-observability-tab-widgets-filebeat-logs-widget-docker-panel" id="transclusion-observability-tab-widgets-filebeat-logs-widget-docker-button" tabindex="-1"> + Docker + </button> + </div> + <div tabindex="0" role="tabpanel" id="transclusion-observability-tab-widgets-filebeat-logs-widget-log-file-panel" aria-labelledby="transclusion-observability-tab-widgets-filebeat-logs-widget-log-file-button"> +++++ +include::./content/logs.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-observability-tab-widgets-filebeat-logs-widget-kubernetes-panel" aria-labelledby="transclusion-observability-tab-widgets-filebeat-logs-widget-kubernetes-button" hidden=""> +++++ +include::./content/kubernetes.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-observability-tab-widgets-filebeat-logs-widget-docker-panel" aria-labelledby="transclusion-observability-tab-widgets-filebeat-logs-widget-docker-button" hidden=""> +++++ +include::./content/docker.asciidoc[] + +++++ + </div> +</div> +++++ diff --git a/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-setup/content/deb.asciidoc b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-setup/content/deb.asciidoc new file mode 100644 index 0000000000..8c611bd510 --- /dev/null +++ b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-setup/content/deb.asciidoc @@ -0,0 +1,4 @@ +[source,shell] +---- +filebeat setup --index-management +---- diff --git a/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-setup/content/linux.asciidoc b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-setup/content/linux.asciidoc new file mode 100644 index 0000000000..17682364ff --- /dev/null +++ b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-setup/content/linux.asciidoc @@ -0,0 +1,4 @@ +[source,shell] +---- +./filebeat setup --index-management +---- diff --git a/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-setup/content/macos.asciidoc b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-setup/content/macos.asciidoc new file mode 100644 index 0000000000..17682364ff --- /dev/null +++ b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-setup/content/macos.asciidoc @@ -0,0 +1,4 @@ +[source,shell] +---- +./filebeat setup --index-management +---- diff --git a/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-setup/content/rpm.asciidoc b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-setup/content/rpm.asciidoc new file mode 100644 index 0000000000..7610df4547 --- /dev/null +++ b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-setup/content/rpm.asciidoc @@ -0,0 +1,4 @@ +[source,sh] +---- +filebeat setup --index-management +---- diff --git a/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-setup/content/windows.asciidoc b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-setup/content/windows.asciidoc new file mode 100644 index 0000000000..33dffda22a --- /dev/null +++ b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-setup/content/windows.asciidoc @@ -0,0 +1,4 @@ +[source,powershell] +---- +PS > .\filebeat.exe setup --index-management +---- diff --git a/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-setup/widget.asciidoc b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-setup/widget.asciidoc new file mode 100644 index 0000000000..704c19ca11 --- /dev/null +++ b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-setup/widget.asciidoc @@ -0,0 +1,53 @@ + + +++++ +<div class="tabs" data-tab-group="transclusion-observability-tab-widgets-filebeat-setup-widget"> + <div role="tablist" aria-label="transclusion-observability-tab-widgets-filebeat-setup-widget"> + <button role="tab" aria-selected="true" aria-controls="transclusion-observability-tab-widgets-filebeat-setup-widget-macos-panel" id="transclusion-observability-tab-widgets-filebeat-setup-widget-macos-button"> + macOS + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-observability-tab-widgets-filebeat-setup-widget-linux-panel" id="transclusion-observability-tab-widgets-filebeat-setup-widget-linux-button" tabindex="-1"> + Linux + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-observability-tab-widgets-filebeat-setup-widget-windows-panel" id="transclusion-observability-tab-widgets-filebeat-setup-widget-windows-button" tabindex="-1"> + Windows + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-observability-tab-widgets-filebeat-setup-widget-deb-panel" id="transclusion-observability-tab-widgets-filebeat-setup-widget-deb-button" tabindex="-1"> + DEB + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-observability-tab-widgets-filebeat-setup-widget-rpm-panel" id="transclusion-observability-tab-widgets-filebeat-setup-widget-rpm-button" tabindex="-1"> + RPM + </button> + </div> + <div tabindex="0" role="tabpanel" id="transclusion-observability-tab-widgets-filebeat-setup-widget-macos-panel" aria-labelledby="transclusion-observability-tab-widgets-filebeat-setup-widget-macos-button"> +++++ +include::./content/macos.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-observability-tab-widgets-filebeat-setup-widget-linux-panel" aria-labelledby="transclusion-observability-tab-widgets-filebeat-setup-widget-linux-button" hidden=""> +++++ +include::./content/linux.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-observability-tab-widgets-filebeat-setup-widget-windows-panel" aria-labelledby="transclusion-observability-tab-widgets-filebeat-setup-widget-windows-button" hidden=""> +++++ +include::./content/windows.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-observability-tab-widgets-filebeat-setup-widget-deb-panel" aria-labelledby="transclusion-observability-tab-widgets-filebeat-setup-widget-deb-button" hidden=""> +++++ +include::./content/deb.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-observability-tab-widgets-filebeat-setup-widget-rpm-panel" aria-labelledby="transclusion-observability-tab-widgets-filebeat-setup-widget-rpm-button" hidden=""> +++++ +include::./content/rpm.asciidoc[] + +++++ + </div> +</div> +++++ diff --git a/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-start/content/deb.asciidoc b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-start/content/deb.asciidoc new file mode 100644 index 0000000000..0c86239955 --- /dev/null +++ b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-start/content/deb.asciidoc @@ -0,0 +1,11 @@ +[source,shell] +---- +sudo service filebeat start +---- + +[NOTE] +==== +If you use an init.d script to start {filebeat}, you can't specify command line flags (refer to {filebeat-ref}/command-line-options.html[Command reference]). To specify flags, start {filebeat} in the foreground. +==== + +Also, refer to {filebeat-ref}/running-with-systemd.html[{filebeat} and systemd]. diff --git a/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-start/content/linux.asciidoc b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-start/content/linux.asciidoc new file mode 100644 index 0000000000..b5abcc1450 --- /dev/null +++ b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-start/content/linux.asciidoc @@ -0,0 +1,10 @@ +[source,shell] +---- +sudo chown root filebeat.yml +sudo ./filebeat -e +---- + +[NOTE] +==== +You'll be running {filebeat} as root, so you need to change ownership of the configuration file and any configurations enabled in the `modules.d` directory, or run {filebeat} with `--strict.perms=false` specified. Refer to {beats-ref}/config-file-permissions.html[Config file ownership and permissions]. +==== diff --git a/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-start/content/macos.asciidoc b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-start/content/macos.asciidoc new file mode 100644 index 0000000000..b5abcc1450 --- /dev/null +++ b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-start/content/macos.asciidoc @@ -0,0 +1,10 @@ +[source,shell] +---- +sudo chown root filebeat.yml +sudo ./filebeat -e +---- + +[NOTE] +==== +You'll be running {filebeat} as root, so you need to change ownership of the configuration file and any configurations enabled in the `modules.d` directory, or run {filebeat} with `--strict.perms=false` specified. Refer to {beats-ref}/config-file-permissions.html[Config file ownership and permissions]. +==== diff --git a/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-start/content/rpm.asciidoc b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-start/content/rpm.asciidoc new file mode 100644 index 0000000000..0c86239955 --- /dev/null +++ b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-start/content/rpm.asciidoc @@ -0,0 +1,11 @@ +[source,shell] +---- +sudo service filebeat start +---- + +[NOTE] +==== +If you use an init.d script to start {filebeat}, you can't specify command line flags (refer to {filebeat-ref}/command-line-options.html[Command reference]). To specify flags, start {filebeat} in the foreground. +==== + +Also, refer to {filebeat-ref}/running-with-systemd.html[{filebeat} and systemd]. diff --git a/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-start/content/windows.asciidoc b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-start/content/windows.asciidoc new file mode 100644 index 0000000000..9aa2173d77 --- /dev/null +++ b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-start/content/windows.asciidoc @@ -0,0 +1,6 @@ +[source,powershell] +---- +PS C:\Program Files\filebeat> Start-Service filebeat +---- + +By default, Windows log files are stored in `C:\ProgramData\filebeat\Logs`. diff --git a/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-start/widget.asciidoc b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-start/widget.asciidoc new file mode 100644 index 0000000000..360d0ce5f5 --- /dev/null +++ b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-start/widget.asciidoc @@ -0,0 +1,53 @@ + + +++++ +<div class="tabs" data-tab-group="transclusion-observability-tab-widgets-filebeat-start-widget"> + <div role="tablist" aria-label="transclusion-observability-tab-widgets-filebeat-start-widget"> + <button role="tab" aria-selected="true" aria-controls="transclusion-observability-tab-widgets-filebeat-start-widget-macos-panel" id="transclusion-observability-tab-widgets-filebeat-start-widget-macos-button"> + macOS + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-observability-tab-widgets-filebeat-start-widget-linux-panel" id="transclusion-observability-tab-widgets-filebeat-start-widget-linux-button" tabindex="-1"> + Linux + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-observability-tab-widgets-filebeat-start-widget-windows-panel" id="transclusion-observability-tab-widgets-filebeat-start-widget-windows-button" tabindex="-1"> + Windows + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-observability-tab-widgets-filebeat-start-widget-deb-panel" id="transclusion-observability-tab-widgets-filebeat-start-widget-deb-button" tabindex="-1"> + DEB + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-observability-tab-widgets-filebeat-start-widget-rpm-panel" id="transclusion-observability-tab-widgets-filebeat-start-widget-rpm-button" tabindex="-1"> + RPM + </button> + </div> + <div tabindex="0" role="tabpanel" id="transclusion-observability-tab-widgets-filebeat-start-widget-macos-panel" aria-labelledby="transclusion-observability-tab-widgets-filebeat-start-widget-macos-button"> +++++ +include::./content/macos.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-observability-tab-widgets-filebeat-start-widget-linux-panel" aria-labelledby="transclusion-observability-tab-widgets-filebeat-start-widget-linux-button" hidden=""> +++++ +include::./content/linux.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-observability-tab-widgets-filebeat-start-widget-windows-panel" aria-labelledby="transclusion-observability-tab-widgets-filebeat-start-widget-windows-button" hidden=""> +++++ +include::./content/windows.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-observability-tab-widgets-filebeat-start-widget-deb-panel" aria-labelledby="transclusion-observability-tab-widgets-filebeat-start-widget-deb-button" hidden=""> +++++ +include::./content/deb.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-observability-tab-widgets-filebeat-start-widget-rpm-panel" aria-labelledby="transclusion-observability-tab-widgets-filebeat-start-widget-rpm-button" hidden=""> +++++ +include::./content/rpm.asciidoc[] + +++++ + </div> +</div> +++++ diff --git a/docs/en/serverless/transclusion/observability/tab-widgets/logs/agent-location/content/deb.asciidoc b/docs/en/serverless/transclusion/observability/tab-widgets/logs/agent-location/content/deb.asciidoc new file mode 100644 index 0000000000..28c0b8e96d --- /dev/null +++ b/docs/en/serverless/transclusion/observability/tab-widgets/logs/agent-location/content/deb.asciidoc @@ -0,0 +1,3 @@ +Main {agent} configuration file location: + +`/etc/elastic-agent/elastic-agent.yml` diff --git a/docs/en/serverless/transclusion/observability/tab-widgets/logs/agent-location/content/linux.asciidoc b/docs/en/serverless/transclusion/observability/tab-widgets/logs/agent-location/content/linux.asciidoc new file mode 100644 index 0000000000..79b9e54e17 --- /dev/null +++ b/docs/en/serverless/transclusion/observability/tab-widgets/logs/agent-location/content/linux.asciidoc @@ -0,0 +1,3 @@ +Main {agent} configuration file location: + +`/opt/Elastic/Agent/elastic-agent.yml` diff --git a/docs/en/serverless/transclusion/observability/tab-widgets/logs/agent-location/content/mac.asciidoc b/docs/en/serverless/transclusion/observability/tab-widgets/logs/agent-location/content/mac.asciidoc new file mode 100644 index 0000000000..d4a521a15f --- /dev/null +++ b/docs/en/serverless/transclusion/observability/tab-widgets/logs/agent-location/content/mac.asciidoc @@ -0,0 +1,5 @@ +// lint disable + +Main {agent} configuration file location: + +`/Library/Elastic/Agent/elastic-agent.yml` diff --git a/docs/en/serverless/transclusion/observability/tab-widgets/logs/agent-location/content/rpm.asciidoc b/docs/en/serverless/transclusion/observability/tab-widgets/logs/agent-location/content/rpm.asciidoc new file mode 100644 index 0000000000..28c0b8e96d --- /dev/null +++ b/docs/en/serverless/transclusion/observability/tab-widgets/logs/agent-location/content/rpm.asciidoc @@ -0,0 +1,3 @@ +Main {agent} configuration file location: + +`/etc/elastic-agent/elastic-agent.yml` diff --git a/docs/en/serverless/transclusion/observability/tab-widgets/logs/agent-location/content/win.asciidoc b/docs/en/serverless/transclusion/observability/tab-widgets/logs/agent-location/content/win.asciidoc new file mode 100644 index 0000000000..bbfe0fddbf --- /dev/null +++ b/docs/en/serverless/transclusion/observability/tab-widgets/logs/agent-location/content/win.asciidoc @@ -0,0 +1,3 @@ +Main {agent} configuration file location: + +`C:\Program Files\Elastic\Agent\elastic-agent.yml` diff --git a/docs/en/serverless/transclusion/observability/tab-widgets/logs/agent-location/widget.asciidoc b/docs/en/serverless/transclusion/observability/tab-widgets/logs/agent-location/widget.asciidoc new file mode 100644 index 0000000000..e6ea9e0edc --- /dev/null +++ b/docs/en/serverless/transclusion/observability/tab-widgets/logs/agent-location/widget.asciidoc @@ -0,0 +1,53 @@ + + +++++ +<div class="tabs" data-tab-group="transclusion-observability-tab-widgets-logs-agent-location-widget"> + <div role="tablist" aria-label="transclusion-observability-tab-widgets-logs-agent-location-widget"> + <button role="tab" aria-selected="true" aria-controls="transclusion-observability-tab-widgets-logs-agent-location-widget-macos-panel" id="transclusion-observability-tab-widgets-logs-agent-location-widget-macos-button"> + macOS + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-observability-tab-widgets-logs-agent-location-widget-linux-panel" id="transclusion-observability-tab-widgets-logs-agent-location-widget-linux-button" tabindex="-1"> + Linux + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-observability-tab-widgets-logs-agent-location-widget-windows-panel" id="transclusion-observability-tab-widgets-logs-agent-location-widget-windows-button" tabindex="-1"> + Windows + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-observability-tab-widgets-logs-agent-location-widget-deb-panel" id="transclusion-observability-tab-widgets-logs-agent-location-widget-deb-button" tabindex="-1"> + DEB + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-observability-tab-widgets-logs-agent-location-widget-rpm-panel" id="transclusion-observability-tab-widgets-logs-agent-location-widget-rpm-button" tabindex="-1"> + RPM + </button> + </div> + <div tabindex="0" role="tabpanel" id="transclusion-observability-tab-widgets-logs-agent-location-widget-macos-panel" aria-labelledby="transclusion-observability-tab-widgets-logs-agent-location-widget-macos-button"> +++++ +include::./content/mac.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-observability-tab-widgets-logs-agent-location-widget-linux-panel" aria-labelledby="transclusion-observability-tab-widgets-logs-agent-location-widget-linux-button" hidden=""> +++++ +include::./content/linux.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-observability-tab-widgets-logs-agent-location-widget-windows-panel" aria-labelledby="transclusion-observability-tab-widgets-logs-agent-location-widget-windows-button" hidden=""> +++++ +include::./content/win.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-observability-tab-widgets-logs-agent-location-widget-deb-panel" aria-labelledby="transclusion-observability-tab-widgets-logs-agent-location-widget-deb-button" hidden=""> +++++ +include::./content/deb.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-observability-tab-widgets-logs-agent-location-widget-rpm-panel" aria-labelledby="transclusion-observability-tab-widgets-logs-agent-location-widget-rpm-button" hidden=""> +++++ +include::./content/rpm.asciidoc[] + +++++ + </div> +</div> +++++ diff --git a/docs/en/serverless/transclusion/support.asciidoc b/docs/en/serverless/transclusion/support.asciidoc new file mode 100644 index 0000000000..e27d88e54a --- /dev/null +++ b/docs/en/serverless/transclusion/support.asciidoc @@ -0,0 +1,3 @@ +We offer a support experience unlike any other. +Our team of professionals 'speak human and code' and love making your day. +https://www.elastic.co/subscriptions[Learn more about subscriptions]. diff --git a/docs/en/serverless/transclusion/synthetics/configuration/monitor-config-options.asciidoc b/docs/en/serverless/transclusion/synthetics/configuration/monitor-config-options.asciidoc new file mode 100644 index 0000000000..48b349529b --- /dev/null +++ b/docs/en/serverless/transclusion/synthetics/configuration/monitor-config-options.asciidoc @@ -0,0 +1,69 @@ +`id` (`string`):: +A unique identifier for this monitor. + +[[monitor-name]]`name` (`string`):: +A human readable name for the monitor. + +[[monitor-tags]]`tags` (`Array<string>`):: +A list of tags that will be sent with the monitor event. Tags are displayed in the Synthetics UI and allow you to search monitors by tag. + +`schedule` (`number`):: +The interval (in minutes) at which the monitor should run. + +`enabled` (`boolean`):: +Enable or disable the monitor from running without deleting and recreating it. + +`locations` (https://github.com/elastic/synthetics/blob/{synthetics_version}/src/locations/public-locations.ts#L28-L37[`Array<SyntheticsLocationsType>`]):: +Where to deploy the monitor. Monitors can be deployed in multiple locations so that you can detect differences in availability and response times across those locations. ++ +To list available locations you can: ++ +* Run the <<elastic-synthetics-locations-command,`elastic-synthetics locations` command>>. +* Go to **Synthetics** → **Management** and click **Create monitor**. +Locations will be listed in _Locations_. + +`privateLocations` (`Array<string>`):: +The <<synthetics-private-location,{private-location}s>> to which the monitors will be deployed. These {private-location}s refer to locations hosted and managed by you, whereas +`locations` are hosted by Elastic. You can specify a {private-location} using the location's name. ++ +To list available {private-location}s you can: ++ +* Run the <<elastic-synthetics-locations-command,`elastic-synthetics locations` command>> +with the URL for the Observability project from which to fetch available locations. +* Go to **Synthetics** → **Management** and click **Create monitor**. +{private-location}s will be listed in _Locations_. + +`throttling` (`boolean` | https://github.com/elastic/synthetics/blob/{synthetics_version}/src/common_types.ts#L194-L198[`ThrottlingOptions`]):: +Control the monitor's download speeds, upload speeds, and latency to simulate your application's behavior on slower or laggier networks. Set to `false` to disable throttling altogether. + +`screenshot` (https://github.com/elastic/synthetics/blob/{synthetics_version}/src/common_types.ts#L192[`ScreenshotOptions`]):: +Control whether or not to capture screenshots. Options include `'on'`, `'off'`, or `'only-on-failure'`. + +`alert.status.enabled` (`boolean`):: +Enable or disable monitor status alerts. Read more about alerts in <<synthetics-settings-alerting,Alerting>>. + +`retestOnFailure` (`boolean`):: +Enable or disable retesting when a monitor fails. Default is `true`. ++ +By default, monitors are automatically retested if the monitor goes from "up" to "down". +If the result of the retest is also "down", an error will be created, and if configured, an alert sent. +Then the monitor will resume running according to the defined schedule. ++ +Using `retestOnFailure` can reduce noise related to transient problems. + +`fields` (`object`):: +A list of key-value pairs that will be sent with each monitor event. +The `fields` are appended to {es} documents as `labels`, +and those labels are displayed in {kib} in the _Monitor details_ panel in the +<<synthetics-analyze-individual-monitors-overview,individual monitor's _Overview_ tab>>. ++ +For example: ++ +[source,js] +---- +fields: { + foo: 'bar', + team: 'synthetics', +} +---- + diff --git a/docs/en/serverless/transclusion/synthetics/global-managed-paid-for.asciidoc b/docs/en/serverless/transclusion/synthetics/global-managed-paid-for.asciidoc new file mode 100644 index 0000000000..f37cc26007 --- /dev/null +++ b/docs/en/serverless/transclusion/synthetics/global-managed-paid-for.asciidoc @@ -0,0 +1,2 @@ +Executing synthetic tests on Elastic's global managed testing infrastructure incurs an additional charge. Tests are charged under one of two new billing dimensions depending on the monitor type. For _browser monitor_ usage, there is a fee per test run. For _lightweight monitor_ usage, there is a fee per region in which you run any monitors regardless of the number of test runs. +For more details, refer to the https://www.elastic.co/pricing/serverless-observability[Observability Serverless pricing page]. diff --git a/docs/en/serverless/transclusion/synthetics/reference/lightweight-config/common.asciidoc b/docs/en/serverless/transclusion/synthetics/reference/lightweight-config/common.asciidoc new file mode 100644 index 0000000000..26ffb838c3 --- /dev/null +++ b/docs/en/serverless/transclusion/synthetics/reference/lightweight-config/common.asciidoc @@ -0,0 +1,279 @@ +|=== +| Option (type) | Description + +| [[common-monitor-type]]**`type`** (`"http"`, `"icmp"`, or `"tcp"`) +a| **Required**. The type of monitor to run. One of: + +* `http`: Connects via HTTP and optionally verifies that the host returns the expected response. +* `icmp`: Uses an ICMP (v4 and v6) Echo Request to ping the configured hosts. Requires special permissions or root access. +* `tcp`: Connects via TCP and optionally verifies the endpoint by sending and/or receiving a custom payload. + +| [[common-monitor-id]]**`id`** +(<<synthetics-lightweight-data-string,string>>) +a| **Required**. A unique identifier for this configuration. This should not change with edits to the monitor configuration regardless of changes to any config fields. + +**Examples**: + +[source,yaml] +---- +id: uploader-service +---- + +[source,yaml] +---- +id: http://example.net +---- + +[NOTE] +==== +When querying against indexed monitor data this is the field you will be aggregating with. It appears in the exported fields as `monitor.id`. + +If you do not set an `id` explicitly, the monitor's config will be hashed and a generated value will be used. This value will change with any options change to this monitor making aggregations over time between changes impossible. For this reason, it's recommended that you set this manually. +==== + +| [[common-monitor-name]]**`name`** +(<<synthetics-lightweight-data-string,string>>) +a| Human readable name for this monitor. + +**Examples**: + +[source,yaml] +---- +name: Uploader service +---- + +[source,yaml] +---- +name: Example website +---- + +| [[common-monitor-service_name]]**`service.name`** +(<<synthetics-lightweight-data-string,string>>) +| APM service name for this monitor. Corresponds to the `service.name` ECS field. Set this when monitoring an app that is also using APM to enable integrations between Synthetics and APM data in your Observability project. + +| [[common-monitor-enabled]]**`enabled`** +(<<synthetics-lightweight-data-bool,boolean>>) +a| Whether the monitor is enabled. + +**Default**: `true` + +**Example**: + +[source,yaml] +---- +enabled: false +---- + +| [[common-monitor-schedule]]**`schedule`** +(<<synthetics-lightweight-data-duration,duration>>) +a| **Required**. The task schedule. + +[NOTE] +==== +Schedules with less than 1 minute resolution will be saved to the nearest minute. For example, `@every 5s` will be changed to `@every 60s` when the monitor is pushed using the CLI. +==== + +**Example**: +Run the task every 5 minutes from the time the monitor was started. + +[source,yaml] +---- +schedule: @every 5m +---- + +| [[common-monitor-timeout]]**`timeout`** +(<<synthetics-lightweight-data-duration,duration>>) +a| The total running time for each ping test. This is the total time allowed for testing the connection and exchanging data. + +**Default**: `16s` + +**Example**: + +[source,yaml] +---- +timeout: 2m +---- + +| [[common-monitor-tags]]**`tags`** +(list of <<synthetics-lightweight-data-string,string>>s) +a| A list of tags that will be sent with the monitor event. + +**Examples**: + +[source,yaml] +---- +tags: + - tag one + - tag two +---- + +[source,yaml] +---- +tags: ["tag one", "tag two"] +---- + +| [[common-monitor-mode]]**`mode`** +(`"any"` \| `"all"`) +a| One of two modes in which to run the monitor: + +* `any`: The monitor pings only one IP address for a hostname. +* `all`: The monitor pings all resolvable IPs for a hostname. + +**Default**: `any` + +**Example**: +If you're using a DNS-load balancer and want to ping every IP address for the specified hostname, you should use `all`. + +| [[common-monitor-ipv4]]**`ipv4`** +(<<synthetics-lightweight-data-bool,boolean>>) +a| Whether to ping using the ipv4 protocol if hostnames are configured. + +**Default**: `true` + +**Example**: + +[source,yaml] +---- +ipv4: false +---- + +| [[common-monitor-ipv6]]**`ipv6`** +(<<synthetics-lightweight-data-bool,boolean>>) +a| Whether to ping using the ipv6 protocol if hostnames are configured. + +**Default**: `true` + +**Example**: + +[source,yaml] +---- +ipv6: false +---- + +| [[common-monitor-alert]]**`alert`** +a| Enable or disable alerts on this monitor. Read more about alerts in <<synthetics-settings-alerting,Alerting>>. + +**`status.enabled`** (<<synthetics-lightweight-data-bool,boolean>>):: +Enable monitor status alerts on this monitor. ++ +**Default**: `true` ++ +**Example**: ++ +[source,yaml] +---- +alert.status.enabled: true +---- + +**`tls.enabled`** (<<synthetics-lightweight-data-bool,boolean>>):: +Enable TLS certificate alerts on this monitor. ++ +**Default**: `true` ++ +**Example**: ++ +[source,yaml] +---- +alert.tls.enabled: true +---- + +| [[common-monitor-retest_on_failure]]**`retest_on_failure`** +(<<synthetics-lightweight-data-bool,boolean>>) +a| Enable or disable retesting when a monitor fails. Default is `true`. + +By default, monitors are automatically retested if the monitor goes from "up" to "down". If the result of the retest is also "down", an error will be created, and if configured, an alert sent. Then the monitor will resume running according to the defined schedule. Using `retestOnFailure` can reduce noise related to transient problems. + +**Example**: + +[source,yaml] +---- +retest_on_failure: false +---- + +| [[common-monitor-locations]]**`locations`** +(list of https://github.com/elastic/synthetics/blob/{synthetics_version}/src/locations/public-locations.ts#L28-L37[`SyntheticsLocationsType`]) +a| Where to deploy the monitor. You can deploy monitors in multiple locations to detect differences in availability and response times across those locations. + +To list available locations you can: + +* Run the <<elastic-synthetics-locations-command,`elastic-synthetics locations` command>>. +* Go to **Synthetics** → **Management** and click **Create monitor**. Locations will be listed in _Locations_. + +**Examples**: + +[source,yaml] +---- +locations: ["japan", "india"] +---- + +[source,yaml] +---- +locations: + - japan + - india +---- + +[NOTE] +==== +This can also be set using +<<synthetics-configuration-monitor,`monitor.locations` in the Synthetics project configuration file>> +or via the CLI using the <<elastic-synthetics-push-command,`--location` flag on `push`>>. + +The value defined via the CLI takes precedence over the value defined in the lightweight monitor configuration, +and the value defined in the lightweight monitor configuration takes precedence over the value defined in Synthetics project configuration file. +==== + +| [[common-monitor-private_locations]]**`private_locations`** +(list of <<synthetics-lightweight-data-string,string>>s) +a| The <<synthetics-private-location,{private-location}s>> to which the monitors will be deployed. These {private-location}s refer to locations hosted and managed by you, whereas `locations` are hosted by Elastic. You can specify a {private-location} using the location's name. + +To list available {private-location}s you can: + +* Run the <<elastic-synthetics-locations-command,`elastic-synthetics locations` command>> and specify the URL of the Observability project. This will fetch all available private locations associated with the deployment. +* Go to **Synthetics** → **Management** and click **Create monitor**. {private-location}s will be listed in _Locations_. + +**Examples**: + +[source,yaml] +---- +private_locations: ["Private Location 1", "Private Location 2"] +---- + +[source,yaml] +---- +private_locations: + - Private Location 1 + - Private Location 2 +---- + +[NOTE] +==== +This can also be set using +<<synthetics-configuration-monitor,`monitor.privateLocations` in the Synthetics project configuration file>> +or via the CLI using the <<elastic-synthetics-push-command,`--privateLocations` flag on `push`>>. + +The value defined via the CLI takes precedence over the value defined in the lightweight monitor configuration, +and the value defined in the lightweight monitor configuration takes precedence over the value defined in Synthetics project configuration file. +==== + +| [[common-monitor-fields]]**`fields`** +a| A list of key-value pairs that will be sent with each monitor event. +The `fields` are appended to {es} documents as `labels`, +and those labels are displayed in {kib} in the _Monitor details_ panel in the +<<synthetics-analyze-individual-monitors-overview,individual monitor's _Overview_ tab>>. + +**Examples**: + +[source,yaml] +---- +fields: + foo: bar + team: synthetics +---- + +[source,yaml] +---- +fields.foo: bar +fields.team: synthetics +---- +|=== diff --git a/docs/en/serverless/transclusion/synthetics/reference/lightweight-config/common.mdx b/docs/en/serverless/transclusion/synthetics/reference/lightweight-config/common.mdx index 92e281c180..2a860da346 100644 --- a/docs/en/serverless/transclusion/synthetics/reference/lightweight-config/common.mdx +++ b/docs/en/serverless/transclusion/synthetics/reference/lightweight-config/common.mdx @@ -152,7 +152,7 @@ <DocRow> <DocCell> <span id="monitor-mode">**`mode`**</span><br /> - (`"any"` \| `"all"`) + (`"any"` or `"all"`) </DocCell> <DocCell> One of two modes in which to run the monitor: diff --git a/docs/en/serverless/transclusion/synthetics/reference/lightweight-config/http.asciidoc b/docs/en/serverless/transclusion/synthetics/reference/lightweight-config/http.asciidoc new file mode 100644 index 0000000000..bbb3d36569 --- /dev/null +++ b/docs/en/serverless/transclusion/synthetics/reference/lightweight-config/http.asciidoc @@ -0,0 +1,201 @@ +|=== +| Option (type) | Description + +| [[monitor-http-hosts]]**`hosts`** +(<<synthetics-lightweight-data-string,string>>) +| **Required**. The URL to ping. + +| [[monitor-http-max_redirects]]**`max_redirects`** +(<<synthetics-lightweight-data-numbers,number>>) +a| The total number of redirections Synthetics will follow. + +By default, Synthetics will not follow redirects, but will report the status of the redirect. If set to a number greater than `0`, Synthetics will follow that number of redirects. + +When this option is set to a value greater than `0`, the `monitor.ip` field will no longer be reported, as multiple DNS requests across multiple IPs may return multiple IPs. Fine-grained network timing data will also not be recorded, as with redirects that data will span multiple requests. Specifically the fields `http.rtt.content.us`, `http.rtt.response_header.us`, `http.rtt.total.us`, `http.rtt.validate.us`, `http.rtt.write_request.us` and `dns.rtt.us` will be omitted. + +**Default**: `0` + +| [[monitor-http-proxy_headers]]**`proxy_headers`** +| Additional headers to send to proxies during `CONNECT` requests. + +| [[monitor-http-proxy_url]]**`proxy_url`** +(<<synthetics-lightweight-data-string,string>>) +a| The HTTP proxy URL. This setting is optional. + +**Example**: + +[source,yaml] +---- +http://proxy.mydomain.com:3128 +---- + +| [[monitor-http-username]]**`username`** +(<<synthetics-lightweight-data-string,string>>) +a| The username for authenticating with the server. The credentials are passed with the request. This setting is optional. + +You need to specify credentials when your `check.response` settings require it. For example, you can check for a 403 response (`check.response.status: [403]`) without setting credentials. + +| [[monitor-http-password]]**`password`** +(<<synthetics-lightweight-data-string,string>>) +| The password for authenticating with the server. This setting is optional. + +| [[monitor-http-ssl]]**`ssl`** +({heartbeat-ref}/configuration-ssl.html[SSL]) +a| The TLS/SSL connection settings for use with the HTTPS endpoint. If you don't specify settings, the system defaults are used. + +**Example**: + +[source,yaml] +---- +- type: http + id: my-http-service + name: My HTTP Service + hosts: "https://myhost:443" + schedule: '@every 5s' + ssl: + certificate_authorities: ['/etc/ca.crt'] + supported_protocols: ["TLSv1.0", "TLSv1.1", "TLSv1.2"] +---- + +| [[monitor-http-headers]]**`headers`** +(<<synthetics-lightweight-data-bool,boolean>>) +a| Controls the indexing of the HTTP response headers `http.response.body.headers` field. Set `response.include_headers` to `false` to disable. + +**Default**: `true` + +| [[monitor-http-response]]**`response`** +a| Controls the indexing of the HTTP response body contents to the `http.response.body.contents` field. + +**`include_body`** (`"on_error"`, `"never"`, or `"always"`):: +Set `response.include_body` to one of the following: ++ +* `on_error`: Include the body if an error is encountered during the check. This is the default. +* `never`: Never include the body. +* `always`: Always include the body with checks. + +**`include_body_max_bytes`** (<<synthetics-lightweight-data-numbers,number>>):: +Set `response.include_body_max_bytes` to control the maximum size of the stored body contents. ++ +**Default**: `1024` + +| [[monitor-http-check]]**`check`** +a| **`request`**:: +An optional `request` to send to the remote host. Under `check.request`, specify these options: ++ +--- +**`method`** (`"HEAD"`, `"GET"`, `"POST"`, or `"OPTIONS"`)::: +The HTTP method to use. + +**`headers`** (https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers[HTTP headers])::: +A dictionary of additional HTTP headers to send. By default Synthetics will set the 'User-Agent' header to identify itself. + +**`body`** (<<synthetics-lightweight-data-string,string>>)::: +Optional request body content. +--- ++ +**Example**: This monitor POSTs an `x-www-form-urlencoded` string to the endpoint `/demo/add`. ++ +[source,yaml] +---- +check.request: + method: POST + headers: + 'Content-Type': 'application/x-www-form-urlencoded' + # urlencode the body: + body: "name=first&email=someemail%40someemailprovider.com" +---- + +**`response`**:: +The expected `response`. ++ +Under `check.response`, specify these options: ++ +**`status`** (list of <<synthetics-lightweight-data-string,string>>s)::: +A list of expected status codes. 4xx and 5xx codes are considered `down` by default. Other codes are considered `up`. ++ +**Example**: ++ +[source,yaml] +---- +check.response: + status: [200, 201] +---- + +**`headers`** (https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers[HTTP headers])::: +The required response headers. + +**`body.positive`** (list of <<synthetics-lightweight-data-string,string>>s)::: +A list of regular expressions to match the body output. Only a single expression needs to match. ++ +**Example**: ++ +This monitor examines the response body for the strings 'foo' or 'Foo': ++ +[source,yaml] +---- +check.response: + status: [200, 201] + body: + positive: + - foo + - Foo +---- + +**`body.negative`** (list of <<synthetics-lightweight-data-string,string>>s)::: +A list of regular expressions to match the body output negatively. Return match failed if single expression matches. HTTP response bodies of up to 100MiB are supported. ++ +This monitor examines match successfully if there is no 'bar' or 'Bar' at all, examines match failed if there is 'bar' or 'Bar' in the response body: ++ +**Example**: ++ +[source,yaml] +---- +check.response: + status: [200, 201] + body: + negative: + - bar + - Bar +---- ++ +**Example**: ++ +This monitor examines match successfully only when 'foo' or 'Foo' in body AND no 'bar' or 'Bar' in body: ++ +[source,yaml] +---- +check.response: + status: [200, 201] + body: + positive: + - foo + - Foo + negative: + - bar + - Bar +---- + +**`json`**::: +A list of expressions executed against the body when parsed as JSON. +Body sizes must be less than or equal to 100 MiB. ++ +**`description`**:::: +A description of the check. + +**`expression`**:::: +The following configuration shows how to check the response using +https://github.com/PaesslerAG/gval/blob/master/README.md[gval] expressions +when the body contains JSON: ++ +**Example**: ++ +[source,yaml] +---- +check.response: + status: [200] + json: + - description: check status + expression: 'foo.bar == "myValue"' +---- + +|=== diff --git a/docs/en/serverless/transclusion/synthetics/reference/lightweight-config/icmp.asciidoc b/docs/en/serverless/transclusion/synthetics/reference/lightweight-config/icmp.asciidoc new file mode 100644 index 0000000000..aaf15af679 --- /dev/null +++ b/docs/en/serverless/transclusion/synthetics/reference/lightweight-config/icmp.asciidoc @@ -0,0 +1,27 @@ +|=== +| Option (type) | Description + +| [[monitor-icmp-hosts]]**`hosts`** +(<<synthetics-lightweight-data-string,string>>) +a| **Required**. The host to ping. + +**Example**: + +[source,yaml] +---- +hosts: "myhost" +---- + +| [[monitor-icmp-wait]]**`wait`** +(<<synthetics-lightweight-data-duration,duration>>) +a| The duration to wait before emitting another ICMP Echo Request if no response is received. + +**Default**: `1s` + +**Example**: + +[source,yaml] +---- +wait: 1m +---- +|=== diff --git a/docs/en/serverless/transclusion/synthetics/reference/lightweight-config/tcp.asciidoc b/docs/en/serverless/transclusion/synthetics/reference/lightweight-config/tcp.asciidoc new file mode 100644 index 0000000000..29fea52a53 --- /dev/null +++ b/docs/en/serverless/transclusion/synthetics/reference/lightweight-config/tcp.asciidoc @@ -0,0 +1,82 @@ +|=== +| Option (type) | Description + +| [[monitor-tcp-hosts]]**`hosts`** +(<<synthetics-lightweight-data-string,string>>) +a| **Required**. The host to ping. The value can be: + +* **A hostname and port, such as `localhost:12345`.** +Synthetics connects to the port on the specified host. If the monitor is {heartbeat-ref}/configuration-ssl.html[configured to use SSL], Synthetics establishes an SSL/TLS-based connection. Otherwise, it establishes a TCP connection. +* **A full URL using the syntax `scheme://<host>:[port]`**, where: ++ +** `scheme` is one of `tcp`, `plain`, `ssl` or `tls`. If `tcp` or `plain` is specified, Synthetics establishes a TCP connection even if the monitor is configured to use SSL. If `tls` or `ssl` is specified, Synthetics establishes an SSL connection. However, if the monitor is not configured to use SSL, the system defaults are used (currently not supported on Windows). +** `host` is the hostname. +** `port` is the port number. + +**Examples**: + +[source,yaml] +---- +hosts: "localhost:8000" +---- + +[source,yaml] +---- +hosts: "tcp://localhost:8000" +---- + +| [[monitor-tcp-check]]**`check`** +a| An optional payload string to send to the remote host and the expected answer. If no payload is specified, the endpoint is assumed to be available if the connection attempt was successful. If `send` is specified without `receive`, any response is accepted as OK. If `receive` is specified without `send`, no payload is sent, but the client expects to receive a payload in the form of a "hello message" or "banner" on connect. + +**Example**: + +[source,yaml] +---- +check.send: 'Hello World' +check.receive: 'Hello World' +---- + +[source,yaml] +---- +check: + send: 'Hello World' + receive: 'Hello World' +---- + +| [[monitor-tcp-proxy_url]]**`proxy_url`** +a| The URL of the SOCKS5 proxy to use when connecting to the server. The value must be a URL with a scheme of socks5://. + +If the SOCKS5 proxy server requires client authentication, then a username and password can be embedded in the URL. + +When using a proxy, hostnames are resolved on the proxy server instead of on the client. You can change this behavior by setting the `proxy_use_local_resolver` option. + +**Examples**: + +A proxy URL that requires client authentication: + +[source,yaml] +---- +proxy_url: socks5://user:password@socks5-proxy:2233 +---- + +| [[monitor-tcp-proxy_use_local_resolver]]**`proxy_use_local_resolver`** +(<<synthetics-lightweight-data-bool,boolean>>) +a| A Boolean value that determines whether hostnames are resolved locally instead of being resolved on the proxy server. The default value is `false`, which means that name resolution occurs on the proxy server. + +**Default**: `false` + +| [[monitor-tcp-ssl]]**`ssl`** +({heartbeat-ref}/configuration-ssl.html[SSL]) +a| The TLS/SSL connection settings. If the monitor is {heartbeat-ref}/configuration-ssl.html[configured to use SSL], it will attempt an SSL handshake. If `check` is not configured, the monitor will only check to see if it can establish an SSL/TLS connection. This check can fail either at TCP level or during certificate validation. + +**Example**: + +[source,yaml] +---- +ssl: + certificate_authorities: ['/etc/ca.crt'] + supported_protocols: ["TLSv1.0", "TLSv1.1", "TLSv1.2"] +---- + +Also see {heartbeat-ref}/configuration-ssl.html[Configure SSL] for a full description of the `ssl` options. +|=== diff --git a/docs/en/serverless/transclusion/synthetics/tab-widgets/manage-monitors-delete-monitor-content/project.asciidoc b/docs/en/serverless/transclusion/synthetics/tab-widgets/manage-monitors-delete-monitor-content/project.asciidoc new file mode 100644 index 0000000000..f5a944e30e --- /dev/null +++ b/docs/en/serverless/transclusion/synthetics/tab-widgets/manage-monitors-delete-monitor-content/project.asciidoc @@ -0,0 +1,9 @@ +If you <<synthetics-get-started-project,set up the monitor using a Synthetics project>>, +you'll delete the monitor from the Synthetics project and push changes. + +For lightweight monitors, delete the monitor from the YAML file. + +For browser monitors, delete the full journey from the JavaScript or TypeScript file. + +Then, run the <<elastic-synthetics-push-command,`push` command>>. +The monitor associated with that journey that existed in your Observability project will be deleted. diff --git a/docs/en/serverless/transclusion/synthetics/tab-widgets/manage-monitors-delete-monitor-content/ui.asciidoc b/docs/en/serverless/transclusion/synthetics/tab-widgets/manage-monitors-delete-monitor-content/ui.asciidoc new file mode 100644 index 0000000000..6b95c4bdb3 --- /dev/null +++ b/docs/en/serverless/transclusion/synthetics/tab-widgets/manage-monitors-delete-monitor-content/ui.asciidoc @@ -0,0 +1,5 @@ +If you <<synthetics-get-started-ui,set up the monitor using the Synthetics UI>>, +you can delete a lightweight or browser monitor in the UI: + +. In your Observability project, go to **Synthetics** → **Management**. +. Click the trash can icon next to the monitor you want to delete. diff --git a/docs/en/serverless/transclusion/synthetics/tab-widgets/manage-monitors-delete-monitor-widget.asciidoc b/docs/en/serverless/transclusion/synthetics/tab-widgets/manage-monitors-delete-monitor-widget.asciidoc new file mode 100644 index 0000000000..5fa3db157c --- /dev/null +++ b/docs/en/serverless/transclusion/synthetics/tab-widgets/manage-monitors-delete-monitor-widget.asciidoc @@ -0,0 +1,26 @@ + + +++++ +<div class="tabs" data-tab-group="transclusion-synthetics-tab-widgets-manage-monitors-delete-monitor-widget"> + <div role="tablist" aria-label="transclusion-synthetics-tab-widgets-manage-monitors-delete-monitor-widget"> + <button role="tab" aria-selected="true" aria-controls="transclusion-synthetics-tab-widgets-manage-monitors-delete-monitor-widget-synthetics-project-panel" id="transclusion-synthetics-tab-widgets-manage-monitors-delete-monitor-widget-synthetics-project-button"> + Synthetics project + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-synthetics-tab-widgets-manage-monitors-delete-monitor-widget-synthetics-ui-panel" id="transclusion-synthetics-tab-widgets-manage-monitors-delete-monitor-widget-synthetics-ui-button" tabindex="-1"> + Synthetics UI + </button> + </div> + <div tabindex="0" role="tabpanel" id="transclusion-synthetics-tab-widgets-manage-monitors-delete-monitor-widget-synthetics-project-panel" aria-labelledby="transclusion-synthetics-tab-widgets-manage-monitors-delete-monitor-widget-synthetics-project-button"> +++++ +include::./manage-monitors-delete-monitor-content/project.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-synthetics-tab-widgets-manage-monitors-delete-monitor-widget-synthetics-ui-panel" aria-labelledby="transclusion-synthetics-tab-widgets-manage-monitors-delete-monitor-widget-synthetics-ui-button" hidden=""> +++++ +include::./manage-monitors-delete-monitor-content/ui.asciidoc[] + +++++ + </div> +</div> +++++ diff --git a/docs/en/serverless/transclusion/synthetics/tab-widgets/manage-monitors-update-monitor-content/project.asciidoc b/docs/en/serverless/transclusion/synthetics/tab-widgets/manage-monitors-update-monitor-content/project.asciidoc new file mode 100644 index 0000000000..21c52dc2be --- /dev/null +++ b/docs/en/serverless/transclusion/synthetics/tab-widgets/manage-monitors-update-monitor-content/project.asciidoc @@ -0,0 +1,23 @@ +If you <<synthetics-get-started-project,set up the monitor using a Synthetics project>>, +you'll update the monitor in the Synthetics project and then `push` changes to your Observability project. + +For lightweight monitors, make changes to the YAML file. + +For browser monitors, you can update the configuration of one or more monitors: + +* To update the configuration of an individual monitor, edit the journey directly in +the JavaScript or TypeScript files, specifically the options in `monitor.use`. +* To update the configuration of _all_ monitors in a Synthetics project, edit the +<<synthetics-configuration-monitor,global synthetics configuration file>>. + +To update the journey that a browser monitor runs, edit the journey code directly and +<<synthetics-test-locally,test the updated journey locally>> to make sure it's valid. + +After making changes to the monitors, run the <<elastic-synthetics-push-command,`push` command>> +to replace the existing monitors with new monitors using the updated +configuration or journey code. + +[NOTE] +==== +Updates are linked to a monitor's `id`. To update a monitor you must keep its `id` the same. +==== diff --git a/docs/en/serverless/transclusion/synthetics/tab-widgets/manage-monitors-update-monitor-content/ui.asciidoc b/docs/en/serverless/transclusion/synthetics/tab-widgets/manage-monitors-update-monitor-content/ui.asciidoc new file mode 100644 index 0000000000..4be0498cbd --- /dev/null +++ b/docs/en/serverless/transclusion/synthetics/tab-widgets/manage-monitors-update-monitor-content/ui.asciidoc @@ -0,0 +1,11 @@ +If you <<synthetics-get-started-ui,set up the monitor using the UI>>, +you can update the monitor configuration of both lightweight and browser monitors +in the UI: + +. In your Observability project, go to **Synthetics** → **Management**. +. Click the pencil icon next to the monitor you want to edit. +. Update the _Monitor settings_ as needed. ++ +.. To update the journey used in a browser monitor, edit _Inline script_. +.. Make sure to click **Run test** to validate the new journey before updating the monitor. +. Click **Update monitor**. diff --git a/docs/en/serverless/transclusion/synthetics/tab-widgets/manage-monitors-update-monitor-widget.asciidoc b/docs/en/serverless/transclusion/synthetics/tab-widgets/manage-monitors-update-monitor-widget.asciidoc new file mode 100644 index 0000000000..be51b23fb3 --- /dev/null +++ b/docs/en/serverless/transclusion/synthetics/tab-widgets/manage-monitors-update-monitor-widget.asciidoc @@ -0,0 +1,26 @@ + + +++++ +<div class="tabs" data-tab-group="transclusion-synthetics-tab-widgets-manage-monitors-update-monitor-widget"> + <div role="tablist" aria-label="transclusion-synthetics-tab-widgets-manage-monitors-update-monitor-widget"> + <button role="tab" aria-selected="true" aria-controls="transclusion-synthetics-tab-widgets-manage-monitors-update-monitor-widget-synthetics-project-panel" id="transclusion-synthetics-tab-widgets-manage-monitors-update-monitor-widget-synthetics-project-button"> + Synthetics project + </button> + <button role="tab" aria-selected="false" aria-controls="transclusion-synthetics-tab-widgets-manage-monitors-update-monitor-widget-synthetics-ui-panel" id="transclusion-synthetics-tab-widgets-manage-monitors-update-monitor-widget-synthetics-ui-button" tabindex="-1"> + Synthetics UI + </button> + </div> + <div tabindex="0" role="tabpanel" id="transclusion-synthetics-tab-widgets-manage-monitors-update-monitor-widget-synthetics-project-panel" aria-labelledby="transclusion-synthetics-tab-widgets-manage-monitors-update-monitor-widget-synthetics-project-button"> +++++ +include::./manage-monitors-update-monitor-content/project.asciidoc[] + +++++ + </div> + <div tabindex="0" role="tabpanel" id="transclusion-synthetics-tab-widgets-manage-monitors-update-monitor-widget-synthetics-ui-panel" aria-labelledby="transclusion-synthetics-tab-widgets-manage-monitors-update-monitor-widget-synthetics-ui-button" hidden=""> +++++ +include::./manage-monitors-update-monitor-content/ui.asciidoc[] + +++++ + </div> +</div> +++++ diff --git a/docs/en/serverless/what-is-observability-serverless.asciidoc b/docs/en/serverless/what-is-observability-serverless.asciidoc new file mode 100644 index 0000000000..c7300b21f6 --- /dev/null +++ b/docs/en/serverless/what-is-observability-serverless.asciidoc @@ -0,0 +1,86 @@ +[[what-is-observability-serverless]] += What is Observability serverless? + +:keywords: serverless, observability, overview + +preview:[] + +<DocLandingHero title="Elastic Observability" description="Elastic Observability accelerates problem resolution with open, flexible, and unified observability powered by advanced machine learning and analytics. Elastic ingests all operational and business telemetry and correlates for faster root cause detection." image="observability" headerIcon="logoObservability" display="align" /> + +.Production workloads +[IMPORTANT] +==== +While in technical preview, Elastic Observability serverless projects should not be used for production workloads. +==== + +<DocRelatedArticles + sectionTitle="Get started" + items={ + [ + { + "title": "Quickstarts", + slug: "/serverless/observability/quickstarts/overview", + "description": "Learn how to ingest your observability data and get immediate value.", + }, + { + "title": "Get started with Logs", + slug: "/serverless/observability/get-started-with-logs", + "description": "Add your log data to Elastic Observability and start exploring your logs.", + }, + { + "title": "Get started with traces and APM", + slug: "/serverless/observability/apm-get-started", + "description": "Collect Application Performance Monitoring (APM) data and visualize it in real time.", + }, + { + "title": "Get started with metrics", + slug: "/serverless/observability/get-started-with-metrics", + "description": "Add your metrics data to Elastic Observability and visualize it in real time.", + } + ] +} +/> + +<DocRelatedArticles + sectionTitle="How to" + items={ + [ + { + "title": "Explore log data", + slug: "/serverless/observability/discover-and-explore-logs", + "description": "Use Discover to explore your log data.", + }, + { + "title": "Trigger alerts and triage problems", + "description": "Create rules to detect complex conditions and trigger alerts.", + slug: "/serverless/observability/create-manage-rules" + }, + { + "title": "Track and deliver on your SLOs", + slug: "/serverless/observability/slos", + "description": "Measure key metrics important to the business.", + }, + { + "title": "Detect anomalies and spikes", + slug: "/serverless/observability/aiops-detect-anomalies", + "description": "Find unusual behavior in time series data.", + }, + { + "title": "Monitor application performance", + "description": "Monitor your software services and applications in real time.", + slug: "/serverless/observability/apm" + }, + { + "title": "Integrate with OpenTelemetry", + slug: "/serverless/observability/apm-agents-opentelemetry", + "description": "Reuse existing APM instrumentation to capture logs, traces, and metrics.", + }, + { + "title": "Monitor your hosts and services", + slug: "/serverless/observability/analyze-hosts", + "description": "Get a metrics-driven view of your hosts backed by an interface called Lens.", + } + ] +} +/> + From f295453bf6d315aa1ff3028dfb42f59e718a2915 Mon Sep 17 00:00:00 2001 From: Colleen McGinnis <colleen.mcginnis@elastic.co> Date: Tue, 29 Oct 2024 14:19:37 -0500 Subject: [PATCH 02/13] fix broken links --- docs/en/serverless/logging/add-logs-service-name.asciidoc | 2 +- docs/en/serverless/logging/add-logs-service-name.mdx | 2 +- docs/en/serverless/logging/correlate-application-logs.asciidoc | 2 +- docs/en/serverless/logging/correlate-application-logs.mdx | 2 +- .../transclusion/apm/guide/install-agents/net.asciidoc | 2 +- .../en/serverless/transclusion/apm/guide/install-agents/net.mdx | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/en/serverless/logging/add-logs-service-name.asciidoc b/docs/en/serverless/logging/add-logs-service-name.asciidoc index cefa5337a1..6faa13e8c7 100644 --- a/docs/en/serverless/logging/add-logs-service-name.asciidoc +++ b/docs/en/serverless/logging/add-logs-service-name.asciidoc @@ -52,7 +52,7 @@ Follow these steps to update your mapping: . Under **Field path**, select the existing field you want to map to the service name. . Select **Add field**. -For more ways to add a field to your mapping, refer to {ref}/explicit-mapping.html#add-field-mapping.html[add a field to an existing mapping]. +For more ways to add a field to your mapping, refer to {ref}/explicit-mapping.html#add-field-mapping[add a field to an existing mapping]. [discrete] [[add-logs-service-name-additional-ways-to-process-data]] diff --git a/docs/en/serverless/logging/add-logs-service-name.mdx b/docs/en/serverless/logging/add-logs-service-name.mdx index d30b0f85e6..1c1cd49c73 100644 --- a/docs/en/serverless/logging/add-logs-service-name.mdx +++ b/docs/en/serverless/logging/add-logs-service-name.mdx @@ -46,7 +46,7 @@ Follow these steps to update your mapping: 1. Under **Field path**, select the existing field you want to map to the service name. 1. Select **Add field**. -For more ways to add a field to your mapping, refer to [add a field to an existing mapping](((ref))/explicit-mapping.html#add-field-mapping.html). +For more ways to add a field to your mapping, refer to [add a field to an existing mapping](((ref))/explicit-mapping.html#add-field-mapping). ## Additional ways to process data diff --git a/docs/en/serverless/logging/correlate-application-logs.asciidoc b/docs/en/serverless/logging/correlate-application-logs.asciidoc index a18e855afe..d070a7a3fe 100644 --- a/docs/en/serverless/logging/correlate-application-logs.asciidoc +++ b/docs/en/serverless/logging/correlate-application-logs.asciidoc @@ -81,7 +81,7 @@ without adding an ECS logger dependency or modifying the application. This feature is supported for the following {apm-agent}s: -* {apm-ruby-ref}/log-reformat.html[Ruby] +* {apm-ruby-ref}/configuration.html#config-log-ecs-formatting[Ruby] * {apm-py-ref}/logs.html#log-reformatting[Python] * {apm-java-ref}/logs.html#log-reformatting[Java] diff --git a/docs/en/serverless/logging/correlate-application-logs.mdx b/docs/en/serverless/logging/correlate-application-logs.mdx index f15c608d9f..d83bb7ddd6 100644 --- a/docs/en/serverless/logging/correlate-application-logs.mdx +++ b/docs/en/serverless/logging/correlate-application-logs.mdx @@ -70,7 +70,7 @@ without adding an ECS logger dependency or modifying the application. This feature is supported for the following ((apm-agent))s: -* [Ruby](((apm-ruby-ref))/log-reformat.html) +* [Ruby](((apm-ruby-ref))/configuration.html#config-log-ecs-formatting) * [Python](((apm-py-ref))/logs.html#log-reformatting) * [Java](((apm-java-ref))/logs.html#log-reformatting) diff --git a/docs/en/serverless/transclusion/apm/guide/install-agents/net.asciidoc b/docs/en/serverless/transclusion/apm/guide/install-agents/net.asciidoc index e8380f3477..8f0e217092 100644 --- a/docs/en/serverless/transclusion/apm/guide/install-agents/net.asciidoc +++ b/docs/en/serverless/transclusion/apm/guide/install-agents/net.asciidoc @@ -11,7 +11,7 @@ You can add the Agent and specific instrumentations to a .NET application by referencing one or more of these packages and following the package documentation. * **Host startup hook**: On .NET Core 3.0+ or .NET 5+, the agent supports auto instrumentation without any code change and without -any recompilation of your projects. See {apm-dotnet-ref}t/setup-dotnet-net-core.html[Zero code change setup on .NET Core] +any recompilation of your projects. See {apm-dotnet-ref}/setup-dotnet-net-core.html[Zero code change setup on .NET Core] for more details. **Learn more in the {apm-agent} reference** diff --git a/docs/en/serverless/transclusion/apm/guide/install-agents/net.mdx b/docs/en/serverless/transclusion/apm/guide/install-agents/net.mdx index 6bc72a769c..dbd7b686ea 100644 --- a/docs/en/serverless/transclusion/apm/guide/install-agents/net.mdx +++ b/docs/en/serverless/transclusion/apm/guide/install-agents/net.mdx @@ -11,7 +11,7 @@ You can add the Agent and specific instrumentations to a .NET application by referencing one or more of these packages and following the package documentation. * **Host startup hook**: On .NET Core 3.0+ or .NET 5+, the agent supports auto instrumentation without any code change and without -any recompilation of your projects. See [Zero code change setup on .NET Core](((apm-dotnet-ref))t/setup-dotnet-net-core.html) +any recompilation of your projects. See [Zero code change setup on .NET Core](((apm-dotnet-ref))/setup-dotnet-net-core.html) for more details. <br /> **Learn more in the ((apm-agent)) reference** From 0861844fd62e33dfe24f7744d2122ba0606316b1 Mon Sep 17 00:00:00 2001 From: Colleen McGinnis <colleen.mcginnis@elastic.co> Date: Tue, 29 Oct 2024 16:20:40 -0500 Subject: [PATCH 03/13] clean up landing page --- docs/en/serverless/index.asciidoc | 152 ------------------ .../what-is-observability-serverless.asciidoc | 91 +++-------- 2 files changed, 18 insertions(+), 225 deletions(-) delete mode 100644 docs/en/serverless/index.asciidoc diff --git a/docs/en/serverless/index.asciidoc b/docs/en/serverless/index.asciidoc deleted file mode 100644 index 4b7177f447..0000000000 --- a/docs/en/serverless/index.asciidoc +++ /dev/null @@ -1,152 +0,0 @@ -:doctype: book - -include::{docs-root}/shared/versions/stack/{source_branch}.asciidoc[] -include::{docs-root}/shared/attributes.asciidoc[] - -= Elastic Observability - -include::./observability-overview.asciidoc[leveloffset=+1] - -include::./quickstarts/overview.asciidoc[leveloffset=+1] -include::./quickstarts/monitor-hosts-with-elastic-agent.asciidoc[leveloffset=+2] -include::./quickstarts/k8s-logs-metrics.asciidoc[leveloffset=+2] - -include::./projects/billing.asciidoc[leveloffset=+1] - -include::./projects/create-an-observability-project.asciidoc[leveloffset=+1] - -include::./logging/log-monitoring.asciidoc[leveloffset=+1] -include::./logging/get-started-with-logs.asciidoc[leveloffset=+2] -include::./logging/stream-log-files.asciidoc[leveloffset=+2] -include::./logging/correlate-application-logs.asciidoc[leveloffset=+2] -include::./logging/plaintext-application-logs.asciidoc[leveloffset=+3] -include::./logging/ecs-application-logs.asciidoc[leveloffset=+3] -include::./logging/send-application-logs.asciidoc[leveloffset=+3] -include::./logging/parse-log-data.asciidoc[leveloffset=+2] -include::./logging/filter-and-aggregate-logs.asciidoc[leveloffset=+2] -include::./logging/view-and-monitor-logs.asciidoc[leveloffset=+2] -include::./logging/add-logs-service-name.asciidoc[leveloffset=+2] -include::./logging/run-log-pattern-analysis.asciidoc[leveloffset=+2] -include::./logging/troubleshoot-logs.asciidoc[leveloffset=+2] - -include::./inventory.asciidoc[leveloffset=+1] - -include::./apm/apm.asciidoc[leveloffset=+1] -include::./apm/apm-get-started.asciidoc[leveloffset=+2] -include::./apm/apm-send-traces-to-elastic.asciidoc[leveloffset=+2] -include::./apm-agents/apm-agents-elastic-apm-agents.asciidoc[leveloffset=+3] -include::./apm-agents/apm-agents-opentelemetry.asciidoc[leveloffset=+3] -include::./apm-agents/apm-agents-opentelemetry-opentelemetry-native-support.asciidoc[leveloffset=+4] -include::./apm-agents/apm-agents-opentelemetry-collect-metrics.asciidoc[leveloffset=+4] -include::./apm-agents/apm-agents-opentelemetry-limitations.asciidoc[leveloffset=+4] -include::./apm-agents/apm-agents-opentelemetry-resource-attributes.asciidoc[leveloffset=+4] -include::./apm-agents/apm-agents-aws-lambda-functions.asciidoc[leveloffset=+3] -include::./apm/apm-view-and-analyze-traces.asciidoc[leveloffset=+2] -include::./apm/apm-find-transaction-latency-and-failure-correlations.asciidoc[leveloffset=+3] -include::./apm/apm-integrate-with-machine-learning.asciidoc[leveloffset=+3] -include::./apm/apm-create-custom-links.asciidoc[leveloffset=+3] -include::./apm/apm-track-deployments-with-annotations.asciidoc[leveloffset=+3] -include::./apm/apm-query-your-data.asciidoc[leveloffset=+3] -include::./apm/apm-filter-your-data.asciidoc[leveloffset=+3] -include::./apm/apm-observe-lambda-functions.asciidoc[leveloffset=+3] -include::./apm/apm-ui-overview.asciidoc[leveloffset=+3] -include::./apm/apm-ui-services.asciidoc[leveloffset=+4] -include::./apm/apm-ui-traces.asciidoc[leveloffset=+4] -include::./apm/apm-ui-dependencies.asciidoc[leveloffset=+4] -include::./apm/apm-ui-service-map.asciidoc[leveloffset=+4] -include::./apm/apm-ui-service-overview.asciidoc[leveloffset=+4] -include::./apm/apm-ui-transactions.asciidoc[leveloffset=+4] -include::./apm/apm-ui-trace-sample-timeline.asciidoc[leveloffset=+4] -include::./apm/apm-ui-errors.asciidoc[leveloffset=+4] -include::./apm/apm-ui-metrics.asciidoc[leveloffset=+4] -include::./apm/apm-ui-infrastructure.asciidoc[leveloffset=+4] -include::./apm/apm-ui-logs.asciidoc[leveloffset=+4] -include::./apm/apm-data-types.asciidoc[leveloffset=+2] -include::./apm/apm-distributed-tracing.asciidoc[leveloffset=+2] -include::./apm/apm-reduce-your-data-usage.asciidoc[leveloffset=+2] -include::./apm/apm-transaction-sampling.asciidoc[leveloffset=+3] -include::./apm/apm-compress-spans.asciidoc[leveloffset=+3] -include::./apm/apm-stacktrace-collection.asciidoc[leveloffset=+3] -include::./apm/apm-keep-data-secure.asciidoc[leveloffset=+2] -include::./apm/apm-troubleshooting.asciidoc[leveloffset=+2] -include::./apm/apm-reference.asciidoc[leveloffset=+2] -include::./apm/apm-kibana-settings.asciidoc[leveloffset=+3] -include::./apm/apm-server-api.asciidoc[leveloffset=+3] - -include::./infra-monitoring/infra-monitoring.asciidoc[leveloffset=+1] -include::./infra-monitoring/get-started-with-metrics.asciidoc[leveloffset=+2] -include::./infra-monitoring/view-infrastructure-metrics.asciidoc[leveloffset=+2] -include::./infra-monitoring/analyze-hosts.asciidoc[leveloffset=+2] -include::./infra-monitoring/detect-metric-anomalies.asciidoc[leveloffset=+2] -include::./infra-monitoring/configure-infra-settings.asciidoc[leveloffset=+2] -include::./infra-monitoring/troubleshooting-infra.asciidoc[leveloffset=+2] -include::./infra-monitoring/handle-no-results-found-message.asciidoc[leveloffset=+3] -include::./infra-monitoring/metrics-reference.asciidoc[leveloffset=+2] -include::./infra-monitoring/host-metrics.asciidoc[leveloffset=+3] -include::./infra-monitoring/container-metrics.asciidoc[leveloffset=+3] -include::./infra-monitoring/kubernetes-pod-metrics.asciidoc[leveloffset=+3] -include::./infra-monitoring/aws-metrics.asciidoc[leveloffset=+3] -include::./infra-monitoring/metrics-app-fields.asciidoc[leveloffset=+2] - -include::./synthetics/synthetics-intro.asciidoc[leveloffset=+1] -include::./synthetics/synthetics-get-started.asciidoc[leveloffset=+2] -include::./synthetics/synthetics-get-started-project.asciidoc[leveloffset=+3] -include::./synthetics/synthetics-get-started-ui.asciidoc[leveloffset=+3] -include::./synthetics/synthetics-journeys.asciidoc[leveloffset=+2] -include::./synthetics/synthetics-create-test.asciidoc[leveloffset=+3] -include::./synthetics/synthetics-monitor-use.asciidoc[leveloffset=+3] -include::./synthetics/synthetics-recorder.asciidoc[leveloffset=+3] -include::./synthetics/synthetics-lightweight.asciidoc[leveloffset=+2] -include::./synthetics/synthetics-manage-monitors.asciidoc[leveloffset=+2] -include::./synthetics/synthetics-params-secrets.asciidoc[leveloffset=+2] -include::./synthetics/synthetics-analyze.asciidoc[leveloffset=+2] -include::./synthetics/synthetics-private-location.asciidoc[leveloffset=+2] -include::./synthetics/synthetics-command-reference.asciidoc[leveloffset=+2] -include::./synthetics/synthetics-configuration.asciidoc[leveloffset=+2] -include::./synthetics/synthetics-settings.asciidoc[leveloffset=+2] -include::./synthetics/synthetics-feature-roles.asciidoc[leveloffset=+2] -include::./synthetics/synthetics-manage-retention.asciidoc[leveloffset=+2] -include::./synthetics/synthetics-scale-and-architect.asciidoc[leveloffset=+2] -include::./synthetics/synthetics-security-encryption.asciidoc[leveloffset=+2] -include::./synthetics/synthetics-troubleshooting.asciidoc[leveloffset=+2] - -include::./dashboards/dashboards-and-visualizations.asciidoc[leveloffset=+1] - -include::./alerting/alerting.asciidoc[leveloffset=+1] -include::./alerting/create-manage-rules.asciidoc[leveloffset=+2] -include::./alerting/aiops-generate-anomaly-alerts.asciidoc[leveloffset=+3] -include::./alerting/create-anomaly-alert-rule.asciidoc[leveloffset=+3] -include::./alerting/create-custom-threshold-alert-rule.asciidoc[leveloffset=+3] -include::./alerting/create-elasticsearch-query-alert-rule.asciidoc[leveloffset=+3] -include::./alerting/create-error-count-threshold-alert-rule.asciidoc[leveloffset=+3] -include::./alerting/create-failed-transaction-rate-threshold-alert-rule.asciidoc[leveloffset=+3] -include::./alerting/create-inventory-threshold-alert-rule.asciidoc[leveloffset=+3] -include::./alerting/create-latency-threshold-alert-rule.asciidoc[leveloffset=+3] -include::./alerting/create-slo-burn-rate-alert-rule.asciidoc[leveloffset=+3] -include::./alerting/aggregation-options.asciidoc[leveloffset=+2] -include::./alerting/rate-aggregation.asciidoc[leveloffset=+3] -include::./alerting/view-alerts.asciidoc[leveloffset=+2] -include::./alerting/triage-slo-burn-rate-breaches.asciidoc[leveloffset=+3] -include::./alerting/triage-threshold-breaches.asciidoc[leveloffset=+3] - -include::./slos/slos.asciidoc[leveloffset=+1] -include::./slos/create-an-slo.asciidoc[leveloffset=+2] - -include::./cases/cases.asciidoc[leveloffset=+1] -include::./cases/create-manage-cases.asciidoc[leveloffset=+2] -include::./cases/manage-cases-settings.asciidoc[leveloffset=+2] - -include::./aiops/aiops.asciidoc[leveloffset=+1] -include::./aiops/aiops-detect-anomalies.asciidoc[leveloffset=+2] -include::./aiops/aiops-tune-anomaly-detection-job.asciidoc[leveloffset=+3] -include::./aiops/aiops-forecast-anomaly.asciidoc[leveloffset=+3] -include::./aiops/aiops-analyze-spikes.asciidoc[leveloffset=+2] -include::./aiops/aiops-detect-change-points.asciidoc[leveloffset=+2] - -include::./monitor-datasets.asciidoc[leveloffset=+1] - -include::./ai-assistant/ai-assistant.asciidoc[leveloffset=+1] - -include::./elastic-entity-model.asciidoc[leveloffset=+1] - -include::./technical-preview-limitations.asciidoc[leveloffset=+1] diff --git a/docs/en/serverless/what-is-observability-serverless.asciidoc b/docs/en/serverless/what-is-observability-serverless.asciidoc index c7300b21f6..acdfe13be8 100644 --- a/docs/en/serverless/what-is-observability-serverless.asciidoc +++ b/docs/en/serverless/what-is-observability-serverless.asciidoc @@ -1,11 +1,8 @@ -[[what-is-observability-serverless]] -= What is Observability serverless? - :keywords: serverless, observability, overview preview:[] -<DocLandingHero title="Elastic Observability" description="Elastic Observability accelerates problem resolution with open, flexible, and unified observability powered by advanced machine learning and analytics. Elastic ingests all operational and business telemetry and correlates for faster root cause detection." image="observability" headerIcon="logoObservability" display="align" /> +Elastic Observability accelerates problem resolution with open, flexible, and unified observability powered by advanced machine learning and analytics. Elastic ingests all operational and business telemetry and correlates for faster root cause detection. .Production workloads [IMPORTANT] @@ -13,74 +10,22 @@ preview:[] While in technical preview, Elastic Observability serverless projects should not be used for production workloads. ==== -<DocRelatedArticles - sectionTitle="Get started" - items={ - [ - { - "title": "Quickstarts", - slug: "/serverless/observability/quickstarts/overview", - "description": "Learn how to ingest your observability data and get immediate value.", - }, - { - "title": "Get started with Logs", - slug: "/serverless/observability/get-started-with-logs", - "description": "Add your log data to Elastic Observability and start exploring your logs.", - }, - { - "title": "Get started with traces and APM", - slug: "/serverless/observability/apm-get-started", - "description": "Collect Application Performance Monitoring (APM) data and visualize it in real time.", - }, - { - "title": "Get started with metrics", - slug: "/serverless/observability/get-started-with-metrics", - "description": "Add your metrics data to Elastic Observability and visualize it in real time.", - } - ] -} -/> +[discrete] +== Get started + +* <<quickstarts-overview,*Quickstarts*>>: Learn how to ingest your observability data and get immediate value. +* <<get-started-with-logs,*Get started with Logs*>>: Add your log data to Elastic Observability and start exploring your logs. +* <<apm-get-started,*Get started with traces and APM*>>: Collect Application Performance Monitoring (APM) data and visualize it in real time. +* <<get-started-with-metrics,*Get started with metrics*>>: Add your metrics data to Elastic Observability and visualize it in real time. + +[discrete] +== How to -<DocRelatedArticles - sectionTitle="How to" - items={ - [ - { - "title": "Explore log data", - slug: "/serverless/observability/discover-and-explore-logs", - "description": "Use Discover to explore your log data.", - }, - { - "title": "Trigger alerts and triage problems", - "description": "Create rules to detect complex conditions and trigger alerts.", - slug: "/serverless/observability/create-manage-rules" - }, - { - "title": "Track and deliver on your SLOs", - slug: "/serverless/observability/slos", - "description": "Measure key metrics important to the business.", - }, - { - "title": "Detect anomalies and spikes", - slug: "/serverless/observability/aiops-detect-anomalies", - "description": "Find unusual behavior in time series data.", - }, - { - "title": "Monitor application performance", - "description": "Monitor your software services and applications in real time.", - slug: "/serverless/observability/apm" - }, - { - "title": "Integrate with OpenTelemetry", - slug: "/serverless/observability/apm-agents-opentelemetry", - "description": "Reuse existing APM instrumentation to capture logs, traces, and metrics.", - }, - { - "title": "Monitor your hosts and services", - slug: "/serverless/observability/analyze-hosts", - "description": "Get a metrics-driven view of your hosts backed by an interface called Lens.", - } - ] -} -/> +* <<discover-and-explore-logs,*Explore log data*>>: Use Discover to explore your log data. +* <<create-manage-rules,*Trigger alerts and triage problems*>>: Create rules to detect complex conditions and trigger alerts. +* <<slos,*Track and deliver on your SLOs*>>: Measure key metrics important to the business. +* <<aiops-detect-anomalies,*Detect anomalies and spikes*>>: Find unusual behavior in time series data. +* <<apm,*Monitor application performance*>>: Monitor your software services and applications in real time. +* <<apm-agents-opentelemetry,*Integrate with OpenTelemetry*>>: Reuse existing APM instrumentation to capture logs, traces, and metrics. +* <<analyze-hosts,*Monitor your hosts and services*>>: Get a metrics-driven view of your hosts backed by an interface called Lens. From 6c5f23aad833c323bd53d62730bc72b28aae9c2c Mon Sep 17 00:00:00 2001 From: Colleen McGinnis <colleen.mcginnis@elastic.co> Date: Tue, 29 Oct 2024 19:13:54 -0500 Subject: [PATCH 04/13] clean up links --- .../ai-assistant/ai-assistant.asciidoc | 30 ++-- .../aiops/aiops-analyze-spikes.asciidoc | 4 +- .../aiops/aiops-detect-anomalies.asciidoc | 16 +-- .../aiops/aiops-detect-change-points.asciidoc | 2 +- .../aiops/aiops-forecast-anomaly.asciidoc | 4 +- .../aiops-tune-anomaly-detection-job.asciidoc | 2 +- docs/en/serverless/aiops/aiops.asciidoc | 8 +- .../alerting/aggregation-options.asciidoc | 4 +- .../aiops-generate-anomaly-alerts.asciidoc | 8 +- docs/en/serverless/alerting/alerting.asciidoc | 14 +- .../create-anomaly-alert-rule.asciidoc | 4 +- ...reate-custom-threshold-alert-rule.asciidoc | 7 +- ...te-elasticsearch-query-alert-rule.asciidoc | 10 +- ...-error-count-threshold-alert-rule.asciidoc | 4 +- ...saction-rate-threshold-alert-rule.asciidoc | 4 +- ...te-inventory-threshold-alert-rule.asciidoc | 4 +- ...eate-latency-threshold-alert-rule.asciidoc | 6 +- .../alerting/create-manage-rules.asciidoc | 32 ++--- .../create-slo-burn-rate-alert-rule.asciidoc | 10 +- .../alerting/rate-aggregation.asciidoc | 4 +- .../synthetic-monitor-status-alert.asciidoc | 134 ++++++++++++++++++ .../triage-slo-burn-rate-breaches.asciidoc | 6 +- .../triage-threshold-breaches.asciidoc | 6 +- .../serverless/alerting/view-alerts.asciidoc | 16 +-- .../apm-agents-aws-lambda-functions.asciidoc | 8 +- .../apm-agents-elastic-apm-agents.asciidoc | 4 +- ...nts-opentelemetry-collect-metrics.asciidoc | 2 +- ...-agents-opentelemetry-limitations.asciidoc | 6 +- ...etry-opentelemetry-native-support.asciidoc | 28 ++-- ...opentelemetry-resource-attributes.asciidoc | 2 +- .../apm-agents-opentelemetry.asciidoc | 24 ++-- .../apm/apm-compress-spans.asciidoc | 12 +- .../apm/apm-create-custom-links.asciidoc | 24 ++-- .../en/serverless/apm/apm-data-types.asciidoc | 2 +- .../apm/apm-distributed-tracing.asciidoc | 18 +-- .../apm/apm-filter-your-data.asciidoc | 8 +- ...-latency-and-failure-correlations.asciidoc | 4 +- .../serverless/apm/apm-get-started.asciidoc | 18 +-- ...m-integrate-with-machine-learning.asciidoc | 10 +- .../apm/apm-keep-data-secure.asciidoc | 22 +-- .../apm/apm-kibana-settings.asciidoc | 6 +- .../apm/apm-observe-lambda-functions.asciidoc | 14 +- .../apm/apm-query-your-data.asciidoc | 12 +- .../apm/apm-reduce-your-data-usage.asciidoc | 8 +- docs/en/serverless/apm/apm-reference.asciidoc | 6 +- .../apm/apm-send-traces-to-elastic.asciidoc | 10 +- .../en/serverless/apm/apm-server-api.asciidoc | 18 +-- .../apm/apm-server-api/api-events.asciidoc | 2 +- .../apm/apm-server-api/api.asciidoc | 6 +- .../apm/apm-server-api/otel-api.asciidoc | 2 +- .../apm/apm-stacktrace-collection.asciidoc | 2 +- ...rack-deployments-with-annotations.asciidoc | 2 +- .../apm/apm-transaction-sampling.asciidoc | 26 ++-- .../apm/apm-troubleshooting.asciidoc | 10 +- .../common-response-codes.asciidoc | 4 +- .../apm/apm-ui-dependencies.asciidoc | 8 +- docs/en/serverless/apm/apm-ui-errors.asciidoc | 2 +- .../apm/apm-ui-infrastructure.asciidoc | 2 +- docs/en/serverless/apm/apm-ui-logs.asciidoc | 2 +- .../en/serverless/apm/apm-ui-metrics.asciidoc | 2 +- .../serverless/apm/apm-ui-overview.asciidoc | 24 ++-- .../apm/apm-ui-service-map.asciidoc | 16 +-- .../apm/apm-ui-service-overview.asciidoc | 24 ++-- .../serverless/apm/apm-ui-services.asciidoc | 8 +- .../apm/apm-ui-trace-sample-timeline.asciidoc | 10 +- docs/en/serverless/apm/apm-ui-traces.asciidoc | 10 +- .../apm/apm-ui-transactions.asciidoc | 12 +- .../apm/apm-view-and-analyze-traces.asciidoc | 4 +- docs/en/serverless/apm/apm.asciidoc | 6 +- docs/en/serverless/cases/cases.asciidoc | 4 +- .../cases/create-manage-cases.asciidoc | 16 +-- .../cases/manage-cases-settings.asciidoc | 16 +-- .../dashboards-and-visualizations.asciidoc | 4 +- .../serverless/elastic-entity-model.asciidoc | 12 +- .../infra-monitoring/analyze-hosts.asciidoc | 22 +-- .../infra-monitoring/aws-metrics.asciidoc | 4 +- .../configure-infra-settings.asciidoc | 2 +- .../container-metrics.asciidoc | 4 +- .../detect-metric-anomalies.asciidoc | 2 +- .../get-started-with-metrics.asciidoc | 14 +- .../handle-no-results-found-message.asciidoc | 4 +- .../infra-monitoring/host-metrics.asciidoc | 4 +- .../infra-monitoring.asciidoc | 18 +-- .../kubernetes-pod-metrics.asciidoc | 4 +- .../metrics-app-fields.asciidoc | 4 +- .../metrics-reference.asciidoc | 10 +- .../troubleshooting-infra.asciidoc | 8 +- .../view-infrastructure-metrics.asciidoc | 10 +- docs/en/serverless/inventory.asciidoc | 14 +- .../logging/add-logs-service-name.asciidoc | 8 +- .../correlate-application-logs.asciidoc | 26 ++-- .../logging/ecs-application-logs.asciidoc | 42 +++--- .../filter-and-aggregate-logs.asciidoc | 4 +- .../logging/get-started-with-logs.asciidoc | 10 +- .../logging/log-monitoring.asciidoc | 42 +++--- .../logging/parse-log-data.asciidoc | 84 +++++------ .../plaintext-application-logs.asciidoc | 46 +++--- .../logging/run-log-pattern-analysis.asciidoc | 2 +- .../logging/send-application-logs.asciidoc | 4 +- .../logging/stream-log-files.asciidoc | 36 ++--- .../logging/troubleshoot-logs.asciidoc | 24 ++-- .../logging/view-and-monitor-logs.asciidoc | 22 +-- docs/en/serverless/monitor-datasets.asciidoc | 8 +- .../observability-overview.asciidoc | 30 ++-- .../create-an-observability-project.asciidoc | 10 +- .../quickstarts/k8s-logs-metrics.asciidoc | 14 +- .../monitor-hosts-with-elastic-agent.asciidoc | 40 +++--- .../serverless/quickstarts/overview.asciidoc | 8 +- .../en/serverless/slos/create-an-slo.asciidoc | 8 +- docs/en/serverless/slos/slos.asciidoc | 16 +-- .../synthetics/synthetics-analyze.asciidoc | 6 +- .../synthetics-command-reference.asciidoc | 16 +-- .../synthetics-configuration.asciidoc | 10 +- .../synthetics-create-test.asciidoc | 16 +-- .../synthetics-feature-roles.asciidoc | 2 +- .../synthetics-get-started-project.asciidoc | 34 ++--- .../synthetics-get-started-ui.asciidoc | 32 ++--- .../synthetics-get-started.asciidoc | 10 +- .../synthetics/synthetics-intro.asciidoc | 20 +-- .../synthetics/synthetics-journeys.asciidoc | 10 +- .../synthetics-lightweight.asciidoc | 10 +- .../synthetics-manage-monitors.asciidoc | 6 +- .../synthetics-manage-retention.asciidoc | 6 +- .../synthetics-monitor-use.asciidoc | 12 +- .../synthetics-params-secrets.asciidoc | 10 +- .../synthetics-private-location.asciidoc | 4 +- .../synthetics/synthetics-recorder.asciidoc | 6 +- .../synthetics-scale-and-architect.asciidoc | 4 +- .../synthetics-security-encryption.asciidoc | 4 +- .../synthetics/synthetics-settings.asciidoc | 16 +-- .../synthetics-troubleshooting.asciidoc | 8 +- .../transclusion/apm/guide/about/go.asciidoc | 2 +- .../apm/guide/about/java.asciidoc | 2 +- .../transclusion/apm/guide/about/net.asciidoc | 2 +- .../apm/guide/about/node.asciidoc | 2 +- .../transclusion/apm/guide/about/php.asciidoc | 2 +- .../apm/guide/about/python.asciidoc | 2 +- .../apm/guide/about/ruby.asciidoc | 2 +- .../open-telemetry/otel-get-started.asciidoc | 2 +- .../no-data-indexed/fleet-managed.asciidoc | 4 +- .../service-overview/dependencies.asciidoc | 2 +- .../throughput-transactions.asciidoc | 2 +- .../kibana/logs/log-overview.asciidoc | 2 +- .../filebeat-logs/content/logs.asciidoc | 2 +- .../monitor-config-options.asciidoc | 2 +- .../lightweight-config/common.asciidoc | 32 ++--- .../project.asciidoc | 2 +- .../ui.asciidoc | 2 +- .../project.asciidoc | 2 +- .../ui.asciidoc | 2 +- .../what-is-observability-serverless.asciidoc | 22 +-- 151 files changed, 959 insertions(+), 824 deletions(-) create mode 100644 docs/en/serverless/alerting/synthetic-monitor-status-alert.asciidoc diff --git a/docs/en/serverless/ai-assistant/ai-assistant.asciidoc b/docs/en/serverless/ai-assistant/ai-assistant.asciidoc index 968e6c09db..59f7cabdd0 100644 --- a/docs/en/serverless/ai-assistant/ai-assistant.asciidoc +++ b/docs/en/serverless/ai-assistant/ai-assistant.asciidoc @@ -1,4 +1,4 @@ -[[ai-assistant]] +[[observability-ai-assistant]] = AI Assistant :keywords: serverless, observability, overview @@ -33,7 +33,7 @@ Also, the data you provide to the Observability AI assistant is _not_ anonymized ==== [discrete] -[[ai-assistant-requirements]] +[[observability-ai-assistant-requirements]] == Requirements The AI assistant requires the following: @@ -53,7 +53,7 @@ Elastic doesn't recommend using private LLMs with the Observability AI assistant ==== [discrete] -[[ai-assistant-your-data-and-the-ai-assistant]] +[[observability-ai-assistant-your-data-and-the-ai-assistant]] == Your data and the AI Assistant Elastic does not use customer data for model training. This includes anything you send the model, such as alert or event data, detection rule configurations, queries, and prompts. However, any data you provide to the AI Assistant will be processed by the third-party provider you chose when setting up the OpenAI connector as part of the assistant setup. @@ -61,7 +61,7 @@ Elastic does not use customer data for model training. This includes anything yo Elastic does not control third-party tools, and assumes no responsibility or liability for their content, operation, or use, nor for any loss or damage that may arise from your using such tools. Please exercise caution when using AI tools with personal, sensitive, or confidential information. Any data you submit may be used by the provider for AI training or other purposes. There is no guarantee that the provider will keep any information you provide secure or confidential. You should familiarize yourself with the privacy practices and terms of use of any generative AI tools prior to use. [discrete] -[[ai-assistant-set-up-the-ai-assistant]] +[[observability-ai-assistant-set-up-the-ai-assistant]] == Set up the AI Assistant To set up the AI Assistant: @@ -83,7 +83,7 @@ To set up the AI Assistant: .. Under **Authentication**, enter the key or secret you created in the previous step. [discrete] -[[ai-assistant-add-data-to-the-ai-assistant-knowledge-base]] +[[observability-ai-assistant-add-data-to-the-ai-assistant-knowledge-base]] == Add data to the AI Assistant knowledge base [IMPORTANT] @@ -109,7 +109,7 @@ You can add information to the knowledge base by asking the AI Assistant to reme You can also add external data to the knowledge base either in the Project Settings UI or using the {es} Index API. [discrete] -[[ai-assistant-use-the-ui]] +[[observability-ai-assistant-use-the-ui]] === Use the UI To add external data to the knowledge base in the Project Settings UI: @@ -133,7 +133,7 @@ Each object should conform to the following format: ---- [discrete] -[[ai-assistant-use-the-es-index-api]] +[[observability-ai-assistant-use-the-es-index-api]] === Use the {es} Index API . Ingest external data (GitHub issues, Markdown files, Jira tickets, text files, etc.) into {es} using the {es} {ref}/docs-index_.html[Index API]. @@ -172,7 +172,7 @@ POST _reindex ---- [discrete] -[[ai-assistant-interact-with-the-ai-assistant]] +[[observability-ai-assistant-interact-with-the-ai-assistant]] == Interact with the AI Assistant You can chat with the AI Assistant or interact with contextual insights located throughout {observability}. @@ -185,7 +185,7 @@ Your feedback helps us improve the AI Assistant! ==== [discrete] -[[ai-assistant-chat-with-the-assistant]] +[[observability-ai-assistant-chat-with-the-assistant]] === Chat with the assistant Click **AI Assistant** in the upper-right corner where available to start the chat: @@ -206,7 +206,7 @@ When the Observability AI Assistant performs searches in the cluster, the querie ==== [discrete] -[[ai-assistant-suggest-functions]] +[[observability-ai-assistant-suggest-functions]] === Suggest functions beta::[] @@ -259,7 +259,7 @@ Additional functions are available when your cluster has APM data: |=== [discrete] -[[ai-assistant-use-contextual-prompts]] +[[observability-ai-assistant-use-contextual-prompts]] === Use contextual prompts AI Assistant contextual prompts throughout {observability} provide the following information: @@ -286,13 +286,13 @@ You can continue a conversation from a contextual prompt by clicking **Start cha image::images/ai-assistant-logs.png[Observability AI assistant example] [discrete] -[[ai-assistant-add-the-ai-assistant-connector-to-alerting-workflows]] +[[observability-ai-assistant-add-the-ai-assistant-connector-to-alerting-workflows]] === Add the AI Assistant connector to alerting workflows You can use the {kibana-ref}/obs-ai-assistant-action-type.html[Observability AI Assistant connector] to add AI-generated insights and custom actions to your alerting workflows. To do this: -. <<create-manage-rules,Create (or edit) an alerting rule>> and specify the conditions that must be met for the alert to fire. +. <<observability-create-manage-rules,Create (or edit) an alerting rule>> and specify the conditions that must be met for the alert to fire. . Under **Actions**, select the **Observability AI Assistant** connector type. . In the **Connector** list, select the AI connector you created when you set up the assistant. . In the **Message** field, specify the message to send to the assistant: @@ -342,10 +342,10 @@ image::images/obs-ai-assistant-slack-message.png[Message sent by Slack by the AI The Observability AI Assistant connector is called when the alert fires and when it recovers. -To learn more about alerting, actions, and connectors, refer to <<alerting>>. +To learn more about alerting, actions, and connectors, refer to <<observability-alerting>>. [discrete] -[[ai-assistant-known-issues]] +[[observability-ai-assistant-known-issues]] == Known issues [discrete] diff --git a/docs/en/serverless/aiops/aiops-analyze-spikes.asciidoc b/docs/en/serverless/aiops/aiops-analyze-spikes.asciidoc index 36a2881008..c9525f730b 100644 --- a/docs/en/serverless/aiops/aiops-analyze-spikes.asciidoc +++ b/docs/en/serverless/aiops/aiops-analyze-spikes.asciidoc @@ -1,4 +1,4 @@ -[[aiops-analyze-spikes]] +[[observability-aiops-analyze-spikes]] = Analyze log spikes and drops :description: Find and investigate the causes of unusual spikes or drops in log rates. @@ -57,7 +57,7 @@ It also helps you group logs in ways that go beyond what you can achieve with a To run log pattern analysis: -. Follow the steps under <<aiops-analyze-spikes>> to run a log rate analysis. +. Follow the steps under <<observability-aiops-analyze-spikes>> to run a log rate analysis. . From the **Actions** menu, choose **View in Log Pattern Analysis**. . Select a category field and optionally apply any filters that you want. . Click **Run pattern analysis**. diff --git a/docs/en/serverless/aiops/aiops-detect-anomalies.asciidoc b/docs/en/serverless/aiops/aiops-detect-anomalies.asciidoc index b7cdfa2a35..ea7f9ff294 100644 --- a/docs/en/serverless/aiops/aiops-detect-anomalies.asciidoc +++ b/docs/en/serverless/aiops/aiops-detect-anomalies.asciidoc @@ -1,4 +1,4 @@ -[[aiops-detect-anomalies]] +[[observability-aiops-detect-anomalies]] = Detect anomalies :description: Detect anomalies by comparing real-time and historical data from different sources to look for unusual, problematic patterns. @@ -101,7 +101,7 @@ When you're done, go back to the first step and create your job. ==== . Step through the instructions in the job creation wizard to configure your job. -You can accept the default settings for most settings now and <<aiops-tune-anomaly-detection-job,tune the job>> later. +You can accept the default settings for most settings now and <<observability-aiops-tune-anomaly-detection-job,tune the job>> later. . If you want the job to start immediately when the job is created, make sure that option is selected on the summary page. . When you're done, click **Create job**. When the job runs, the {ml} features analyze the input stream of data, model its behavior, and perform analysis based on the detectors in each job. @@ -109,7 +109,7 @@ When an event occurs outside of the baselines of normal behavior, that event is . After the job is started, click **View results**. [discrete] -[[aiops-detect-anomalies-view-the-results]] +[[observability-aiops-detect-anomalies-view-the-results]] = View the results After the anomaly detection job has processed some data, @@ -187,7 +187,7 @@ By default, the **Anomalies** table contains all anomalies that have a severity If you are only interested in critical anomalies, for example, you can change the severity threshold for this table. . (Optional) From the **Actions** menu in the **Anomalies** table, you can choose to view relevant documents in **Discover** or create a job rule. Job rules instruct anomaly detectors to change their behavior based on domain-specific knowledge that you provide. -To learn more, refer to <<aiops-tune-anomaly-detection-job>> +To learn more, refer to <<observability-aiops-tune-anomaly-detection-job>> After you have identified anomalies, often the next step is to try to determine the context of those situations. For example, are there other factors that are @@ -264,11 +264,11 @@ The list of anomalies uses the record-level anomaly scores. ==== [discrete] -[[aiops-detect-anomalies-next-steps]] +[[observability-aiops-detect-anomalies-next-steps]] == Next steps After setting up an anomaly detection job, you may want to: -* <<aiops-tune-anomaly-detection-job>> -* <<aiops-forecast-anomalies>> -* <<aiops-generate-anomaly-alerts>> +* <<observability-aiops-tune-anomaly-detection-job>> +* <<observability-aiops-forecast-anomalies>> +* <<observability-aiops-generate-anomaly-alerts>> diff --git a/docs/en/serverless/aiops/aiops-detect-change-points.asciidoc b/docs/en/serverless/aiops/aiops-detect-change-points.asciidoc index 3302c32264..38e64ea91f 100644 --- a/docs/en/serverless/aiops/aiops-detect-change-points.asciidoc +++ b/docs/en/serverless/aiops/aiops-detect-change-points.asciidoc @@ -1,4 +1,4 @@ -[[aiops-detect-change-points]] +[[observability-aiops-detect-change-points]] = Detect change points :description: Detect distribution changes, trend changes, and other statistically significant change points in a metric of your time series data. diff --git a/docs/en/serverless/aiops/aiops-forecast-anomaly.asciidoc b/docs/en/serverless/aiops/aiops-forecast-anomaly.asciidoc index b7936db6b8..df6eb1d153 100644 --- a/docs/en/serverless/aiops/aiops-forecast-anomaly.asciidoc +++ b/docs/en/serverless/aiops/aiops-forecast-anomaly.asciidoc @@ -1,4 +1,4 @@ -[[aiops-forecast-anomalies]] +[[observability-aiops-forecast-anomalies]] = Forecast future behavior :description: Predict future behavior of your data by creating a forecast for an anomaly detection job. @@ -25,7 +25,7 @@ For example, you might want to determine how likely it is that your disk utiliza To create a forecast: -. <<aiops-detect-anomalies,Create an anomaly detection job>> and view the results in the **Single Metric Viewer**. +. <<observability-aiops-detect-anomalies,Create an anomaly detection job>> and view the results in the **Single Metric Viewer**. . Click **Forecast**. . Specify a duration for your forecast. This value indicates how far to extrapolate beyond the last record that was processed. diff --git a/docs/en/serverless/aiops/aiops-tune-anomaly-detection-job.asciidoc b/docs/en/serverless/aiops/aiops-tune-anomaly-detection-job.asciidoc index c2aba08202..ab6e3441e1 100644 --- a/docs/en/serverless/aiops/aiops-tune-anomaly-detection-job.asciidoc +++ b/docs/en/serverless/aiops/aiops-tune-anomaly-detection-job.asciidoc @@ -1,4 +1,4 @@ -[[aiops-tune-anomaly-detection-job]] +[[observability-aiops-tune-anomaly-detection-job]] = Tune your anomaly detection job :description: Tune your job by creating calendars, adding job rules, and defining custom URLs. diff --git a/docs/en/serverless/aiops/aiops.asciidoc b/docs/en/serverless/aiops/aiops.asciidoc index 306b517122..aa98be9246 100644 --- a/docs/en/serverless/aiops/aiops.asciidoc +++ b/docs/en/serverless/aiops/aiops.asciidoc @@ -1,4 +1,4 @@ -[[aiops]] +[[observability-aiops]] = AIOps :description: Automate anomaly detection and accelerate root cause analysis with AIOps. @@ -13,12 +13,12 @@ DevOps engineers, SREs, and security analysts can get started right away using t |=== | Feature | Description -| <<aiops-detect-anomalies,Anomaly detection>> +| <<observability-aiops-detect-anomalies,Anomaly detection>> | Detect anomalies by comparing real-time and historical data from different sources to look for unusual, problematic patterns. -| <<aiops-analyze-spikes,Log rate analysis>> +| <<observability-aiops-analyze-spikes,Log rate analysis>> | Find and investigate the causes of unusual spikes or drops in log rates. -| <<aiops-detect-change-points,Change point detection>> +| <<observability-aiops-detect-change-points,Change point detection>> | Detect distribution changes, trend changes, and other statistically significant change points in a metric of your time series data. |=== diff --git a/docs/en/serverless/alerting/aggregation-options.asciidoc b/docs/en/serverless/alerting/aggregation-options.asciidoc index 049fb67ded..981eaf9e23 100644 --- a/docs/en/serverless/alerting/aggregation-options.asciidoc +++ b/docs/en/serverless/alerting/aggregation-options.asciidoc @@ -1,4 +1,4 @@ -[[aggregationOptions]] +[[observability-aggregationOptions]] = Aggregation options :description: Learn about aggregations available in alerting rules. @@ -33,7 +33,7 @@ The following aggregations are available in some rules: | Numeric value which represents the point at which n% of all values in the selected dataset are lower (choices are 95th or 99th). | Rate -| Rate at which a specific field changes over time. To learn about how the rate is calculated, refer to <<rateAggregation>>. +| Rate at which a specific field changes over time. To learn about how the rate is calculated, refer to <<observability-rateAggregation>>. | Sum | Total of a numeric field in the selected dataset. diff --git a/docs/en/serverless/alerting/aiops-generate-anomaly-alerts.asciidoc b/docs/en/serverless/alerting/aiops-generate-anomaly-alerts.asciidoc index d27163a716..1fa1d6e439 100644 --- a/docs/en/serverless/alerting/aiops-generate-anomaly-alerts.asciidoc +++ b/docs/en/serverless/alerting/aiops-generate-anomaly-alerts.asciidoc @@ -1,4 +1,4 @@ -[[aiops-generate-anomaly-alerts]] +[[observability-aiops-generate-anomaly-alerts]] = Create an anomaly detection rule :description: Get alerts when anomalies match specific conditions. @@ -29,7 +29,7 @@ To create an anomaly detection rule: . In your {observability} project, go to **AIOps** → **Anomaly detection**. . In the list of anomaly detection jobs, find the job you want to check for anomalies. -Haven't created a job yet? <<aiops-detect-anomalies,Create one now>>. +Haven't created a job yet? <<observability-aiops-detect-anomalies,Create one now>>. . From the **Actions** menu next to the job, select **Create alert rule**. . Specify a name and optional tags for the rule. You can use these tags later to filter alerts. . Verify that the correct job is selected and configure the alert details: @@ -80,7 +80,7 @@ Alerts generated by these rules do not appear on the **Alerts** page. ==== [discrete] -[[aiops-generate-anomaly-alerts-add-actions]] +[[observability-aiops-generate-anomaly-alerts-add-actions]] == Add actions You can extend your rules with actions that interact with third-party systems, write to logs or indices, or send user notifications. You can add an action to a rule at any time. You can create rules without adding actions, and you can also define multiple actions for a single rule. @@ -189,7 +189,7 @@ The typical value for the bucket, according to analytical modeling. ===== [discrete] -[[aiops-generate-anomaly-alerts-edit-an-anomaly-detection-rule]] +[[observability-aiops-generate-anomaly-alerts-edit-an-anomaly-detection-rule]] == Edit an anomaly detection rule To edit an anomaly detection rule: diff --git a/docs/en/serverless/alerting/alerting.asciidoc b/docs/en/serverless/alerting/alerting.asciidoc index 2a5d0534db..14fd27b4f4 100644 --- a/docs/en/serverless/alerting/alerting.asciidoc +++ b/docs/en/serverless/alerting/alerting.asciidoc @@ -1,4 +1,4 @@ -[[alerting]] +[[observability-alerting]] = Alerting :description: Get alerts based on rules you define for detecting complex conditions in your applications and services. @@ -9,7 +9,7 @@ preview:[] Alerting enables you to define _rules_, which detect complex conditions within different apps and trigger actions when those conditions are met. Alerting provides a set of built-in connectors and rules for you to use. This page describes all of these elements and how they operate together. [discrete] -[[alerting-important-concepts]] +[[observability-alerting-important-concepts]] == Important concepts Alerting works by running checks on a schedule to detect conditions defined by a rule. You can define rules at different levels (service, environment, transaction) or use custom KQL queries. When a condition is met, the rule tracks it as an _alert_ and responds by triggering one or more _actions_. @@ -19,7 +19,7 @@ Actions typically involve interaction with Elastic services or third-party integ Once you've defined your rules, you can monitor any alerts triggered by these rules in real time, with detailed dashboards that help you quickly identify and troubleshoot any issues that may arise. You can also extend your alerts with notifications via services or third-party incident management systems. [discrete] -[[alerting-alerts-page]] +[[observability-alerting-alerts-page]] == Alerts page On the **Alerts** page, the Alerts table provides a snapshot of alerts occurring within the specified time frame. The table includes the alert status, when it was last updated, the reason for the alert, and more. @@ -27,11 +27,11 @@ On the **Alerts** page, the Alerts table provides a snapshot of alerts occurring [role="screenshot"] image::images/observability-alerts-overview.png[Summary of Alerts on the {observability} overview page] -You can filter this table by alert status or time period, customize the visible columns, and search for specific alerts (for example, alerts related to a specific service or environment) using KQL. Select **View alert detail** from the **More actions** menu image:images/icons/boxesHorizontal.svg[action menu], or click the Reason link for any alert to <<view-alerts,view alert>> in detail, and you can then either **View in app** or **View rule details**. +You can filter this table by alert status or time period, customize the visible columns, and search for specific alerts (for example, alerts related to a specific service or environment) using KQL. Select **View alert detail** from the **More actions** menu image:images/icons/boxesHorizontal.svg[action menu], or click the Reason link for any alert to <<observability-view-alerts,view alert>> in detail, and you can then either **View in app** or **View rule details**. [discrete] -[[alerting-next-steps]] +[[observability-alerting-next-steps]] == Next steps -* <<create-manage-rules>> -* <<view-alerts>> +* <<observability-create-manage-rules>> +* <<observability-view-alerts>> diff --git a/docs/en/serverless/alerting/create-anomaly-alert-rule.asciidoc b/docs/en/serverless/alerting/create-anomaly-alert-rule.asciidoc index 356ef2de8e..2d2a8b7ae6 100644 --- a/docs/en/serverless/alerting/create-anomaly-alert-rule.asciidoc +++ b/docs/en/serverless/alerting/create-anomaly-alert-rule.asciidoc @@ -1,4 +1,4 @@ -[[create-anomaly-alert-rule]] +[[observability-create-anomaly-alert-rule]] = Create an APM anomaly rule :description: Get alerts when either the latency, throughput, or failed transaction rate of a service is abnormal. @@ -41,7 +41,7 @@ To create your anomaly rule: . **Save** your rule. [discrete] -[[create-anomaly-alert-rule-add-actions]] +[[observability-create-anomaly-alert-rule-add-actions]] == Add actions You can extend your rules with actions that interact with third-party systems, write to logs or indices, or send user notifications. You can add an action to a rule at any time. You can create rules without adding actions, and you can also define multiple actions for a single rule. diff --git a/docs/en/serverless/alerting/create-custom-threshold-alert-rule.asciidoc b/docs/en/serverless/alerting/create-custom-threshold-alert-rule.asciidoc index 52862e7ad9..63129e950c 100644 --- a/docs/en/serverless/alerting/create-custom-threshold-alert-rule.asciidoc +++ b/docs/en/serverless/alerting/create-custom-threshold-alert-rule.asciidoc @@ -1,4 +1,4 @@ -[[create-custom-threshold-alert-rule]] +[[observability-create-custom-threshold-alert-rule]] = Create a custom threshold rule :description: Get alerts when an Observability data type reach a given value. @@ -48,7 +48,7 @@ Set the conditions for the rule to detect using aggregations, an equation, and a Aggregations summarize your data to make it easier to analyze. Set any of the following aggregation types to gather data to create your rule: `Average`, `Max`, `Min`, `Cardinality`, `Count`, `Sum,` `Percentile`, or `Rate`. -For more information about these options, refer to <<aggregationOptions>>. +For more information about these options, refer to <<observability-aggregationOptions>>. For example, to gather the total number of log documents with a log level of `warn`: @@ -120,7 +120,7 @@ If both groups match the conditions, alerts are triggered for both groups. When you select **Alert me if a group stops reporting data**, the rule is triggered if a group that previously reported metrics does not report them again over the expected time period. [discrete] -[[create-custom-threshold-alert-rule-add-actions]] +[[observability-create-custom-threshold-alert-rule-add-actions]] == Add actions You can extend your rules with actions that interact with third-party systems, write to logs or indices, or send user notifications. You can add an action to a rule at any time. You can create rules without adding actions, and you can also define multiple actions for a single rule. @@ -206,4 +206,5 @@ List of the condition values. `context.viewInAppUrl`:: Link to the alert source. + ===== diff --git a/docs/en/serverless/alerting/create-elasticsearch-query-alert-rule.asciidoc b/docs/en/serverless/alerting/create-elasticsearch-query-alert-rule.asciidoc index f3f2d38726..56416feb94 100644 --- a/docs/en/serverless/alerting/create-elasticsearch-query-alert-rule.asciidoc +++ b/docs/en/serverless/alerting/create-elasticsearch-query-alert-rule.asciidoc @@ -1,4 +1,4 @@ -[[create-elasticsearch-query-rule]] +[[observability-create-elasticsearch-query-rule]] = Create an Elasticsearch query rule :description: Get alerts when matches are found during the latest query run. @@ -28,7 +28,7 @@ threshold condition is met. An {es} query rule can be defined using {es} Query Domain Specific Language (DSL), {es} Query Language (ES|QL), {kib} Query Language (KQL), or Lucene. [discrete] -[[create-elasticsearch-query-rule-define-the-conditions]] +[[observability-create-elasticsearch-query-rule-define-the-conditions]] == Define the conditions When you create an {es} query rule, your choice of query type affects the information you must provide. @@ -92,7 +92,7 @@ Generally this value should be set to a value that is smaller than the time wind detection. [discrete] -[[create-elasticsearch-query-rule-test-your-query]] +[[observability-create-elasticsearch-query-rule-test-your-query]] == Test your query Use the **Test query** feature to verify that your query is valid. @@ -114,7 +114,7 @@ image::images/alerting-rule-types-esql-query-valid.png[Test ES|QL query returns If the query is not valid, an error occurs. [discrete] -[[create-elasticsearch-query-rule-add-actions]] +[[observability-create-elasticsearch-query-rule-add-actions]] == Add actions // TODO: Decide whether to use boiler plate text, or the text from the source docs for this rule. @@ -252,7 +252,7 @@ The value that met the threshold condition. ===== [discrete] -[[create-elasticsearch-query-rule-handling-multiple-matches-of-the-same-document]] +[[observability-create-elasticsearch-query-rule-handling-multiple-matches-of-the-same-document]] == Handling multiple matches of the same document By default, **Exclude matches from previous run** is turned on and the rule checks diff --git a/docs/en/serverless/alerting/create-error-count-threshold-alert-rule.asciidoc b/docs/en/serverless/alerting/create-error-count-threshold-alert-rule.asciidoc index 16db8902bb..932f53107e 100644 --- a/docs/en/serverless/alerting/create-error-count-threshold-alert-rule.asciidoc +++ b/docs/en/serverless/alerting/create-error-count-threshold-alert-rule.asciidoc @@ -1,4 +1,4 @@ -[[create-error-count-threshold-alert-rule]] +[[observability-create-error-count-threshold-alert-rule]] = Create an error count threshold rule :description: Get alerts when the number of errors in a service exceeds a defined threshold. @@ -43,7 +43,7 @@ To create your error count threshold rule: . **Save** your rule. [discrete] -[[create-error-count-threshold-alert-rule-add-actions]] +[[observability-create-error-count-threshold-alert-rule-add-actions]] == Add actions You can extend your rules with actions that interact with third-party systems, write to logs or indices, or send user notifications. You can add an action to a rule at any time. You can create rules without adding actions, and you can also define multiple actions for a single rule. diff --git a/docs/en/serverless/alerting/create-failed-transaction-rate-threshold-alert-rule.asciidoc b/docs/en/serverless/alerting/create-failed-transaction-rate-threshold-alert-rule.asciidoc index 6dbcc418e0..8cca435f81 100644 --- a/docs/en/serverless/alerting/create-failed-transaction-rate-threshold-alert-rule.asciidoc +++ b/docs/en/serverless/alerting/create-failed-transaction-rate-threshold-alert-rule.asciidoc @@ -1,4 +1,4 @@ -[[create-failed-transaction-rate-threshold-alert-rule]] +[[observability-create-failed-transaction-rate-threshold-alert-rule]] = Create a failed transaction rate threshold rule :description: Get alerts when the rate of transaction errors in a service exceeds a defined threshold. @@ -43,7 +43,7 @@ To create your failed transaction rate threshold rule: . **Save** your rule. [discrete] -[[create-failed-transaction-rate-threshold-alert-rule-add-actions]] +[[observability-create-failed-transaction-rate-threshold-alert-rule-add-actions]] == Add actions You can extend your rules with actions that interact with third-party systems, write to logs or indices, or send user notifications. You can add an action to a rule at any time. You can create rules without adding actions, and you can also define multiple actions for a single rule. diff --git a/docs/en/serverless/alerting/create-inventory-threshold-alert-rule.asciidoc b/docs/en/serverless/alerting/create-inventory-threshold-alert-rule.asciidoc index ae3671a988..6edf4d0e95 100644 --- a/docs/en/serverless/alerting/create-inventory-threshold-alert-rule.asciidoc +++ b/docs/en/serverless/alerting/create-inventory-threshold-alert-rule.asciidoc @@ -1,4 +1,4 @@ -[[create-inventory-threshold-alert-rule]] +[[observability-create-inventory-threshold-alert-rule]] = Create an inventory rule :description: Get alerts when the infrastructure inventory exceeds a defined threshold. @@ -172,6 +172,6 @@ Link to the alert source. == Settings With infrastructure threshold rules, it's not possible to set an explicit index pattern as part of the configuration. The index pattern -is instead inferred from **Metrics indices** on the <<configure-intra-settings,Settings>> page of the {infrastructure-app}. +is instead inferred from **Metrics indices** on the <<observability-configure-intra-settings,Settings>> page of the {infrastructure-app}. With each execution of the rule check, the **Metrics indices** setting is checked, but it is not stored when the rule is created. diff --git a/docs/en/serverless/alerting/create-latency-threshold-alert-rule.asciidoc b/docs/en/serverless/alerting/create-latency-threshold-alert-rule.asciidoc index b406938267..2457907a60 100644 --- a/docs/en/serverless/alerting/create-latency-threshold-alert-rule.asciidoc +++ b/docs/en/serverless/alerting/create-latency-threshold-alert-rule.asciidoc @@ -1,4 +1,4 @@ -[[create-latency-threshold-alert-rule]] +[[observability-create-latency-threshold-alert-rule]] = Create a latency threshold rule :description: Get alerts when the latency of a specific transaction type in a service exceeds a defined threshold. @@ -46,7 +46,7 @@ To create your latency threshold rule:: . **Save** your rule. [discrete] -[[create-latency-threshold-alert-rule-add-actions]] +[[observability-create-latency-threshold-alert-rule-add-actions]] == Add actions You can extend your rules with actions that interact with third-party systems, write to logs or indices, or send user notifications. You can add an action to a rule at any time. You can create rules without adding actions, and you can also define multiple actions for a single rule. @@ -125,7 +125,7 @@ Link to the alert source. ===== [discrete] -[[create-latency-threshold-alert-rule-example]] +[[create-latency-transaction-rate-threshold-example]] == Example The latency threshold alert triggers when the latency of a specific transaction type in a service exceeds a defined threshold. diff --git a/docs/en/serverless/alerting/create-manage-rules.asciidoc b/docs/en/serverless/alerting/create-manage-rules.asciidoc index 625d0a4269..1a287a4edc 100644 --- a/docs/en/serverless/alerting/create-manage-rules.asciidoc +++ b/docs/en/serverless/alerting/create-manage-rules.asciidoc @@ -1,4 +1,4 @@ -[[create-manage-rules]] +[[observability-create-manage-rules]] = Create and manage rules :description: Create and manage rules for alerting when conditions are met. @@ -16,7 +16,7 @@ include::../partials/roles.asciidoc[] Alerting enables you to define _rules_, which detect complex conditions within different apps and trigger actions when those conditions are met. Alerting provides a set of built-in connectors and rules for you to use. [discrete] -[[create-manage-rules-observability-rules]] +[[observability-create-manage-rules-observability-rules]] == Observability rules Learn more about Observability rules and how to create them: @@ -25,50 +25,50 @@ Learn more about Observability rules and how to create them: | Rule type | Name | Detects when... | AIOps -| <<create-anomaly-alert-rule,Anomaly detection>> +| <<observability-create-anomaly-alert-rule,Anomaly detection>> | Anomalies match specific conditions. | APM -| <<create-anomaly-alert-rule,APM anomaly>> +| <<observability-create-anomaly-alert-rule,APM anomaly>> | The latency, throughput, or failed transaction rate of a service is abnormal. | Observability -| <<create-anomaly-alert-rule,Custom threshold>> +| <<observability-create-anomaly-alert-rule,Custom threshold>> | An Observability data type reaches or exceeds a given value. | Stack -| <<create-elasticsearch-query-rule,{es} query>> +| <<observability-create-elasticsearch-query-rule,{es} query>> | Matches are found during the latest query run. | APM -| <<create-error-count-threshold-alert-rule,Error count threshold>> +| <<observability-create-error-count-threshold-alert-rule,Error count threshold>> | The number of errors in a service exceeds a defined threshold. | APM -| <<create-failed-transaction-rate-threshold-alert-rule,Failed transaction rate threshold>> +| <<observability-create-failed-transaction-rate-threshold-alert-rule,Failed transaction rate threshold>> | The rate of transaction errors in a service exceeds a defined threshold. | Metrics -| <<create-inventory-threshold-alert-rule,Inventory>> +| <<observability-create-inventory-threshold-alert-rule,Inventory>> | The infrastructure inventory exceeds a defined threshold. | APM -| <<create-latency-threshold-alert-rule,Latency threshold>> +| <<observability-create-latency-threshold-alert-rule,Latency threshold>> | The latency of a specific transaction type in a service exceeds a defined threshold. | SLO -| <<create-slo-burn-rate-alert-rule,SLO burn rate rule>> +| <<observability-create-slo-burn-rate-alert-rule,SLO burn rate rule>> | The burn rate is above a defined threshold. |=== [discrete] -[[create-manage-rules-creating-rules-and-alerts]] +[[observability-create-manage-rules-creating-rules-and-alerts]] == Creating rules and alerts You start by defining the rule and how often it should be evaluated. You can extend these rules by adding an appropriate action (for example, send an email or create an issue) to be triggered when the rule conditions are met. These actions are defined within each rule and implemented by the appropriate connector for that action e.g. Slack, Jira. You can create any rules from scratch using the **Manage Rules** page, or you can create specific rule types from their respective UIs and benefit from some of the details being pre-filled (for example, Name and Tags). * For APM alert types, you can select **Alerts and rules** and create rules directly from the **Services**, **Traces**, and **Dependencies** UIs. -* For SLO alert types, from the **SLOs** page open the **More actions** menu image:images/icons/boxesHorizontal.svg[action menu] for an SLO and select **Create new alert rule**. Alternatively, when you create a new SLO, the **Create new SLO burn rate alert rule** checkbox is enabled by default and will prompt you to <<create-slo-burn-rate-alert-rule,Create SLO burn rate rule>> upon saving the SLO. +* For SLO alert types, from the **SLOs** page open the **More actions** menu image:images/icons/boxesHorizontal.svg[action menu] for an SLO and select **Create new alert rule**. Alternatively, when you create a new SLO, the **Create new SLO burn rate alert rule** checkbox is enabled by default and will prompt you to <<observability-create-slo-burn-rate-alert-rule,Create SLO burn rate rule>> upon saving the SLO. //// /* @@ -90,7 +90,7 @@ From the action menu you can also: * Update API keys [discrete] -[[create-manage-rules-view-rule-details]] +[[observability-create-manage-rules-view-rule-details]] == View rule details Click on an individual rule on the **{rules-app}** page to view details including the rule name, status, definition, execution history, related alerts, and more. @@ -110,7 +110,7 @@ The rule ran without errors. The rule ran with some non-critical errors. [discrete] -[[create-manage-rules-snooze-and-disable-rules]] +[[observability-create-manage-rules-snooze-and-disable-rules]] == Snooze and disable rules The rule listing enables you to quickly snooze, disable, enable, or delete individual rules. @@ -131,7 +131,7 @@ preview:[] To temporarily suppress notifications for _all_ rules, create a https // Remove tech preview? [discrete] -[[create-manage-rules-import-and-export-rules]] +[[observability-create-manage-rules-import-and-export-rules]] == Import and export rules To import and export rules, use https://www.elastic.co/docs/current/serverless/saved-objects[{saved-objects-app}]. diff --git a/docs/en/serverless/alerting/create-slo-burn-rate-alert-rule.asciidoc b/docs/en/serverless/alerting/create-slo-burn-rate-alert-rule.asciidoc index 997548cfa5..68be476479 100644 --- a/docs/en/serverless/alerting/create-slo-burn-rate-alert-rule.asciidoc +++ b/docs/en/serverless/alerting/create-slo-burn-rate-alert-rule.asciidoc @@ -1,4 +1,4 @@ -[[create-slo-burn-rate-alert-rule]] +[[observability-create-slo-burn-rate-alert-rule]] = Create an SLO burn rate rule :description: Get alerts when the SLO failure rate is too high over a defined period of time. @@ -51,7 +51,7 @@ To create an SLO burn rate rule: . **Save** your rule. [discrete] -[[create-slo-burn-rate-alert-rule-add-actions]] +[[observability-create-slo-burn-rate-alert-rule-add-actions]] == Add actions You can extend your rules with actions that interact with third-party systems, write to logs or indices, or send user notifications. You can add an action to a rule at any time. You can create rules without adding actions, and you can also define multiple actions for a single rule. @@ -130,10 +130,10 @@ The url to the SLO details page to help with further investigation. ===== [discrete] -[[create-slo-burn-rate-alert-rule-next-steps]] +[[observability-create-slo-burn-rate-alert-rule-next-steps]] == Next steps Learn how to view alerts and triage SLO burn rate breaches: -* <<view-alerts>> -* <<triage-slo-burn-rate-breaches>> +* <<observability-view-alerts>> +* <<observability-triage-slo-burn-rate-breaches>> diff --git a/docs/en/serverless/alerting/rate-aggregation.asciidoc b/docs/en/serverless/alerting/rate-aggregation.asciidoc index 70028b6347..dcb3839b56 100644 --- a/docs/en/serverless/alerting/rate-aggregation.asciidoc +++ b/docs/en/serverless/alerting/rate-aggregation.asciidoc @@ -1,4 +1,4 @@ -[[rateAggregation]] +[[observability-rateAggregation]] = Rate aggregation :description: Analyze the rate at which a specific field changes over time. @@ -13,7 +13,7 @@ For example, imagine you have a counter field called restarts that increments ea You can use rate aggregation to get an alert if the service restarts more than X times within a specific time window (for example, per day). [discrete] -[[rateAggregation-how-rates-are-calculated]] +[[observability-rateAggregation-how-rates-are-calculated]] == How rates are calculated Rates used in alerting rules are calculated by comparing the maximum value of the field in the previous bucket to the maximum value of the field in the current bucket and then dividing the result by the number of seconds in the selected interval. diff --git a/docs/en/serverless/alerting/synthetic-monitor-status-alert.asciidoc b/docs/en/serverless/alerting/synthetic-monitor-status-alert.asciidoc new file mode 100644 index 0000000000..ac02693e09 --- /dev/null +++ b/docs/en/serverless/alerting/synthetic-monitor-status-alert.asciidoc @@ -0,0 +1,134 @@ +[[observability-monitor-status-alert]] += Create a synthetic monitor status rule + +:description: Get alerts based on the status of synthetic monitors. +:keywords: serverless, observability, how-to, alerting + +++++ +<titleabbrev>Synthetic monitor status</titleabbrev> +++++ + +Within the Synthetics UI, create a **Monitor Status** rule to receive notifications +based on errors and outages. + +. To access this page, go to **Synthetics** → **Overview**. +. At the top of the page, click **Alerts and rules** → **Monitor status rule** → **Create status rule**. + +[discrete] +[[observability-monitor-status-alert-filters]] +== Filters + +The **Filter by** section controls the scope of the rule. +The rule will only check monitors that match the filters defined in this section. +In this example, the rule will only alert on `browser` monitors located in `Asia/Pacific - Japan`. + +[role="screenshot"] +image::images/synthetic-monitor-filters.png[Filter by section of the Synthetics monitor status rule] + +[discrete] +[[observability-monitor-status-alert-conditions]] +== Conditions + +Conditions for each rule will be applied to all monitors that match the filters in the <<observability-monitor-status-alert-filters,**Filter by** section>>. +You can choose the number of times the monitor has to be down relative to either a number of checks run +or a time range in which checks were run, and the minimum number of locations the monitor must be down in. + +[NOTE] +==== +Retests are included in the number of checks. +==== + +The **Rule schedule** defines how often to evaluate the condition. Note that checks are queued, and they run as close +to the defined value as capacity allows. For example, if a check is scheduled to run every 2 minutes, but the check +takes longer than 2 minutes to run, a check will not run until the previous check has finished. + +You can also set **Advanced options** such as the number of consecutive runs that must meet the rule conditions before +an alert occurs. + +In this example, the conditions will be met any time a `browser` monitor is down `3` of the last `5` times +the monitor ran across any locations that match the filter. These conditions will be evaluated every minute, +and you will only receive an alert when the conditions are met three times consecutively. + +[role="screenshot"] +image::images/synthetic-monitor-conditions.png[Filters and conditions defining a Synthetics monitor status rule] + +[discrete] +[[observability-monitor-status-alert-action-types]] +== Action types + +Extend your rules by connecting them to actions that use the following supported built-in integrations. + +include::./alerting-connectors.asciidoc[] + +After you select a connector, you must set the action frequency. +You can choose to create a summary of alerts on each check interval or on a custom interval. +For example, send email notifications that summarize the new, ongoing, and recovered alerts each hour: + +[role="screenshot"] +image::images/synthetic-monitor-action-types-summary.png[] + +Alternatively, you can set the action frequency such that you choose how often the action runs +(for example, at each check interval, only when the alert status changes, or at a custom action interval). +In this case, you must also select the specific threshold condition that affects when actions run: +the _Synthetics monitor status_ changes or when it is _Recovered_ (went from down to up). + +[role="screenshot"] +image::images/synthetic-monitor-action-types-each-alert.png[] + +You can also further refine the conditions under which actions run by specifying that actions only run +when they match a KQL query or when an alert occurs within a specific time frame: + +* **If alert matches query**: Enter a KQL query that defines field-value pairs or query conditions that must +be met for notifications to send. The query only searches alert documents in the indices specified for the rule. +* **If alert is generated during timeframe**: Set timeframe details. Notifications are only sent if alerts are +generated within the timeframe you define. + +[role="screenshot"] +image::images/synthetic-monitor-action-types-more-options.png[] + +[discrete] +[[observability-monitor-status-alert-action-variables]] +=== Action variables + +Use the default notification message or customize it. +You can add more context to the message by clicking the icon above the message text box +and selecting from a list of available variables. + +[role="screenshot"] +image::images/synthetic-monitor-action-variables.png[] + +The following variables are specific to this rule type. +You an also specify {kibana-ref}/rule-action-variables.html[variables common to all rules]. + +`context.checkedAt`:: +Timestamp of the monitor run. +`context.hostName`:: +Hostname of the location from which the check is performed. +`context.lastErrorMessage`:: +Monitor last error message. +`context.locationId`:: +Location id from which the check is performed. +`context.locationName`:: +Location name from which the check is performed. +`context.locationNames`:: +Location names from which the checks are performed. +`context.message`:: +A generated message summarizing the status of monitors currently down. +`context.monitorId`:: +ID of the monitor. +`context.monitorName`:: +Name of the monitor. +`context.monitorTags`:: +Tags associated with the monitor. +`context.monitorType`:: +Type (for example, HTTP/TCP) of the monitor. +`context.monitorUrl`:: +URL of the monitor. +`context.reason`:: +A concise description of the reason for the alert. +`context.recoveryReason`:: +A concise description of the reason for the recovery. +`context.status`:: +Monitor status (for example, "down"). +`context.viewInAppUrl`:: +Open alert details and context in Synthetics app. diff --git a/docs/en/serverless/alerting/triage-slo-burn-rate-breaches.asciidoc b/docs/en/serverless/alerting/triage-slo-burn-rate-breaches.asciidoc index 10130c34c0..d3fb7f95d6 100644 --- a/docs/en/serverless/alerting/triage-slo-burn-rate-breaches.asciidoc +++ b/docs/en/serverless/alerting/triage-slo-burn-rate-breaches.asciidoc @@ -1,4 +1,4 @@ -[[triage-slo-burn-rate-breaches]] +[[observability-triage-slo-burn-rate-breaches]] = Triage SLO burn rate breaches :description: Triage SLO burn rate breaches to avoid exhausting your error budget and violating your SLO. @@ -10,7 +10,7 @@ preview:[] -SLO burn rate breaches occur when the percentage of bad events over a specified time period exceeds the threshold set in your <<create-slo-burn-rate-alert-rule,SLO burn rate rule>>. +SLO burn rate breaches occur when the percentage of bad events over a specified time period exceeds the threshold set in your <<observability-create-slo-burn-rate-alert-rule,SLO burn rate rule>>. When this happens, you are at risk of exhausting your error budget and violating your SLO. To triage issues quickly, go to the alert details page: @@ -53,7 +53,7 @@ The contents of the alert details page may vary depending on the type of SLI tha After investigating the alert, you may want to: * Click **Snooze the rule** to snooze notifications for a specific time period or indefinitely. -* Click the image:images/icons/boxesVertical.svg[Actions] icon and select **Add to case** to add the alert to a new or existing case. To learn more, refer to <<cases>>. +* Click the image:images/icons/boxesVertical.svg[Actions] icon and select **Add to case** to add the alert to a new or existing case. To learn more, refer to <<observability-cases>>. * Click the image:images/icons/boxesVertical.svg[Actions] icon and select **Mark as untracked**. When an alert is marked as untracked, actions are no longer generated. You can choose to move active alerts to this state when you disable or delete rules. diff --git a/docs/en/serverless/alerting/triage-threshold-breaches.asciidoc b/docs/en/serverless/alerting/triage-threshold-breaches.asciidoc index 71d0003926..5499637d2a 100644 --- a/docs/en/serverless/alerting/triage-threshold-breaches.asciidoc +++ b/docs/en/serverless/alerting/triage-threshold-breaches.asciidoc @@ -1,4 +1,4 @@ -[[triage-threshold-breaches]] +[[observability-triage-threshold-breaches]] = Triage threshold breaches :description: Triage threshold breaches on the alert details page. @@ -8,7 +8,7 @@ <titleabbrev>Threshold breaches</titleabbrev> ++++ -Threshold breaches occur when an {observability} data type reaches or exceeds the threshold set in your <<create-custom-threshold-alert-rule,custom threshold rule>>. +Threshold breaches occur when an {observability} data type reaches or exceeds the threshold set in your <<observability-create-custom-threshold-alert-rule,custom threshold rule>>. For example, you might have a custom threshold rule that triggers an alert when the total number of log documents with a log level of `error` reaches 100. To triage issues quickly, go to the alert details page: @@ -58,7 +58,7 @@ state, and how the issue is trending. After investigating the alert, you may want to: * Click **Snooze the rule** to snooze notifications for a specific time period or indefinitely. -* Click the image:images/icons/boxesVertical.svg[Actions] icon and select **Add to case** to add the alert to a new or existing case. To learn more, refer to <<cases>>. +* Click the image:images/icons/boxesVertical.svg[Actions] icon and select **Add to case** to add the alert to a new or existing case. To learn more, refer to <<observability-cases>>. * Click the image:images/icons/boxesVertical.svg[Actions] icon and select **Mark as untracked**. When an alert is marked as untracked, actions are no longer generated. You can choose to move active alerts to this state when you disable or delete rules. diff --git a/docs/en/serverless/alerting/view-alerts.asciidoc b/docs/en/serverless/alerting/view-alerts.asciidoc index 731b5716aa..bf1e7b794c 100644 --- a/docs/en/serverless/alerting/view-alerts.asciidoc +++ b/docs/en/serverless/alerting/view-alerts.asciidoc @@ -1,4 +1,4 @@ -[[view-alerts]] +[[observability-view-alerts]] = View alerts :description: Track and manage alerts for your services and applications. @@ -21,7 +21,7 @@ You can track and manage alerts for your applications and SLOs from the **Alerts image::images/observability-alerts-view.png[Alerts page] [discrete] -[[view-alerts-filter-alerts]] +[[observability-view-alerts-filter-alerts]] == Filter alerts To help you get started with your analysis faster, use the KQL bar to create structured queries using @@ -40,7 +40,7 @@ You can also filter by alert status using the buttons below the KQL bar. By default, this filter is set to **Show all** alerts, but you can filter to show only active, recovered or untracked alerts. [discrete] -[[view-alerts-view-alert-details]] +[[observability-view-alerts-view-alert-details]] == View alert details There are a few ways to inspect the details for a specific alert. @@ -91,7 +91,7 @@ To view the alert in the app that triggered it: * From the **Alerts** table, click the image:images/icons/eye.svg[View in app] icon. [discrete] -[[view-alerts-customize-the-alerts-table]] +[[observability-view-alerts-customize-the-alerts-table]] == Customize the alerts table Use the toolbar buttons in the upper-left of the alerts table to customize the columns you want displayed: @@ -109,7 +109,7 @@ For more information about their impact on alert notifications, refer to https:/ You can also use the toolbar buttons in the upper-right to customize the display options or view the table in full-screen mode. [discrete] -[[view-alerts-add-alerts-to-cases]] +[[observability-view-alerts-add-alerts-to-cases]] == Add alerts to cases From the **Alerts** table, you can add one or more alerts to a case. @@ -122,7 +122,7 @@ Each case can have a maximum of 1,000 alerts. ==== [discrete] -[[view-alerts-add-an-alert-to-a-new-case]] +[[observability-view-alerts-add-an-alert-to-a-new-case]] === Add an alert to a new case To add an alert to a new case: @@ -130,10 +130,10 @@ To add an alert to a new case: . Select **Add to new case**. . Enter a case name, add relevant tags, and include a case description. . Under **External incident management system**, select a connector. If you've previously added one, that connector displays as the default selection. Otherwise, the default setting is `No connector selected`. -. After you've completed all of the required fields, click **Create case**. A notification message confirms you successfully created the case. To view the case details, click the notification link or go to the <<cases,Cases>> page. +. After you've completed all of the required fields, click **Create case**. A notification message confirms you successfully created the case. To view the case details, click the notification link or go to the <<observability-cases,Cases>> page. [discrete] -[[view-alerts-add-an-alert-to-an-existing-case]] +[[observability-view-alerts-add-an-alert-to-an-existing-case]] === Add an alert to an existing case To add an alert to an existing case: diff --git a/docs/en/serverless/apm-agents/apm-agents-aws-lambda-functions.asciidoc b/docs/en/serverless/apm-agents/apm-agents-aws-lambda-functions.asciidoc index fbda6f21bb..e8161a19bb 100644 --- a/docs/en/serverless/apm-agents/apm-agents-aws-lambda-functions.asciidoc +++ b/docs/en/serverless/apm-agents/apm-agents-aws-lambda-functions.asciidoc @@ -1,4 +1,4 @@ -[[apm-agents-aws-lambda-functions]] +[[observability-apm-agents-aws-lambda-functions]] = AWS Lambda functions :description: Use Elastic APM to monitor your AWS Lambda functions. @@ -7,7 +7,7 @@ preview:[] Elastic APM lets you monitor your AWS Lambda functions. -The natural integration of <<apm-distributed-tracing,distributed tracing>> into your AWS Lambda functions provides insights into each function's execution and runtime behavior as well as its relationships and dependencies to other services. +The natural integration of <<observability-apm-distributed-tracing,distributed tracing>> into your AWS Lambda functions provides insights into each function's execution and runtime behavior as well as its relationships and dependencies to other services. [discrete] [[aws-lambda-arch]] @@ -30,7 +30,7 @@ image::images/apm-agents-aws-lambda-functions-architecture.png[image showing dat By using an AWS Lambda extension, Elastic APM agents can send data to a local Lambda extension process, and that process will forward data on to the managed intake service asynchronously. The Lambda extension ensures that any potential latency between the Lambda function and the managed intake service instance will not cause latency in the request flow of the Lambda function itself. [discrete] -[[apm-agents-aws-lambda-functions-setup]] +[[observability-apm-agents-aws-lambda-functions-setup]] == Setup To get started with monitoring AWS Lambda functions, refer to the APM agent documentation: @@ -43,5 +43,5 @@ To get started with monitoring AWS Lambda functions, refer to the APM agent docu ==== The APM agent documentation states that you can use either an APM secret token or API key to authorize requests to the managed intake service. **However, when sending data to a project, you _must_ use an API key**. -Read more about API keys in <<apm-keep-data-secure>>. +Read more about API keys in <<observability-apm-keep-data-secure>>. ==== diff --git a/docs/en/serverless/apm-agents/apm-agents-elastic-apm-agents.asciidoc b/docs/en/serverless/apm-agents/apm-agents-elastic-apm-agents.asciidoc index 98ee3bc81d..dce4331e4b 100644 --- a/docs/en/serverless/apm-agents/apm-agents-elastic-apm-agents.asciidoc +++ b/docs/en/serverless/apm-agents/apm-agents-elastic-apm-agents.asciidoc @@ -1,4 +1,4 @@ -[[apm-agents-elastic-apm-agents]] +[[observability-apm-agents-elastic-apm-agents]] = Elastic APM agents :keywords: serverless, observability, overview @@ -88,7 +88,7 @@ include::../transclusion/apm/guide/about/php.asciidoc[] ++++ [discrete] -[[apm-agents-elastic-apm-agents-minimum-supported-versions]] +[[observability-apm-agents-elastic-apm-agents-minimum-supported-versions]] == Minimum supported versions The following versions of Elastic APM agents are supported: diff --git a/docs/en/serverless/apm-agents/apm-agents-opentelemetry-collect-metrics.asciidoc b/docs/en/serverless/apm-agents/apm-agents-opentelemetry-collect-metrics.asciidoc index e919b94ccf..ff47cabc49 100644 --- a/docs/en/serverless/apm-agents/apm-agents-opentelemetry-collect-metrics.asciidoc +++ b/docs/en/serverless/apm-agents/apm-agents-opentelemetry-collect-metrics.asciidoc @@ -1,4 +1,4 @@ -[[apm-agents-opentelemetry-collect-metrics]] +[[observability-apm-agents-opentelemetry-collect-metrics]] = Collect metrics :keywords: serverless, observability, reference diff --git a/docs/en/serverless/apm-agents/apm-agents-opentelemetry-limitations.asciidoc b/docs/en/serverless/apm-agents/apm-agents-opentelemetry-limitations.asciidoc index c0088bde15..aafa296008 100644 --- a/docs/en/serverless/apm-agents/apm-agents-opentelemetry-limitations.asciidoc +++ b/docs/en/serverless/apm-agents/apm-agents-opentelemetry-limitations.asciidoc @@ -1,4 +1,4 @@ -[[apm-agents-opentelemetry-limitations]] +[[observability-apm-agents-opentelemetry-limitations]] = Limitations :keywords: serverless, observability, overview @@ -6,7 +6,7 @@ preview:[] [discrete] -[[apm-agents-opentelemetry-limitations-opentelemetry-traces]] +[[observability-apm-agents-opentelemetry-limitations-opentelemetry-traces]] == OpenTelemetry traces * Traces of applications using `messaging` semantics might be wrongly displayed as `transactions` in the Applications UI, while they should be considered `spans` (see issue https://github.com/elastic/apm-server/issues/7001[#7001]). @@ -37,4 +37,4 @@ The https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/ has been deprecated and replaced by the native support of the OpenTelemetry Line Protocol in Elastic Observability (OTLP). To learn more, see https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/exporter/elasticsearchexporter#migration[migration]. The https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/exporter/elasticsearchexporter[OpenTelemetry Collector exporter for Elastic] -(which is different from the legacy exporter mentioned above) is not intended to be used with Elastic APM and Elastic Observability. Use <<apm-agents-opentelemetry-opentelemetry-native-support,Elastic's native OTLP support>> instead. +(which is different from the legacy exporter mentioned above) is not intended to be used with Elastic APM and Elastic Observability. Use <<observability-apm-agents-opentelemetry-opentelemetry-native-support,Elastic's native OTLP support>> instead. diff --git a/docs/en/serverless/apm-agents/apm-agents-opentelemetry-opentelemetry-native-support.asciidoc b/docs/en/serverless/apm-agents/apm-agents-opentelemetry-opentelemetry-native-support.asciidoc index aff573c737..dd529a31d0 100644 --- a/docs/en/serverless/apm-agents/apm-agents-opentelemetry-opentelemetry-native-support.asciidoc +++ b/docs/en/serverless/apm-agents/apm-agents-opentelemetry-opentelemetry-native-support.asciidoc @@ -1,4 +1,4 @@ -[[apm-agents-opentelemetry-opentelemetry-native-support]] +[[observability-apm-agents-opentelemetry-opentelemetry-native-support]] = Upstream OpenTelemetry Collectors and language SDKs :keywords: serverless, observability, overview @@ -8,18 +8,18 @@ preview:[] [NOTE] ==== This is one of several approaches you can use to integrate Elastic with OpenTelemetry. -**To compare approaches and choose the best approach for your use case, refer to <<apm-agents-opentelemetry>>.** +**To compare approaches and choose the best approach for your use case, refer to <<observability-apm-agents-opentelemetry>>.** ==== Elastic natively supports the OpenTelemetry protocol (OTLP). This means trace data and metrics collected from your applications and infrastructure can be sent directly to Elastic. -* Send data to Elastic from an upstream <<apm-agents-opentelemetry-opentelemetry-native-support-send-data-from-an-upstream-opentelemetry-collector,OpenTelemetry Collector>> -* Send data to Elastic from an upstream <<apm-agents-opentelemetry-opentelemetry-native-support-send-data-from-an-upstream-opentelemetry-sdk,OpenTelemetry language SDK>> +* Send data to Elastic from an upstream <<observability-apm-agents-opentelemetry-opentelemetry-native-support-send-data-from-an-upstream-opentelemetry-collector,OpenTelemetry Collector>> +* Send data to Elastic from an upstream <<observability-apm-agents-opentelemetry-opentelemetry-native-support-send-data-from-an-upstream-opentelemetry-sdk,OpenTelemetry language SDK>> [discrete] -[[apm-agents-opentelemetry-opentelemetry-native-support-send-data-from-an-upstream-opentelemetry-collector]] +[[observability-apm-agents-opentelemetry-opentelemetry-native-support-send-data-from-an-upstream-opentelemetry-collector]] == Send data from an upstream OpenTelemetry Collector Connect your OpenTelemetry Collector instances to Elastic {observability} using the OTLP exporter: @@ -95,7 +95,7 @@ In addition, your data will not be viewable in your Observability project if you ==== [discrete] -[[apm-agents-opentelemetry-opentelemetry-native-support-send-data-from-an-upstream-opentelemetry-sdk]] +[[observability-apm-agents-opentelemetry-opentelemetry-native-support-send-data-from-an-upstream-opentelemetry-sdk]] == Send data from an upstream OpenTelemetry SDK [NOTE] @@ -130,7 +130,7 @@ java -javaagent:/path/to/opentelemetry-javaagent-all.jar \ | | | `OTEL_RESOURCE_ATTRIBUTES` -| Fields that describe the service and the environment that the service runs in. See <<apm-agents-opentelemetry-resource-attributes,resource attributes>> for more information. +| Fields that describe the service and the environment that the service runs in. See <<observability-apm-agents-opentelemetry-resource-attributes,resource attributes>> for more information. | `OTEL_EXPORTER_OTLP_ENDPOINT` | Elastic URL. The host and port that Elastic listens for APM events on. @@ -139,7 +139,7 @@ java -javaagent:/path/to/opentelemetry-javaagent-all.jar \ a| Authorization header that includes the Elastic APM API key: `"Authorization=ApiKey an_api_key"`. Note the required space between `ApiKey` and `an_api_key`. -For information on how to format an API key, refer to <<apm-keep-data-secure-secure-communication-with-apm-agents,Secure communication with APM agents>>. +For information on how to format an API key, refer to <<observability-apm-keep-data-secure-secure-communication-with-apm-agents,Secure communication with APM agents>>. [NOTE] ==== @@ -153,11 +153,11 @@ If you are using a version of the Python OpenTelemetry agent _before_ 1.27.0, th | Logs exporter to use. See https://opentelemetry.io/docs/specs/otel/configuration/sdk-environment-variables/#exporter-selection[exporter selection] for more information. |=== -You are now ready to collect traces and <<apm-agents-opentelemetry-collect-metrics,metrics>> before <<open-telemetry-verify-metrics,verifying metrics>> +You are now ready to collect traces and <<observability-apm-agents-opentelemetry-collect-metrics,metrics>> before <<open-telemetry-verify-metrics,verifying metrics>> and <<open-telemetry-visualize,visualizing metrics>>. [discrete] -[[apm-agents-opentelemetry-opentelemetry-native-support-proxy-requests-to-elastic]] +[[observability-apm-agents-opentelemetry-opentelemetry-native-support-proxy-requests-to-elastic]] == Proxy requests to Elastic Elastic supports both the https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/otlp.md#otlpgrpc[(OTLP/gRPC)] and https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/otlp.md#otlphttp[(OTLP/HTTP)] protocol on the same port as Elastic APM agent requests. For ease of setup, we recommend using OTLP/HTTP when proxying or load balancing requests to Elastic. @@ -173,9 +173,9 @@ For more information on how Elastic services gRPC requests, see https://github.com/elastic/apm-server/blob/main/dev_docs/otel.md#muxing-grpc-and-http11[Muxing gRPC and HTTP/1.1]. [discrete] -[[apm-agents-opentelemetry-opentelemetry-native-support-next-steps]] +[[observability-apm-agents-opentelemetry-opentelemetry-native-support-next-steps]] == Next steps -* <<apm-agents-opentelemetry-collect-metrics,Collect metrics>> -* Add <<apm-agents-opentelemetry-resource-attributes,Resource attributes>> -* Learn about the <<apm-agents-opentelemetry-limitations,limitations of this integration>> +* <<observability-apm-agents-opentelemetry-collect-metrics,Collect metrics>> +* Add <<observability-apm-agents-opentelemetry-resource-attributes,Resource attributes>> +* Learn about the <<observability-apm-agents-opentelemetry-limitations,limitations of this integration>> diff --git a/docs/en/serverless/apm-agents/apm-agents-opentelemetry-resource-attributes.asciidoc b/docs/en/serverless/apm-agents/apm-agents-opentelemetry-resource-attributes.asciidoc index 4d105ebc19..0a1b33f9e8 100644 --- a/docs/en/serverless/apm-agents/apm-agents-opentelemetry-resource-attributes.asciidoc +++ b/docs/en/serverless/apm-agents/apm-agents-opentelemetry-resource-attributes.asciidoc @@ -1,4 +1,4 @@ -[[apm-agents-opentelemetry-resource-attributes]] +[[observability-apm-agents-opentelemetry-resource-attributes]] = Resource attributes :keywords: serverless, observability, how-to diff --git a/docs/en/serverless/apm-agents/apm-agents-opentelemetry.asciidoc b/docs/en/serverless/apm-agents/apm-agents-opentelemetry.asciidoc index 6fd79b4c1d..69363826e9 100644 --- a/docs/en/serverless/apm-agents/apm-agents-opentelemetry.asciidoc +++ b/docs/en/serverless/apm-agents/apm-agents-opentelemetry.asciidoc @@ -1,4 +1,4 @@ -[[apm-agents-opentelemetry]] +[[observability-apm-agents-opentelemetry]] = Use OpenTelemetry with APM :keywords: serverless, observability, overview @@ -14,13 +14,13 @@ https://opentelemetry.io/docs/concepts/what-is-opentelemetry/[OpenTelemetry] is Elastic integrates with OpenTelemetry, allowing you to reuse your existing instrumentation to easily send observability data to the Elastic Stack. There are several ways to integrate OpenTelemetry with the Elastic Stack: -* <<apm-agents-opentelemetry-elastic-distributions-of-opentelemetry-language-sdks,Elastic Distributions of OpenTelemetry language SDKs>> -* <<apm-agents-opentelemetry-upstream-opentelemetry-apisdk-elastic-apm-agent,Upstream OpenTelemetry API/SDK + Elastic APM agent>> -* <<apm-agents-opentelemetry-upstream-opentelemetry-collector-and-language-sdks,Upstream OpenTelemetry Collector and language SDKs>> -* <<apm-agents-opentelemetry-aws-lambda-collector-exporter,AWS Lambda collector exporter>> +* <<observability-apm-agents-opentelemetry-elastic-distributions-of-opentelemetry-language-sdks,Elastic Distributions of OpenTelemetry language SDKs>> +* <<observability-apm-agents-opentelemetry-upstream-opentelemetry-apisdk-elastic-apm-agent,Upstream OpenTelemetry API/SDK + Elastic APM agent>> +* <<observability-apm-agents-opentelemetry-upstream-opentelemetry-collector-and-language-sdks,Upstream OpenTelemetry Collector and language SDKs>> +* <<observability-apm-agents-opentelemetry-aws-lambda-collector-exporter,AWS Lambda collector exporter>> [discrete] -[[apm-agents-opentelemetry-elastic-distributions-of-opentelemetry-language-sdks]] +[[observability-apm-agents-opentelemetry-elastic-distributions-of-opentelemetry-language-sdks]] == Elastic Distributions of OpenTelemetry language SDKs preview::[] @@ -55,10 +55,10 @@ For more details about OpenTelemetry distributions in general, visit the https:/ ==== [discrete] -[[apm-agents-opentelemetry-upstream-opentelemetry-apisdk-elastic-apm-agent]] +[[observability-apm-agents-opentelemetry-upstream-opentelemetry-apisdk-elastic-apm-agent]] == Upstream OpenTelemetry API/SDK + Elastic APM agent -Use the OpenTelemetry API/SDKs with <<apm-agents-elastic-apm-agents,Elastic APM agents>> to translate OpenTelemetry API calls to Elastic APM API calls. +Use the OpenTelemetry API/SDKs with <<observability-apm-agents-elastic-apm-agents,Elastic APM agents>> to translate OpenTelemetry API calls to Elastic APM API calls. [role="screenshot"] image::images/apm-otel-api-sdk-elastic-agent.png[] @@ -81,7 +81,7 @@ Find more details about how to use an OpenTelemetry API or SDK with an Elastic A * https://www.elastic.co/guide/en/apm/agent/python/current/opentelemetry-bridge.html[**APM Python agent →**] [discrete] -[[apm-agents-opentelemetry-upstream-opentelemetry-collector-and-language-sdks]] +[[observability-apm-agents-opentelemetry-upstream-opentelemetry-collector-and-language-sdks]] == Upstream OpenTelemetry Collector and language SDKs The Elastic Stack natively supports the OpenTelemetry protocol (OTLP). This means trace data and metrics collected from your applications and infrastructure by an OpenTelemetry Collector or OpenTelemetry language SDK can be sent to the Elastic Stack. @@ -110,14 +110,14 @@ However, there are some limitations when using collectors and language SDKs buil * You won't have access to Elastic enterprise APM features. * You may experience problems with performance efficiency. -For more on the limitations associated with using upstream OpenTelemetry tools, refer to <<apm-agents-opentelemetry-limitations>>. +For more on the limitations associated with using upstream OpenTelemetry tools, refer to <<observability-apm-agents-opentelemetry-limitations>>. // Where to go next -<<apm-agents-opentelemetry-opentelemetry-native-support,**Get started with upstream OpenTelemetry Collectors and language SDKs →**>> +<<observability-apm-agents-opentelemetry-opentelemetry-native-support,**Get started with upstream OpenTelemetry Collectors and language SDKs →**>> [discrete] -[[apm-agents-opentelemetry-aws-lambda-collector-exporter]] +[[observability-apm-agents-opentelemetry-aws-lambda-collector-exporter]] == AWS Lambda collector exporter AWS Lambda functions can be instrumented with OpenTelemetry and monitored with Elastic Observability. diff --git a/docs/en/serverless/apm/apm-compress-spans.asciidoc b/docs/en/serverless/apm/apm-compress-spans.asciidoc index 2ec9eb36f6..dd0bca1167 100644 --- a/docs/en/serverless/apm/apm-compress-spans.asciidoc +++ b/docs/en/serverless/apm/apm-compress-spans.asciidoc @@ -1,4 +1,4 @@ -[[apm-compress-spans]] +[[observability-apm-compress-spans]] = Compress spans :description: Compress similar or identical spans to reduce storage overhead, processing power needed, and clutter in the Applications UI. @@ -25,7 +25,7 @@ Regardless of the compression strategy, a span is eligible for compression if: * Its outcome is not `"failure"`. [discrete] -[[apm-compress-spans-compression-strategies]] +[[observability-apm-compress-spans-compression-strategies]] == Compression strategies The {apm-agent} selects between two strategies to decide if adjacent spans can be compressed. @@ -33,7 +33,7 @@ In both strategies, only one previous span needs to be kept in memory. This ensures that the agent doesn't require large amounts of memory to enable span compression. [discrete] -[[apm-compress-spans-same-kind-strategy]] +[[observability-apm-compress-spans-same-kind-strategy]] === Same-Kind strategy The agent uses the same-kind strategy if two adjacent spans have the same: @@ -43,7 +43,7 @@ The agent uses the same-kind strategy if two adjacent spans have the same: * `destination.service.resource` (e.g. database name) [discrete] -[[apm-compress-spans-exact-match-strategy]] +[[observability-apm-compress-spans-exact-match-strategy]] === Exact-Match strategy The agent uses the exact-match strategy if two adjacent spans have the same: @@ -54,7 +54,7 @@ The agent uses the exact-match strategy if two adjacent spans have the same: * `destination.service.resource` (e.g. database name) [discrete] -[[apm-compress-spans-settings]] +[[observability-apm-compress-spans-settings]] == Settings You can specify the maximum span duration in the agent's configuration settings. @@ -65,7 +65,7 @@ the "Same-Kind" strategy is disabled by default. For the "Exact-Match" strategy, the default limit is 50 milliseconds. [discrete] -[[apm-compress-spans-agent-support]] +[[observability-apm-compress-spans-agent-support]] === Agent support Support for span compression is available in the following agents and can be configured diff --git a/docs/en/serverless/apm/apm-create-custom-links.asciidoc b/docs/en/serverless/apm/apm-create-custom-links.asciidoc index b846eb8d07..0d9655886b 100644 --- a/docs/en/serverless/apm/apm-create-custom-links.asciidoc +++ b/docs/en/serverless/apm/apm-create-custom-links.asciidoc @@ -1,4 +1,4 @@ -[[apm-create-custom-links]] +[[observability-apm-create-custom-links]] = Create custom links :keywords: serverless, observability, how-to @@ -17,10 +17,10 @@ based on your specific APM data. Custom links can be filtered to only appear for relevant services, environments, transaction types, or transaction names. -Ready to dive in? Jump straight to the <<apm-create-custom-links-custom-link-examples,examples>>. +Ready to dive in? Jump straight to the <<observability-apm-create-custom-links-custom-link-examples,examples>>. [discrete] -[[apm-create-custom-links-create-a-link]] +[[observability-apm-create-custom-links-create-a-link]] == Create a link Each custom link consists of a label, URL, and optional filter. @@ -31,7 +31,7 @@ environment, transaction type, and transaction name. Alternatively, you can create a custom link by navigating to any page within **Applications** and selecting **Settings** → **Custom Links** → **Create custom link**. [discrete] -[[apm-create-custom-links-label]] +[[observability-apm-create-custom-links-label]] === Label The name of your custom link. @@ -43,7 +43,7 @@ Custom links are displayed alphabetically in the actions menu. ==== [discrete] -[[apm-create-custom-links-url]] +[[observability-apm-create-custom-links-url]] === URL The URL your link points to. @@ -58,7 +58,7 @@ To do this, select a trace and click **Metadata** in the **Trace Sample** table. image::images/custom-links/example-metadata.png[Example metadata] [discrete] -[[apm-create-custom-links-filters]] +[[observability-apm-create-custom-links-filters]] === Filters Filter each link to only appear for specific services or transactions. @@ -72,14 +72,14 @@ You can filter on the following fields: Multiple values are allowed when comma-separated. [discrete] -[[apm-create-custom-links-custom-link-examples]] +[[observability-apm-create-custom-links-custom-link-examples]] == Custom link examples Not sure where to start with custom links? Take a look at the examples below and customize them to your liking! [discrete] -[[apm-create-custom-links-email]] +[[observability-apm-create-custom-links-email]] === Email Email the owner of a service. @@ -118,7 +118,7 @@ It will only appear on services with the name `python-backend`. |=== [discrete] -[[apm-create-custom-links-github-issue]] +[[observability-apm-create-custom-links-github-issue]] === GitHub issue Open a GitHub issue with prepopulated metadata from the selected trace sample. @@ -199,7 +199,7 @@ See the https://confluence.atlassian.com/jirakb/how-to-create-issues-using-direc for a full list of supported query parameters. [discrete] -[[apm-create-custom-links-dashboards]] +[[observability-apm-create-custom-links-dashboards]] === Dashboards Link to a custom dashboard. @@ -230,7 +230,7 @@ There are no filters set. |=== [discrete] -[[apm-create-custom-links-slack-channel]] +[[observability-apm-create-custom-links-slack-channel]] === Slack channel Open a specified slack channel. @@ -267,7 +267,7 @@ It only appears when `transaction.name` is `GET user/login`. |=== [discrete] -[[apm-create-custom-links-website]] +[[observability-apm-create-custom-links-website]] === Website Open an internal or external website. diff --git a/docs/en/serverless/apm/apm-data-types.asciidoc b/docs/en/serverless/apm/apm-data-types.asciidoc index 1fde31466b..e5ee0a40e1 100644 --- a/docs/en/serverless/apm/apm-data-types.asciidoc +++ b/docs/en/serverless/apm/apm-data-types.asciidoc @@ -1,4 +1,4 @@ -[[apm-data-types]] +[[observability-apm-data-types]] = APM data types :description: Learn about the various APM data types. diff --git a/docs/en/serverless/apm/apm-distributed-tracing.asciidoc b/docs/en/serverless/apm/apm-distributed-tracing.asciidoc index 5dc0724ce6..fb7ef23de9 100644 --- a/docs/en/serverless/apm/apm-distributed-tracing.asciidoc +++ b/docs/en/serverless/apm/apm-distributed-tracing.asciidoc @@ -1,4 +1,4 @@ -[[apm-distributed-tracing]] +[[observability-apm-distributed-tracing]] = Distributed tracing :description: Understand how a single request that travels through multiple services impacts your application. @@ -6,13 +6,13 @@ preview:[] -A `trace` is a group of <<apm-data-types,transactions>> and <<apm-data-types,spans>> with a common root. +A `trace` is a group of <<observability-apm-data-types,transactions>> and <<observability-apm-data-types,spans>> with a common root. Each `trace` tracks the entirety of a single request. When a `trace` travels through multiple services, as is common in a microservice architecture, it is known as a distributed trace. [discrete] -[[apm-distributed-tracing-why-is-distributed-tracing-important]] +[[observability-apm-distributed-tracing-why-is-distributed-tracing-important]] == Why is distributed tracing important? Distributed tracing enables you to analyze performance throughout your microservice architecture @@ -27,7 +27,7 @@ service borders. For supported technologies, distributed tracing works out-of-the-box, with no additional configuration required. [discrete] -[[apm-distributed-tracing-how-distributed-tracing-works]] +[[observability-apm-distributed-tracing-how-distributed-tracing-works]] == How distributed tracing works Distributed tracing works by injecting a custom `traceparent` HTTP header into outgoing requests. @@ -41,7 +41,7 @@ If it exists, the service ensures the current action is added as a child of the and continues to propagate the trace. [discrete] -[[apm-distributed-tracing-trace-propagation-examples]] +[[observability-apm-distributed-tracing-trace-propagation-examples]] === Trace propagation examples In this example, Elastic's Ruby agent communicates with Elastic's Java agent. @@ -63,7 +63,7 @@ The distributed trace ends and any further communication will result in a new tr image::images/distributed-tracing/dt-trace-ex3.png[How traceparent propagation works] [discrete] -[[apm-distributed-tracing-w3c-trace-context-specification]] +[[observability-apm-distributed-tracing-w3c-trace-context-specification]] === W3C Trace Context specification All Elastic agents now support the official W3C Trace Context specification and `traceparent` header. @@ -101,7 +101,7 @@ For backward-compatibility purposes, new versions of Elastic agents still suppor ==== [discrete] -[[apm-distributed-tracing-visualize-distributed-tracing]] +[[observability-apm-distributed-tracing-visualize-distributed-tracing]] == Visualize distributed tracing APM's timeline visualization provides a visual deep-dive into each of your application's traces: @@ -110,7 +110,7 @@ APM's timeline visualization provides a visual deep-dive into each of your appli image::images/spans/apm-distributed-tracing.png[Example view of the distributed tracing in Elastic APM] [discrete] -[[apm-distributed-tracing-manual-distributed-tracing]] +[[observability-apm-distributed-tracing-manual-distributed-tracing]] == Manual distributed tracing Elastic agents automatically propagate distributed tracing context for supported technologies. @@ -119,7 +119,7 @@ you can manually propagate distributed tracing context from a sending service to with each agent's API. [discrete] -[[apm-distributed-tracing-add-the-traceparent-header-to-outgoing-requests]] +[[observability-apm-distributed-tracing-add-the-traceparent-header-to-outgoing-requests]] === Add the `traceparent` header to outgoing requests Sending services must add the `traceparent` header to outgoing requests. diff --git a/docs/en/serverless/apm/apm-filter-your-data.asciidoc b/docs/en/serverless/apm/apm-filter-your-data.asciidoc index da2df13221..ffaf059759 100644 --- a/docs/en/serverless/apm/apm-filter-your-data.asciidoc +++ b/docs/en/serverless/apm/apm-filter-your-data.asciidoc @@ -1,4 +1,4 @@ -[[apm-filter-your-data]] +[[observability-apm-filter-your-data]] = Filter your data :keywords: serverless, observability, how-to @@ -15,17 +15,17 @@ image::images/filters/global-filters.png[Global filters view] [NOTE] ==== If you prefer to use advanced queries on your data to filter on specific pieces -of information, see <<apm-query-your-data,Query your data>>. +of information, see <<observability-apm-query-your-data,Query your data>>. ==== [discrete] -[[apm-filter-your-data-global-time-range]] +[[observability-apm-filter-your-data-global-time-range]] == Global time range The global time range filter restricts APM data to a specific time period. [discrete] -[[apm-filter-your-data-service-environment-filter]] +[[observability-apm-filter-your-data-service-environment-filter]] == Service environment filter The environment selector is a global filter for `service.environment`. diff --git a/docs/en/serverless/apm/apm-find-transaction-latency-and-failure-correlations.asciidoc b/docs/en/serverless/apm/apm-find-transaction-latency-and-failure-correlations.asciidoc index 2acf24fa0b..93a72765c3 100644 --- a/docs/en/serverless/apm/apm-find-transaction-latency-and-failure-correlations.asciidoc +++ b/docs/en/serverless/apm/apm-find-transaction-latency-and-failure-correlations.asciidoc @@ -1,4 +1,4 @@ -[[apm-find-transaction-latency-and-failure-correlations]] +[[observability-apm-find-transaction-latency-and-failure-correlations]] = Find transaction latency and failure correlations :keywords: serverless, observability, how-to @@ -27,7 +27,7 @@ Active queries _are_ applied to correlations. ==== [discrete] -[[apm-find-transaction-latency-and-failure-correlations-find-high-transaction-latency-correlations]] +[[observability-apm-find-transaction-latency-and-failure-correlations-find-high-transaction-latency-correlations]] == Find high transaction latency correlations The correlations on the **Latency correlations** tab help you discover which diff --git a/docs/en/serverless/apm/apm-get-started.asciidoc b/docs/en/serverless/apm/apm-get-started.asciidoc index c4958bb02a..0111499603 100644 --- a/docs/en/serverless/apm/apm-get-started.asciidoc +++ b/docs/en/serverless/apm/apm-get-started.asciidoc @@ -1,4 +1,4 @@ -[[apm-get-started]] +[[observability-apm-get-started]] = Get started with traces and APM :description: Learn how to collect Application Performance Monitoring (APM) data and visualize it in real time. @@ -26,7 +26,7 @@ written in several languages and supports OpenTelemetry. Which agent you'll use To send APM data to Elastic, you must install an APM agent and configure it to send data to your project: -. <<create-an-observability-project,Create a new {observability} project>>, or open an existing one. +. <<observability-create-an-observability-project,Create a new {observability} project>>, or open an existing one. . To install and configure one or more APM agents, do one of following: + ** In your Observability project, go to **Add data** → **Monitor my application performance** → **Elastic APM** and follow the prompts. @@ -155,7 +155,7 @@ It's important to be consistent when naming environments across agents. you can click **Check Agent Status** to verify that the agent is sending data. To learn more about APM agents, including how to fine-tune how agents send traces to Elastic, -refer to <<apm-send-data-to-elastic>>. +refer to <<observability-apm-send-data-to-elastic>>. [discrete] [[view-apm-integration-data]] @@ -167,20 +167,20 @@ application performance monitoring data in the UI. In the _Applications_ section of the main menu, select **Services**. This will show a high-level overview of the health and general performance of all your services. -Learn more about visualizing APM data in <<apm-view-and-analyze-traces>>. +Learn more about visualizing APM data in <<observability-apm-view-and-analyze-traces>>. // TO DO: ADD SCREENSHOT [TIP] ==== -Not seeing any data? Find helpful tips in <<apm-troubleshooting,Troubleshooting>>. +Not seeing any data? Find helpful tips in <<observability-apm-troubleshooting,Troubleshooting>>. ==== [discrete] -[[apm-get-started-next-steps]] +[[observability-apm-get-started-next-steps]] == Next steps Now that data is streaming into your project, take your investigation to a -deeper level. Learn how to use <<apm-view-and-analyze-traces,Elastic's built-in visualizations for APM data>>, -<<alerting,alert on APM data>>, -or <<apm-send-data-to-elastic,fine-tune how agents send traces to Elastic>>. +deeper level. Learn how to use <<observability-apm-view-and-analyze-traces,Elastic's built-in visualizations for APM data>>, +<<observability-alerting,alert on APM data>>, +or <<observability-apm-send-data-to-elastic,fine-tune how agents send traces to Elastic>>. diff --git a/docs/en/serverless/apm/apm-integrate-with-machine-learning.asciidoc b/docs/en/serverless/apm/apm-integrate-with-machine-learning.asciidoc index ecfa459dbd..bbd6fe2aa4 100644 --- a/docs/en/serverless/apm/apm-integrate-with-machine-learning.asciidoc +++ b/docs/en/serverless/apm/apm-integrate-with-machine-learning.asciidoc @@ -1,4 +1,4 @@ -[[apm-integrate-with-machine-learning]] +[[observability-apm-integrate-with-machine-learning]] = Integrate with machine learning :keywords: serverless, observability, how-to @@ -33,7 +33,7 @@ Results from machine learning jobs are shown in multiple places throughout the A image::images/service-maps/service-map-anomaly.png[Example view of anomaly scores on service maps in the Applications UI] [discrete] -[[apm-integrate-with-machine-learning-enable-anomaly-detection]] +[[observability-apm-integrate-with-machine-learning-enable-anomaly-detection]] == Enable anomaly detection To enable machine learning anomaly detection: @@ -51,7 +51,7 @@ it might take additional time for results to appear on your service maps. To manage existing jobs, click **Manage jobs** (or go to **AIOps** → **Anomaly detection**). [discrete] -[[apm-integrate-with-machine-learning-anomaly-detection-warning]] +[[observability-apm-integrate-with-machine-learning-anomaly-detection-warning]] == Anomaly detection warning To make machine learning as easy as possible to set up, @@ -63,11 +63,11 @@ Elastic will warn you when filtered to an environment without a machine learning //// [discrete] -[[apm-integrate-with-machine-learning-unknown-service-health]] +[[observability-apm-integrate-with-machine-learning-unknown-service-health]] == Unknown service health After enabling anomaly detection, service health may display as "Unknown". Here are some reasons why this can occur: -. No machine learning job exists. See <<apm-integrate-with-machine-learning-enable-anomaly-detection,Enable anomaly detection>> to enable anomaly detection and create a machine learning job. +. No machine learning job exists. See <<observability-apm-integrate-with-machine-learning-enable-anomaly-detection,Enable anomaly detection>> to enable anomaly detection and create a machine learning job. . There is no machine learning data for the job. If you just created the machine learning job you'll need to wait a few minutes for data to be available. Alternatively, if the service or its environment are new, you'll need to wait for more trace data. . No "request" or "page-load" transaction type exists for this service; service health is only available for these transaction types. diff --git a/docs/en/serverless/apm/apm-keep-data-secure.asciidoc b/docs/en/serverless/apm/apm-keep-data-secure.asciidoc index 7774add26f..e30205fa6e 100644 --- a/docs/en/serverless/apm/apm-keep-data-secure.asciidoc +++ b/docs/en/serverless/apm/apm-keep-data-secure.asciidoc @@ -1,4 +1,4 @@ -[[apm-keep-data-secure]] +[[observability-apm-keep-data-secure]] = Keep APM data secure :description: Make sure APM data is sent to Elastic securely and sensitive data is protected. @@ -19,14 +19,14 @@ When setting up Elastic APM, it's essential to ensure that the data collected by APM agents is sent to Elastic securely and that sensitive data is protected. [discrete] -[[apm-keep-data-secure-secure-communication-with-apm-agents]] +[[observability-apm-keep-data-secure-secure-communication-with-apm-agents]] == Secure communication with APM agents Communication between APM agents and the managed intake service is both encrypted and authenticated. Requests without a valid API key will be denied. [discrete] -[[apm-keep-data-secure-create-a-new-api-key]] +[[observability-apm-keep-data-secure-create-a-new-api-key]] === Create a new API key To create a new API key: @@ -40,7 +40,7 @@ To create a new API key: . Copy the key now. You will not be able to see it again. API keys do not expire. [discrete] -[[apm-keep-data-secure-delete-an-api-key]] +[[observability-apm-keep-data-secure-delete-an-api-key]] === Delete an API key To delete an API key: @@ -51,7 +51,7 @@ To delete an API key: . Click the trash can icon to delete the selected API key. [discrete] -[[apm-keep-data-secure-view-existing-api-keys]] +[[observability-apm-keep-data-secure-view-existing-api-keys]] === View existing API keys To view all API keys for your project: @@ -61,7 +61,7 @@ To view all API keys for your project: . Select **API keys**. [discrete] -[[apm-keep-data-secure-data-security]] +[[observability-apm-keep-data-secure-data-security]] == Data security When setting up Elastic APM, it's essential to review all captured data carefully to ensure it doesn't contain sensitive information like passwords, credit card numbers, or health data. @@ -70,32 +70,32 @@ Some APM agents offer a way to manipulate or drop APM events _before_ they leave Refer to the relevant agent's documentation for more information and examples: [discrete] -[[apm-keep-data-secure-java]] +[[observability-apm-keep-data-secure-java]] === Java **`include_process_args`**: Remove process arguments from transactions. This option is disabled by default. Read more in the {apm-java-ref-v}/config-reporter.html#config-include-process-args[Java agent configuration docs]. [discrete] -[[apm-keep-data-secure-net]] +[[observability-apm-keep-data-secure-net]] === .NET **Filter API**: Drop APM events _before_ they are sent to Elastic. Read more in the {apm-dotnet-ref-v}/public-api.html#filter-api[.NET agent Filter API docs]. [discrete] -[[apm-keep-data-secure-nodejs]] +[[observability-apm-keep-data-secure-nodejs]] === Node.js * **`addFilter()`**: Drop APM events _before_ they are sent to Elastic. Read more in the {apm-node-ref-v}/agent-api.html#apm-add-filter[Node.js agent API docs]. * **`captureExceptions`**: Remove errors raised by the server-side process by disabling the `captureExceptions` configuration option. Read more in {apm-node-ref-v}/configuration.html#capture-exceptions[the Node.js agent configuration docs]. [discrete] -[[apm-keep-data-secure-python]] +[[observability-apm-keep-data-secure-python]] === Python **Custom processors**: Drop APM events _before_ they are sent to Elastic. Read more in the {apm-py-ref-v}/sanitizing-data.html[Python agent Custom processors docs]. [discrete] -[[apm-keep-data-secure-ruby]] +[[observability-apm-keep-data-secure-ruby]] === Ruby **`add_filter()`**: Drop APM events _before_ they are sent to Elastic. Read more in the {apm-ruby-ref-v}/api.html#api-agent-add-filter[Ruby agent API docs]. diff --git a/docs/en/serverless/apm/apm-kibana-settings.asciidoc b/docs/en/serverless/apm/apm-kibana-settings.asciidoc index 306748d87c..62904413fb 100644 --- a/docs/en/serverless/apm/apm-kibana-settings.asciidoc +++ b/docs/en/serverless/apm/apm-kibana-settings.asciidoc @@ -1,4 +1,4 @@ -[[apm-kibana-settings]] +[[observability-apm-kibana-settings]] = Settings :keywords: serverless, observability, reference @@ -15,7 +15,7 @@ include::../partials/roles.asciidoc[] You can adjust Application settings to fine-tune your experience in the Applications UI. [discrete] -[[apm-kibana-settings-general-settings]] +[[observability-apm-kibana-settings-general-settings]] == General settings To change APM settings, select **Settings** from any **Applications** page. @@ -94,7 +94,7 @@ preview:[] Enable the APM Trace Explorer feature, that allows you to search and //// [discrete] -[[apm-kibana-settings-apm-labs]] +[[observability-apm-kibana-settings-apm-labs]] == APM Labs **APM Labs** allows you to easily try out new features that are technical preview. diff --git a/docs/en/serverless/apm/apm-observe-lambda-functions.asciidoc b/docs/en/serverless/apm/apm-observe-lambda-functions.asciidoc index 4127ca151a..8cd2b96ebe 100644 --- a/docs/en/serverless/apm/apm-observe-lambda-functions.asciidoc +++ b/docs/en/serverless/apm/apm-observe-lambda-functions.asciidoc @@ -1,4 +1,4 @@ -[[apm-observe-lambda-functions]] +[[observability-apm-observe-lambda-functions]] = Observe Lambda functions :keywords: serverless, observability, how-to @@ -9,13 +9,13 @@ Elastic APM provides performance and error monitoring for AWS Lambda functions. See how your Lambda functions relate to and depend on other services, and get insight into function execution and runtime behavior, like lambda duration, cold start rate, cold start duration, compute usage, memory usage, and more. -To set up Lambda monitoring, refer to <<apm-agents-aws-lambda-functions>>. +To set up Lambda monitoring, refer to <<observability-apm-agents-aws-lambda-functions>>. [role="screenshot"] image::images/apm-lambda/lambda-overview.png[lambda overview] [discrete] -[[apm-observe-lambda-functions-cold-starts]] +[[observability-apm-observe-lambda-functions-cold-starts]] == Cold starts A cold start occurs when a Lambda function has not been used for a certain period of time. A lambda worker receives a request to run the function and prepares an execution environment. @@ -23,7 +23,7 @@ A cold start occurs when a Lambda function has not been used for a certain perio Cold starts are an unavoidable byproduct of the serverless world, but visibility into how they impact your services can help you make better decisions about factors like how much memory to allocate to a function, whether to enable provisioned concurrency, or if it's time to consider removing a large dependency. [discrete] -[[apm-observe-lambda-functions-cold-start-rate]] +[[observability-apm-observe-lambda-functions-cold-start-rate]] === Cold start rate The cold start rate (i.e. proportion of requests that experience a cold start) is displayed per service and per transaction. @@ -36,10 +36,10 @@ Cold start is also displayed in the trace waterfall, where you can drill-down in //// [discrete] -[[apm-observe-lambda-functions-latency-distribution-correlation]] +[[observability-apm-observe-lambda-functions-latency-distribution-correlation]] === Latency distribution correlation -The <<apm-find-transaction-latency-and-failure-correlations-find-high-transaction-latency-correlations,latency correlations>> feature can be used to visualize the impact of Lambda cold starts on latency—just select the `faas.coldstart` field. +The <<observability-apm-find-transaction-latency-and-failure-correlations-find-high-transaction-latency-correlations,latency correlations>> feature can be used to visualize the impact of Lambda cold starts on latency—just select the `faas.coldstart` field. //// /* TODO: RETAKE @@ -47,7 +47,7 @@ The <<apm-find-transaction-latency-and-failure-correlations-find-high-transactio //// [discrete] -[[apm-observe-lambda-functions-aws-lambda-function-grouping]] +[[observability-apm-observe-lambda-functions-aws-lambda-function-grouping]] == AWS Lambda function grouping The default APM agent configuration results in one APM service per AWS Lambda function, diff --git a/docs/en/serverless/apm/apm-query-your-data.asciidoc b/docs/en/serverless/apm/apm-query-your-data.asciidoc index 5d9a46d729..8753e26402 100644 --- a/docs/en/serverless/apm/apm-query-your-data.asciidoc +++ b/docs/en/serverless/apm/apm-query-your-data.asciidoc @@ -1,4 +1,4 @@ -[[apm-query-your-data]] +[[observability-apm-query-your-data]] = Query your data :keywords: serverless, observability, how-to @@ -25,11 +25,11 @@ To learn more about the {kib} query language capabilities, see the {kibana-ref}/ ==== [discrete] -[[apm-query-your-data-apm-queries]] +[[observability-apm-query-your-data-apm-queries]] == APM queries -APM queries can be handy for removing noise from your data in the <<apm-services,Services>>, <<apm-transactions,Transactions>>, -<<apm-errors,Errors>>, <<apm-metrics,Metrics>>, and <<apm-traces,Traces>> views. +APM queries can be handy for removing noise from your data in the <<observability-apm-services,Services>>, <<observability-apm-transactions,Transactions>>, +<<observability-apm-errors,Errors>>, <<observability-apm-metrics,Metrics>>, and <<observability-apm-traces,Traces>> views. For example, in the **Services** view, you can quickly view a list of all the instrumented services running on your production environment: `service.environment : production`. Or filter the list by including the APM agent's name and the host it’s running on: @@ -43,7 +43,7 @@ Or filter the list by including the service version and the Kubernetes pod it's `transaction.duration.us > 2000000 and service.version : "7.12.0" and kubernetes.pod.name : "pod-5468b47f57-pqk2m"`. [discrete] -[[apm-query-your-data-querying-in-discover]] +[[observability-apm-query-your-data-querying-in-discover]] == Querying in Discover Alternatively, you can query your APM documents in {kibana-ref}/discover.html[_Discover_]. @@ -51,7 +51,7 @@ Querying documents in **Discover** works the same way as queries in the Applicat and **Discover** supports all of the example APM queries shown on this page. [discrete] -[[apm-query-your-data-discover-queries]] +[[observability-apm-query-your-data-discover-queries]] === Discover queries One example where you may want to make use of **Discover** diff --git a/docs/en/serverless/apm/apm-reduce-your-data-usage.asciidoc b/docs/en/serverless/apm/apm-reduce-your-data-usage.asciidoc index c97b5952cb..69b392abc7 100644 --- a/docs/en/serverless/apm/apm-reduce-your-data-usage.asciidoc +++ b/docs/en/serverless/apm/apm-reduce-your-data-usage.asciidoc @@ -1,4 +1,4 @@ -[[apm-reduce-your-data-usage]] +[[observability-apm-reduce-your-data-usage]] = Reduce your data usage :description: Implement strategies for reducing your data usage without compromising the ability to analyze APM data. @@ -11,9 +11,9 @@ also mean higher costs and more noise when analyzing data. There are a couple st use to reduce your data usage while continuing to get the full value of APM data. Read more about these strategies: -* <<apm-transaction-sampling>>: Reduce data storage, costs, and +* <<observability-apm-transaction-sampling>>: Reduce data storage, costs, and noise by ingesting only a percentage of all traces that you can extrapolate from in your analysis. -* <<apm-compress-spans>>: Compress similar or identical spans to +* <<observability-apm-compress-spans>>: Compress similar or identical spans to reduce storage overhead, processing power needed, and clutter in the Applications UI. -* <<apm-stacktrace-collection>>: Reduce the stacktrace information +* <<observability-apm-stacktrace-collection>>: Reduce the stacktrace information collected by your APM agents. diff --git a/docs/en/serverless/apm/apm-reference.asciidoc b/docs/en/serverless/apm/apm-reference.asciidoc index d0f5adf69a..7c4a8e6c5c 100644 --- a/docs/en/serverless/apm/apm-reference.asciidoc +++ b/docs/en/serverless/apm/apm-reference.asciidoc @@ -1,4 +1,4 @@ -[[apm-reference]] +[[observability-apm-reference]] = Reference :keywords: serverless, observability, reference @@ -7,9 +7,9 @@ preview:[] The following reference documentation is available: -* <<apm-kibana-settings,Settings reference>> +* <<observability-apm-kibana-settings,Settings reference>> * https://docs.elastic.co/api-reference/observability/post_api-apm-agent-keys[API reference] In addition to the public API above, the APM managed intake service offers an -<<apm-server-api,event intake API>>. +<<observability-apm-server-api,event intake API>>. This API is exclusively for APM agent developers. The vast majority of users should have no reason to interact with this API. diff --git a/docs/en/serverless/apm/apm-send-traces-to-elastic.asciidoc b/docs/en/serverless/apm/apm-send-traces-to-elastic.asciidoc index db96efbd28..67fb997504 100644 --- a/docs/en/serverless/apm/apm-send-traces-to-elastic.asciidoc +++ b/docs/en/serverless/apm/apm-send-traces-to-elastic.asciidoc @@ -1,4 +1,4 @@ -[[apm-send-data-to-elastic]] +[[observability-apm-send-data-to-elastic]] = Send APM data to Elastic :keywords: serverless, observability, overview @@ -14,14 +14,14 @@ include::../partials/roles.asciidoc[] [NOTE] ==== -image:images/icons/documentation.svg[documentation icon] Want to get started quickly? See <<apm-get-started,Get started with traces and APM>>. +image:images/icons/documentation.svg[documentation icon] Want to get started quickly? See <<observability-apm-get-started,Get started with traces and APM>>. ==== Send APM data to Elastic with: -* **<<apm-agents-elastic-apm-agents,Elastic APM agents>>:** Elastic APM agents are lightweight libraries you install in your applications and services. They automatically instrument supported technologies, and offer APIs for custom code instrumentation. -* **<<apm-agents-opentelemetry,OpenTelemetry>>:** OpenTelemetry is a set of APIs, SDKs, tooling, and integrations that enable the capture and management of telemetry data from your services and applications. +* **<<observability-apm-agents-elastic-apm-agents,Elastic APM agents>>:** Elastic APM agents are lightweight libraries you install in your applications and services. They automatically instrument supported technologies, and offer APIs for custom code instrumentation. +* **<<observability-apm-agents-opentelemetry,OpenTelemetry>>:** OpenTelemetry is a set of APIs, SDKs, tooling, and integrations that enable the capture and management of telemetry data from your services and applications. -Elastic also supports instrumentation of <<apm-agents-aws-lambda-functions,AWS Lambda functions>>. +Elastic also supports instrumentation of <<observability-apm-agents-aws-lambda-functions,AWS Lambda functions>>. // To do: We should put a diagram here showing how high-level arch diff --git a/docs/en/serverless/apm/apm-server-api.asciidoc b/docs/en/serverless/apm/apm-server-api.asciidoc index 8af2fa3e0e..dd6dde960e 100644 --- a/docs/en/serverless/apm/apm-server-api.asciidoc +++ b/docs/en/serverless/apm/apm-server-api.asciidoc @@ -1,4 +1,4 @@ -[[apm-server-api]] +[[observability-apm-server-api]] = Managed intake service event API :keywords: serverless, observability, reference @@ -13,49 +13,49 @@ This API is exclusively for APM agent developers. The vast majority of users sho include::./apm-server-api/api.asciidoc[] [discrete] -[[apm-server-api-server-information-api]] +[[observability-apm-server-api-server-information-api]] == Server information API include::./apm-server-api/api-info.asciidoc[] [discrete] -[[apm-server-api-events-intake-api]] +[[observability-apm-server-api-events-intake-api]] == Events intake API include::./apm-server-api/api-events.asciidoc[] [discrete] -[[apm-server-api-metadata]] +[[observability-apm-server-api-metadata]] === Metadata include::./apm-server-api/api-metadata.asciidoc[] [discrete] -[[apm-server-api-transactions]] +[[observability-apm-server-api-transactions]] === Transactions include::./apm-server-api/api-transaction.asciidoc[] [discrete] -[[apm-server-api-spans]] +[[observability-apm-server-api-spans]] === Spans include::./apm-server-api/api-span.asciidoc[] [discrete] -[[apm-server-api-errors]] +[[observability-apm-server-api-errors]] === Errors include::./apm-server-api/api-error.asciidoc[] [discrete] -[[apm-server-api-metrics]] +[[observability-apm-server-api-metrics]] === Metrics include::./apm-server-api/api-metricset.asciidoc[] [discrete] -[[apm-server-api-opentelemetry-api]] +[[observability-apm-server-api-opentelemetry-api]] == OpenTelemetry API include::./apm-server-api/otel-api.asciidoc[] diff --git a/docs/en/serverless/apm/apm-server-api/api-events.asciidoc b/docs/en/serverless/apm/apm-server-api/api-events.asciidoc index b83dc0faac..7ef402010d 100644 --- a/docs/en/serverless/apm/apm-server-api/api-events.asciidoc +++ b/docs/en/serverless/apm/apm-server-api/api-events.asciidoc @@ -22,7 +22,7 @@ as soon as they are recorded in the agent. This makes it simple for agents to serialize each event to a stream of newline delimited JSON. The managed intake service also treats the HTTP body as a compressed stream and thus reads and handles each event independently. -Refer to <<apm-data-types>> to learn more about the different types of events. +Refer to <<observability-apm-data-types>> to learn more about the different types of events. [discrete] [[api-events-endpoint]] diff --git a/docs/en/serverless/apm/apm-server-api/api.asciidoc b/docs/en/serverless/apm/apm-server-api/api.asciidoc index 56e9c4444c..3255a078b1 100644 --- a/docs/en/serverless/apm/apm-server-api/api.asciidoc +++ b/docs/en/serverless/apm/apm-server-api/api.asciidoc @@ -2,6 +2,6 @@ The managed intake service exposes endpoints for: -* <<apm-server-api-server-information-api,The managed intake service information API>> -* <<apm-server-api-events-intake-api,Elastic APM events intake API>> -* <<apm-server-api-opentelemetry-api,OpenTelemetry intake API>> +* <<observability-apm-server-api-server-information-api,The managed intake service information API>> +* <<observability-apm-server-api-events-intake-api,Elastic APM events intake API>> +* <<observability-apm-server-api-opentelemetry-api,OpenTelemetry intake API>> diff --git a/docs/en/serverless/apm/apm-server-api/otel-api.asciidoc b/docs/en/serverless/apm/apm-server-api/otel-api.asciidoc index b1ace95cfe..4b9e465d5a 100644 --- a/docs/en/serverless/apm/apm-server-api/otel-api.asciidoc +++ b/docs/en/serverless/apm/apm-server-api/otel-api.asciidoc @@ -43,5 +43,5 @@ The managed intake service supports two OTLP communication protocols on the same [TIP] ==== -See our <<apm-agents-opentelemetry-opentelemetry-native-support,OpenTelemetry docs>> to learn how to send data to the managed intake service from an OpenTelemetry agent OpenTelemetry collector. +See our <<observability-apm-agents-opentelemetry-opentelemetry-native-support,OpenTelemetry docs>> to learn how to send data to the managed intake service from an OpenTelemetry agent OpenTelemetry collector. ==== diff --git a/docs/en/serverless/apm/apm-stacktrace-collection.asciidoc b/docs/en/serverless/apm/apm-stacktrace-collection.asciidoc index 9c8819bffa..0d47c775c5 100644 --- a/docs/en/serverless/apm/apm-stacktrace-collection.asciidoc +++ b/docs/en/serverless/apm/apm-stacktrace-collection.asciidoc @@ -1,4 +1,4 @@ -[[apm-stacktrace-collection]] +[[observability-apm-stacktrace-collection]] = Stacktrace collection :description: Reduce data storage and costs by reducing stacktrace collection diff --git a/docs/en/serverless/apm/apm-track-deployments-with-annotations.asciidoc b/docs/en/serverless/apm/apm-track-deployments-with-annotations.asciidoc index 0d08207211..723aeb8931 100644 --- a/docs/en/serverless/apm/apm-track-deployments-with-annotations.asciidoc +++ b/docs/en/serverless/apm/apm-track-deployments-with-annotations.asciidoc @@ -1,4 +1,4 @@ -[[apm-track-deployments-with-annotations]] +[[observability-apm-track-deployments-with-annotations]] = Track deployments with annotations :keywords: serverless, observability, how-to diff --git a/docs/en/serverless/apm/apm-transaction-sampling.asciidoc b/docs/en/serverless/apm/apm-transaction-sampling.asciidoc index 5b7a09abf6..645a6d1d91 100644 --- a/docs/en/serverless/apm/apm-transaction-sampling.asciidoc +++ b/docs/en/serverless/apm/apm-transaction-sampling.asciidoc @@ -1,4 +1,4 @@ -[[apm-transaction-sampling]] +[[observability-apm-transaction-sampling]] = Transaction sampling :description: Reduce data storage, costs, and noise by ingesting only a percentage of all traces that you can extrapolate from in your analysis. @@ -6,14 +6,14 @@ preview:[] -<<apm-distributed-tracing,Distributed tracing>> can +<<observability-apm-distributed-tracing,Distributed tracing>> can generate a substantial amount of data. More data can mean higher costs and more noise. Sampling aims to lower the amount of data ingested and the effort required to analyze that data — all while still making it easy to find anomalous patterns in your applications, detect outages, track errors, and lower mean time to recovery (MTTR). [discrete] -[[apm-transaction-sampling-head-based-sampling]] +[[observability-apm-transaction-sampling-head-based-sampling]] == Head-based sampling In head-based sampling, the sampling decision for each trace is made when the trace is initiated. @@ -28,7 +28,7 @@ Its downside is that it's entirely random — interesting data might be discarded purely due to chance. [discrete] -[[apm-transaction-sampling-distributed-tracing]] +[[observability-apm-transaction-sampling-distributed-tracing]] === Distributed tracing In a _distributed_ trace, the sampling decision is still made when the trace is initiated. @@ -54,14 +54,14 @@ be `1` (`100%`). image::images/apm-dt-sampling-example-2.png[Distributed tracing and head based sampling example two] [discrete] -[[apm-transaction-sampling-trace-continuation-strategies-with-distributed-tracing]] +[[observability-apm-transaction-sampling-trace-continuation-strategies-with-distributed-tracing]] === Trace continuation strategies with distributed tracing In addition to setting the sample rate, you can also specify which _trace continuation strategy_ to use. There are three trace continuation strategies: `continue`, `restart`, and `restart_external`. The **`continue`** trace continuation strategy is the default and will behave similar to the examples in -the <<apm-transaction-sampling-distributed-tracing,Distributed tracing section>>. +the <<observability-apm-transaction-sampling-distributed-tracing,Distributed tracing section>>. Use the **`restart_external`** trace continuation strategy on an Elastic-monitored service to start a new trace if the previous service did not have a `traceparent` header with `es` vendor data. @@ -98,7 +98,7 @@ traces will be sampled as new traces in `Service C`. The end result will be five image::images/apm-dt-sampling-continuation-strategy-restart.png[Distributed tracing and head based sampling with restart continuation strategy] [discrete] -[[apm-transaction-sampling-opentelemetry]] +[[observability-apm-transaction-sampling-opentelemetry]] === OpenTelemetry Head-based sampling is implemented directly in the APM agents and SDKs. @@ -117,20 +117,20 @@ OpenTelemetry does not offer consistent probability samplers in all languages. R ==== [discrete] -[[apm-transaction-sampling-sampled-data-and-visualizations]] +[[observability-apm-transaction-sampling-sampled-data-and-visualizations]] == Sampled data and visualizations A sampled trace retains all data associated with it. -A non-sampled trace drops all <<apm-data-types,span>> and <<apm-data-types,transaction>> data. -Regardless of the sampling decision, all traces retain <<apm-data-types,error>> data. +A non-sampled trace drops all <<observability-apm-data-types,span>> and <<observability-apm-data-types,transaction>> data. +Regardless of the sampling decision, all traces retain <<observability-apm-data-types,error>> data. -Some visualizations in the Applications UI, like latency, are powered by aggregated transaction and span <<apm-data-types,metrics>>. +Some visualizations in the Applications UI, like latency, are powered by aggregated transaction and span <<observability-apm-data-types,metrics>>. Metrics are based on sampled traces and weighted by the inverse sampling rate. For example, if you sample at 5%, each trace is counted as 20. As a result, as the variance of latency increases, or the sampling rate decreases, your level of error will increase. [discrete] -[[apm-transaction-sampling-sample-rates]] +[[observability-apm-transaction-sampling-sample-rates]] == Sample rates What's the best sampling rate? Unfortunately, there isn't one. @@ -147,7 +147,7 @@ Here are some examples: Regardless of the above, cost conscious customers are likely to be fine with a lower sample rate. [discrete] -[[apm-transaction-sampling-configure-head-based-sampling]] +[[observability-apm-transaction-sampling-configure-head-based-sampling]] == Configure head-based sampling include::./apm-transaction-sampling/configure-head-based-sampling.asciidoc[] diff --git a/docs/en/serverless/apm/apm-troubleshooting.asciidoc b/docs/en/serverless/apm/apm-troubleshooting.asciidoc index e5f1fe5ee8..1ea1ec3598 100644 --- a/docs/en/serverless/apm/apm-troubleshooting.asciidoc +++ b/docs/en/serverless/apm/apm-troubleshooting.asciidoc @@ -1,4 +1,4 @@ -[[apm-troubleshooting]] +[[observability-apm-troubleshooting]] = Troubleshooting :keywords: serverless, observability, reference @@ -9,19 +9,19 @@ This section provides solutions to common questions and problems, and processing and performance guidance. [discrete] -[[apm-troubleshooting-common-problems]] +[[observability-apm-troubleshooting-common-problems]] == Common problems include::./apm-troubleshooting/common-problems.asciidoc[] [discrete] -[[apm-troubleshooting-common-response-codes]] +[[observability-apm-troubleshooting-common-response-codes]] == Common response codes include::./apm-troubleshooting/common-response-codes.asciidoc[] [discrete] -[[apm-troubleshooting-related-troubleshooting-resources]] +[[observability-apm-troubleshooting-related-troubleshooting-resources]] == Related troubleshooting resources For additional help with other APM components, see the links below. @@ -37,7 +37,7 @@ For additional help with other APM components, see the links below. * {apm-ruby-ref}/debugging.html[Ruby agent troubleshooting] [discrete] -[[apm-troubleshooting-elastic-support]] +[[observability-apm-troubleshooting-elastic-support]] == Elastic Support We offer a support experience unlike any other. diff --git a/docs/en/serverless/apm/apm-troubleshooting/common-response-codes.asciidoc b/docs/en/serverless/apm/apm-troubleshooting/common-response-codes.asciidoc index 37c951c0d2..f9942758dc 100644 --- a/docs/en/serverless/apm/apm-troubleshooting/common-response-codes.asciidoc +++ b/docs/en/serverless/apm/apm-troubleshooting/common-response-codes.asciidoc @@ -5,13 +5,13 @@ === HTTP 400: Data decoding error / Data validation error The most likely cause for this error is using an incompatible version of an {apm-agent}. -See <<apm-agents-elastic-apm-agents-minimum-supported-versions,minimum supported APM agent versions>> to verify compatibility. +See <<observability-apm-agents-elastic-apm-agents-minimum-supported-versions,minimum supported APM agent versions>> to verify compatibility. [discrete] [[event-too-large]] === HTTP 400: Event too large -APM agents communicate with the Managed intake service by sending events in an HTTP request. Each event is sent as its own line in the HTTP request body. If events are too large, you can reduce the size of the events that your APM agents send by: <<apm-compress-spans,enabling span compression>> or <<apm-stacktrace-collection,reducing collected stack trace information>>. +APM agents communicate with the Managed intake service by sending events in an HTTP request. Each event is sent as its own line in the HTTP request body. If events are too large, you can reduce the size of the events that your APM agents send by: <<observability-apm-compress-spans,enabling span compression>> or <<observability-apm-stacktrace-collection,reducing collected stack trace information>>. [discrete] [[unauthorized]] diff --git a/docs/en/serverless/apm/apm-ui-dependencies.asciidoc b/docs/en/serverless/apm/apm-ui-dependencies.asciidoc index 04fe4a2a56..b5756399a2 100644 --- a/docs/en/serverless/apm/apm-ui-dependencies.asciidoc +++ b/docs/en/serverless/apm/apm-ui-dependencies.asciidoc @@ -1,4 +1,4 @@ -[[apm-dependencies]] +[[observability-apm-dependencies]] = Dependencies :keywords: serverless, observability, reference @@ -7,7 +7,7 @@ preview:[] APM agents collect details about external calls made from instrumented services. Sometimes, these external calls resolve into a downstream service that's instrumented — in these cases, -you can utilize <<apm-trace-sample-timeline-distributed-tracing,distributed tracing>> to drill down into problematic downstream services. +you can utilize <<observability-apm-trace-sample-timeline-distributed-tracing,distributed tracing>> to drill down into problematic downstream services. Other times, though, it's not possible to instrument a downstream dependency — like with a database or third-party service. **Dependencies** gives you a window into these uninstrumented, downstream dependencies. @@ -35,7 +35,7 @@ You might then start digging into traces coming from impacted services to determine why that pattern change has occurred. [discrete] -[[apm-dependencies-operations]] +[[observability-apm-dependencies-operations]] == Operations :feature: Dependency operations @@ -47,7 +47,7 @@ include::../partials/feature-beta.asciidoc[] [role="screenshot"] image::images/dependencies/operations.png[operations view in the Applications UI] -Selecting an operation displays the operation's impact and performance trends over time, via key metrics like latency, throughput, and failed transaction rate. In addition, the <<apm-trace-sample-timeline,**Trace sample timeline**>> provides a visual drill-down into an end-to-end trace sample. +Selecting an operation displays the operation's impact and performance trends over time, via key metrics like latency, throughput, and failed transaction rate. In addition, the <<observability-apm-trace-sample-timeline,**Trace sample timeline**>> provides a visual drill-down into an end-to-end trace sample. [role="screenshot"] image::images/dependencies/operations-detail.png[operations detail view in the Applications UI] diff --git a/docs/en/serverless/apm/apm-ui-errors.asciidoc b/docs/en/serverless/apm/apm-ui-errors.asciidoc index eb79d56285..cb5a6a050e 100644 --- a/docs/en/serverless/apm/apm-ui-errors.asciidoc +++ b/docs/en/serverless/apm/apm-ui-errors.asciidoc @@ -1,4 +1,4 @@ -[[apm-errors]] +[[observability-apm-errors]] = Errors :keywords: serverless, observability, reference diff --git a/docs/en/serverless/apm/apm-ui-infrastructure.asciidoc b/docs/en/serverless/apm/apm-ui-infrastructure.asciidoc index d4cb2773e5..9f1fc4d335 100644 --- a/docs/en/serverless/apm/apm-ui-infrastructure.asciidoc +++ b/docs/en/serverless/apm/apm-ui-infrastructure.asciidoc @@ -1,4 +1,4 @@ -[[apm-infrastructure]] +[[observability-apm-infrastructure]] = Infrastructure :keywords: serverless, observability, reference diff --git a/docs/en/serverless/apm/apm-ui-logs.asciidoc b/docs/en/serverless/apm/apm-ui-logs.asciidoc index 03a4c45726..d6d6b956d1 100644 --- a/docs/en/serverless/apm/apm-ui-logs.asciidoc +++ b/docs/en/serverless/apm/apm-ui-logs.asciidoc @@ -1,4 +1,4 @@ -[[apm-logs]] +[[observability-apm-logs]] = Logs :keywords: serverless, observability, reference diff --git a/docs/en/serverless/apm/apm-ui-metrics.asciidoc b/docs/en/serverless/apm/apm-ui-metrics.asciidoc index 954a1942a2..39f08bc717 100644 --- a/docs/en/serverless/apm/apm-ui-metrics.asciidoc +++ b/docs/en/serverless/apm/apm-ui-metrics.asciidoc @@ -1,4 +1,4 @@ -[[apm-metrics]] +[[observability-apm-metrics]] = Metrics :keywords: serverless, observability, reference diff --git a/docs/en/serverless/apm/apm-ui-overview.asciidoc b/docs/en/serverless/apm/apm-ui-overview.asciidoc index 13c39b0a95..6ef9fa8b33 100644 --- a/docs/en/serverless/apm/apm-ui-overview.asciidoc +++ b/docs/en/serverless/apm/apm-ui-overview.asciidoc @@ -1,4 +1,4 @@ -[[apm-ui-overview]] +[[observability-apm-ui-overview]] = Navigate the Applications UI :description: Learn how to navigate the Applications UI. @@ -9,17 +9,17 @@ preview:[] For a quick, high-level overview of the health and performance of your application, start with: -* <<apm-services,Services>> -* <<apm-traces,Traces>> -* <<apm-dependencies,Dependencies>> -* <<apm-service-map,Service Map>> +* <<observability-apm-services,Services>> +* <<observability-apm-traces,Traces>> +* <<observability-apm-dependencies,Dependencies>> +* <<observability-apm-service-map,Service Map>> Notice something awry? Select a service or trace and dive deeper with: -* <<apm-service-overview,Service overview>> -* <<apm-transactions,Transactions>> -* <<apm-trace-sample-timeline,Trace sample timeline>> -* <<apm-errors,Errors>> -* <<apm-metrics,Metrics>> -* <<apm-infrastructure,Infrastructure>> -* <<apm-logs,Logs>> +* <<observability-apm-service-overview,Service overview>> +* <<observability-apm-transactions,Transactions>> +* <<observability-apm-trace-sample-timeline,Trace sample timeline>> +* <<observability-apm-errors,Errors>> +* <<observability-apm-metrics,Metrics>> +* <<observability-apm-infrastructure,Infrastructure>> +* <<observability-apm-logs,Logs>> diff --git a/docs/en/serverless/apm/apm-ui-service-map.asciidoc b/docs/en/serverless/apm/apm-ui-service-map.asciidoc index b7ddde5a4d..55f6e4b98a 100644 --- a/docs/en/serverless/apm/apm-ui-service-map.asciidoc +++ b/docs/en/serverless/apm/apm-ui-service-map.asciidoc @@ -1,4 +1,4 @@ -[[apm-service-map]] +[[observability-apm-service-map]] = Service map :keywords: serverless, observability, reference @@ -17,7 +17,7 @@ We currently surface two types of service maps: * **Service-specific**: Highlight connections for a selected service. [discrete] -[[apm-service-map-how-do-service-maps-work]] +[[observability-apm-service-map-how-do-service-maps-work]] == How do service maps work? Service Maps rely on distributed traces to draw connections between services. @@ -27,7 +27,7 @@ or a `traceparent` header isn't being propagated to it, distributed tracing will not work, and the connection will not be drawn on the map. [discrete] -[[apm-service-map-visualize-your-architecture]] +[[observability-apm-service-map-visualize-your-architecture]] == Visualize your architecture From **Services**, switch to the **Service Map** tab to get started. @@ -36,7 +36,7 @@ Whether you're onboarding a new engineer, or just trying to grasp the big pictur drag things around, zoom in and out, and begin to visualize how your services are connected. Customize what the service map displays using either the query bar or the environment selector. -The query bar enables you to use <<apm-query-your-data,advanced queries>> to customize the service map based on your needs. +The query bar enables you to use <<observability-apm-query-your-data,advanced queries>> to customize the service map based on your needs. The environment selector allows you to narrow displayed results to a specific environment. This can be useful if you have two or more services, in separate environments, but with the same name. Use the environment drop-down to only see the data you're interested in, like `dev` or `production`. @@ -50,7 +50,7 @@ You can also use the tabs at the top of the page to easily jump to the **Errors* image::images/service-maps/service-maps-java.png[Example view of service maps in the Applications UI] [discrete] -[[apm-service-map-anomaly-detection-with-machine-learning]] +[[observability-apm-service-map-anomaly-detection-with-machine-learning]] == Anomaly detection with machine learning You can create machine learning jobs to calculate anomaly scores on APM transaction durations within the selected service. @@ -75,10 +75,10 @@ image::images/service-maps/service-map-anomaly.png[Example view of anomaly score If an anomaly has been detected, click **View anomalies** to view the anomaly detection metric viewer. This time series analysis will display additional details on the severity and time of the detected anomalies. -To learn how to create a machine learning job, refer to <<apm-integrate-with-machine-learning>>. +To learn how to create a machine learning job, refer to <<observability-apm-integrate-with-machine-learning>>. [discrete] -[[apm-service-map-legend]] +[[observability-apm-service-map-legend]] == Legend Nodes appear on the map in one of two shapes: @@ -89,7 +89,7 @@ with specific icons for known entities, like Elasticsearch. Type and subtype are based on `span.type`, and `span.subtype`. [discrete] -[[apm-service-map-supported-apm-agents]] +[[observability-apm-service-map-supported-apm-agents]] == Supported APM agents Service Maps are supported for the following APM agent versions: diff --git a/docs/en/serverless/apm/apm-ui-service-overview.asciidoc b/docs/en/serverless/apm/apm-ui-service-overview.asciidoc index 165a2696eb..99938d08c8 100644 --- a/docs/en/serverless/apm/apm-ui-service-overview.asciidoc +++ b/docs/en/serverless/apm/apm-ui-service-overview.asciidoc @@ -1,11 +1,11 @@ -[[apm-service-overview]] +[[observability-apm-service-overview]] = Service Overview :keywords: serverless, observability, reference preview:[] -Selecting a <<apm-services,**service**>> brings you to the **Service overview**. +Selecting a <<observability-apm-services,**service**>> brings you to the **Service overview**. The **Service overview** contains a wide variety of charts and tables that provide high-level visibility into how a service is performing across your infrastructure: @@ -17,7 +17,7 @@ high-level visibility into how a service is performing across your infrastructur * Service dependencies [discrete] -[[apm-service-overview-time-series-and-expected-bounds-comparison]] +[[observability-apm-service-overview-time-series-and-expected-bounds-comparison]] == Time series and expected bounds comparison For insight into the health of your services, you can compare how a service @@ -45,10 +45,10 @@ The time-based comparison options are based on the selected time filter range: | An identical amount of time immediately before the selected time range |=== -The expected bounds comparison is powered by <<apm-integrate-with-machine-learning,machine learning>> and requires anomaly detection to be enabled. +The expected bounds comparison is powered by <<observability-apm-integrate-with-machine-learning,machine learning>> and requires anomaly detection to be enabled. [discrete] -[[apm-service-overview-latency]] +[[observability-apm-service-overview-latency]] == Latency Response times for the service. You can filter the **Latency** chart to display the average, @@ -58,13 +58,13 @@ Response times for the service. You can filter the **Latency** chart to display image::images/services/latency.png[Service latency] [discrete] -[[apm-service-overview-throughput-and-transactions]] +[[observability-apm-service-overview-throughput-and-transactions]] == Throughput and transactions include::../transclusion/kibana/apm/service-overview/throughput-transactions.asciidoc[] [discrete] -[[apm-service-overview-failed-transaction-rate-and-errors]] +[[observability-apm-service-overview-failed-transaction-rate-and-errors]] == Failed transaction rate and errors include::../transclusion/kibana/apm/service-overview/ftr.asciidoc[] @@ -77,7 +77,7 @@ your services and take actions to rectify them. To do so, click **View errors**. image::images/services/error-rate.png[failed transaction rate and errors] [discrete] -[[apm-service-overview-span-types-average-duration-and-dependencies]] +[[observability-apm-service-overview-span-types-average-duration-and-dependencies]] == Span types average duration and dependencies The **Time spent by span type** chart visualizes each span type's average duration and helps you determine @@ -89,7 +89,7 @@ application code and not in database or external requests. include::../transclusion/kibana/apm/service-overview/dependencies.asciidoc[] [discrete] -[[apm-service-overview-cold-start-rate]] +[[observability-apm-service-overview-cold-start-rate]] == Cold start rate The cold start rate chart is specific to serverless services, and displays the @@ -98,11 +98,11 @@ A cold start occurs when a serverless function has not been used for a certain p Analyzing the cold start rate can be useful for deciding how much memory to allocate to a function, or when to remove a large dependency. -The cold start rate chart is currently supported for <<apm-observe-lambda-functions-cold-starts,AWS Lambda>> +The cold start rate chart is currently supported for <<observability-apm-observe-lambda-functions-cold-starts,AWS Lambda>> functions and Azure functions. [discrete] -[[apm-service-overview-instances]] +[[observability-apm-service-overview-instances]] == Instances The **Instances** table displays a list of all the available service instances within the selected time range. @@ -113,7 +113,7 @@ failed transaction, CPU usage, and memory usage for each instance. By default, i image::images/services/all-instances.png[All instances] [discrete] -[[apm-service-overview-service-metadata]] +[[observability-apm-service-overview-service-metadata]] == Service metadata To view metadata relating to the service agent, and if relevant, the container and cloud provider, diff --git a/docs/en/serverless/apm/apm-ui-services.asciidoc b/docs/en/serverless/apm/apm-ui-services.asciidoc index 0193d07cf7..e8f68a0475 100644 --- a/docs/en/serverless/apm/apm-ui-services.asciidoc +++ b/docs/en/serverless/apm/apm-ui-services.asciidoc @@ -1,4 +1,4 @@ -[[apm-services]] +[[observability-apm-services]] = Services :keywords: serverless, observability, reference @@ -10,7 +10,7 @@ performance of all instrumented services. To help surface potential issues, services are sorted by their health status: **critical** → **warning** → **healthy** → **unknown**. -Health status is powered by <<apm-integrate-with-machine-learning,machine learning>> +Health status is powered by <<observability-apm-integrate-with-machine-learning,machine learning>> and requires anomaly detection to be enabled. In addition to health status, active alerts for each service are prominently displayed in the service inventory table. Selecting an active alert badge brings you to the **Alerts** tab where you can learn more about the active alert and take action. @@ -19,7 +19,7 @@ In addition to health status, active alerts for each service are prominently dis image::images/services/apm-services-overview.png[Example view of services table the Applications UI] [discrete] -[[apm-services-service-groups]] +[[observability-apm-services-service-groups]] == Service groups :role: Editor @@ -56,7 +56,7 @@ by one or more of the following dimensions: `agent.name`, `service.name`, `servi be assigned to the group. [discrete] -[[apm-services-examples]] +[[observability-apm-services-examples]] === Examples Not sure where to get started? Here are some sample queries you can build from: diff --git a/docs/en/serverless/apm/apm-ui-trace-sample-timeline.asciidoc b/docs/en/serverless/apm/apm-ui-trace-sample-timeline.asciidoc index 4aa14c2500..ffbef5a352 100644 --- a/docs/en/serverless/apm/apm-ui-trace-sample-timeline.asciidoc +++ b/docs/en/serverless/apm/apm-ui-trace-sample-timeline.asciidoc @@ -1,4 +1,4 @@ -[[apm-trace-sample-timeline]] +[[observability-apm-trace-sample-timeline]] = Trace sample timeline :keywords: serverless, observability, reference @@ -30,7 +30,7 @@ Each span has a type and is defined by a different color in the timeline/waterfa image::images/spans/apm-span-detail.png[Example view of a span detail in the Applications UI] [discrete] -[[apm-trace-sample-timeline-investigate]] +[[observability-apm-trace-sample-timeline-investigate]] == Investigate The trace sample timeline features an **Investigate** button which provides a quick way to jump @@ -41,12 +41,12 @@ For example, quickly view: * logs and metrics for the selected host * trace logs for the selected `trace.id` * uptime status of the selected domain -* the <<apm-service-map,service map>> filtered by the selected trace +* the <<observability-apm-service-map,service map>> filtered by the selected trace * the selected transaction in **Discover** -* your <<apm-create-custom-links,custom links>> +* your <<observability-apm-create-custom-links,custom links>> [discrete] -[[apm-trace-sample-timeline-distributed-tracing]] +[[observability-apm-trace-sample-timeline-distributed-tracing]] == Distributed tracing When a trace travels through multiple services it is known as a _distributed trace_. diff --git a/docs/en/serverless/apm/apm-ui-traces.asciidoc b/docs/en/serverless/apm/apm-ui-traces.asciidoc index bded6eea7b..7da555fa48 100644 --- a/docs/en/serverless/apm/apm-ui-traces.asciidoc +++ b/docs/en/serverless/apm/apm-ui-traces.asciidoc @@ -1,4 +1,4 @@ -[[apm-traces]] +[[observability-apm-traces]] = Traces :keywords: serverless, observability, reference @@ -9,12 +9,12 @@ preview:[] ==== Traces link together related transactions to show an end-to-end performance of how a request was served and which services were part of it. -In addition to the Traces overview, you can view your application traces in the <<apm-trace-sample-timeline,trace sample timeline waterfall>>. +In addition to the Traces overview, you can view your application traces in the <<observability-apm-trace-sample-timeline,trace sample timeline waterfall>>. ==== **Traces** displays your application's entry (root) transactions. Transactions with the same name are grouped together and only shown once in this table. -If you're using <<apm-trace-sample-timeline-distributed-tracing,distributed tracing>>, +If you're using <<observability-apm-trace-sample-timeline-distributed-tracing,distributed tracing>>, this view is key to finding the critical paths within your application. By default, transactions are sorted by _Impact_. @@ -29,14 +29,14 @@ You can also use queries to filter and search the transactions shown on this pag image::images/traces/apm-traces.png[Example view of the Traces overview in the Applications UI] [discrete] -[[apm-traces-trace-explorer]] +[[observability-apm-traces-trace-explorer]] == Trace explorer // <DocCallOut template="technical preview" /> **Trace explorer** is an experimental top-level search tool that allows you to query your traces using {kibana-ref}/kuery-query.html[Kibana Query Language (KQL)] or {ref}/eql.html[Event Query Language (EQL)]. -Curate your own custom queries, or use the <<apm-service-map>> to find and select edges to automatically generate queries based on your selection: +Curate your own custom queries, or use the <<observability-apm-service-map>> to find and select edges to automatically generate queries based on your selection: [role="screenshot"] image::images/traces/trace-explorer.png[Trace explorer] diff --git a/docs/en/serverless/apm/apm-ui-transactions.asciidoc b/docs/en/serverless/apm/apm-ui-transactions.asciidoc index 0f98e50794..f70192e0e7 100644 --- a/docs/en/serverless/apm/apm-ui-transactions.asciidoc +++ b/docs/en/serverless/apm/apm-ui-transactions.asciidoc @@ -1,4 +1,4 @@ -[[apm-transactions]] +[[observability-apm-transactions]] = Transactions :keywords: serverless, observability, reference @@ -53,10 +53,10 @@ It's important to note that if you have asynchronous spans, the sum of all span **Cold start rate**:: Only applicable to serverless transactions, this chart displays the percentage of requests that trigger a cold start of a serverless function. -See <<apm-observe-lambda-functions-cold-starts,Cold starts>> for more information. +See <<observability-apm-observe-lambda-functions-cold-starts,Cold starts>> for more information. [discrete] -[[apm-transactions-transactions-table]] +[[observability-apm-transactions-transactions-table]] == Transactions table The **Transactions** table displays a list of _transaction groups_ for the selected service. @@ -77,7 +77,7 @@ If you only see one route in the Transactions table, or if you have transactions it could be a symptom that the APM agent either wasn't installed correctly or doesn't support your framework. For further details, including troubleshooting and custom implementation instructions, -refer to the documentation for each <<apm-agents-elastic-apm-agents,APM Agent>> you've implemented. +refer to the documentation for each <<observability-apm-agents-elastic-apm-agents,APM Agent>> you've implemented. ==== [discrete] @@ -130,7 +130,7 @@ image::images/transactions/apm-transaction-sample.png[Example view of transactio [NOTE] ==== -More information on timeline waterfalls is available in <<apm-trace-sample-timeline,spans>>. +More information on timeline waterfalls is available in <<observability-apm-trace-sample-timeline,spans>>. ==== **Trace sample metadata** @@ -168,7 +168,7 @@ image::images/transactions/apm-logs-tab.png[APM logs tab] === Correlations Correlations surface attributes of your data that are potentially correlated with high-latency or erroneous transactions. -To learn more, see <<apm-find-transaction-latency-and-failure-correlations,Find transaction latency and failure correlations>>. +To learn more, see <<observability-apm-find-transaction-latency-and-failure-correlations,Find transaction latency and failure correlations>>. [role="screenshot"] image::images/transactions/correlations-hover.png[APM latency correlations] diff --git a/docs/en/serverless/apm/apm-view-and-analyze-traces.asciidoc b/docs/en/serverless/apm/apm-view-and-analyze-traces.asciidoc index 484c3d92a1..0215c73d6a 100644 --- a/docs/en/serverless/apm/apm-view-and-analyze-traces.asciidoc +++ b/docs/en/serverless/apm/apm-view-and-analyze-traces.asciidoc @@ -1,4 +1,4 @@ -[[apm-view-and-analyze-traces]] +[[observability-apm-view-and-analyze-traces]] = View and analyze traces :keywords: serverless, observability, overview @@ -11,7 +11,7 @@ identify and analyze errors, and monitor host-level and APM agent-specific metrics like JVM and Go runtime metrics. [discrete] -[[apm-view-and-analyze-traces-visualizing-application-bottlenecks]] +[[observability-apm-view-and-analyze-traces-visualizing-application-bottlenecks]] == Visualizing application bottlenecks Having access to application-level insights with just a few clicks can drastically decrease the time you spend diff --git a/docs/en/serverless/apm/apm.asciidoc b/docs/en/serverless/apm/apm.asciidoc index 577f897004..2bb7782c6b 100644 --- a/docs/en/serverless/apm/apm.asciidoc +++ b/docs/en/serverless/apm/apm.asciidoc @@ -1,4 +1,4 @@ -[[apm]] +[[observability-apm]] = Application performance monitoring (APM) :keywords: serverless, observability, overview @@ -20,7 +20,7 @@ Elastic APM agents automatically pick up basic host-level metrics and agent-spec like JVM metrics in the Java Agent, and Go runtime metrics in the Go Agent. [discrete] -[[apm-give-elastic-apm-a-try]] +[[observability-apm-give-elastic-apm-a-try]] == Give Elastic APM a try -Ready to give Elastic APM a try? See <<apm-get-started,Get started with traces and APM>>. +Ready to give Elastic APM a try? See <<observability-apm-get-started,Get started with traces and APM>>. diff --git a/docs/en/serverless/cases/cases.asciidoc b/docs/en/serverless/cases/cases.asciidoc index 3f380c1d58..6f2d63a366 100644 --- a/docs/en/serverless/cases/cases.asciidoc +++ b/docs/en/serverless/cases/cases.asciidoc @@ -1,4 +1,4 @@ -[[cases]] +[[observability-cases]] = Cases :description: Use cases to track progress toward solving problems detected in Elastic Observability. @@ -10,7 +10,7 @@ Collect and share information about observability issues by creating a case. Cases allow you to track key investigation details, add assignees and tags to your cases, set their severity and status, and add alerts, comments, and visualizations. You can also send cases to third-party systems by -<<case-settings,configuring external connectors>>. +<<observability-case-settings,configuring external connectors>>. [role="screenshot"] image::images/cases.png[Cases page] diff --git a/docs/en/serverless/cases/create-manage-cases.asciidoc b/docs/en/serverless/cases/create-manage-cases.asciidoc index bda9e181ed..bf1ca28d22 100644 --- a/docs/en/serverless/cases/create-manage-cases.asciidoc +++ b/docs/en/serverless/cases/create-manage-cases.asciidoc @@ -1,4 +1,4 @@ -[[create-a-new-case]] +[[observability-create-a-new-case]] = Create and manage cases :description: Learn how to create a case, add files, and manage the case over time. @@ -18,7 +18,7 @@ To create a case in your Observability project: . In your {observability} project, go to **Cases**. . Click **Create case**. -. (Optional) If you defined <<case-settings-templates,templates>>, select one to use its default field values. preview:[] +. (Optional) If you defined <<observability-case-settings-templates,templates>>, select one to use its default field values. preview:[] . Give the case a name, severity, and description. + [TIP] @@ -34,10 +34,10 @@ https://www.markdownguide.org/cheat-sheet[Markdown] syntax to create formatted t //// + You can add users who are assigned the Editor user role (or a more permissive role) for the project. -. If you defined <<case-settings-custom-fields,custom fields>>, they appear in the **Additional fields** section. +. If you defined <<observability-case-settings-custom-fields,custom fields>>, they appear in the **Additional fields** section. . (Optional) Under External incident management system, you can select a connector to send cases to an external system. If you've created any connectors previously, they will be listed here. -If there are no connectors listed, you can <<case-settings,create one>>. +If there are no connectors listed, you can <<observability-case-settings,create one>>. . After you've completed all of the required fields, click **Create case**. [TIP] @@ -46,7 +46,7 @@ You can also create a case from an alert or add an alert to an existing case. Fr ==== [discrete] -[[create-a-new-case-add-files]] +[[observability-create-a-new-case-add-files]] == Add files After you create a case, you can upload and manage files on the **Files** tab: @@ -100,17 +100,17 @@ When you subsequently add assignees to cases, they receive an email. //// [discrete] -[[create-a-new-case-send-cases-to-external-incident-management-systems]] +[[observability-create-a-new-case-send-cases-to-external-incident-management-systems]] == Send cases to external incident management systems To send a case to an external system, click the image:images/icons/importAction.svg[push] button in the _External incident management system_ section of the individual case page. This information is not sent automatically. If you make further changes to the shared case fields, you should push the case again. -For more information about configuring connections to external incident management systems, refer to <<case-settings>>. +For more information about configuring connections to external incident management systems, refer to <<observability-case-settings>>. [discrete] -[[create-a-new-case-manage-existing-cases]] +[[observability-create-a-new-case-manage-existing-cases]] == Manage existing cases You can search existing cases and filter them by attributes such as assignees, diff --git a/docs/en/serverless/cases/manage-cases-settings.asciidoc b/docs/en/serverless/cases/manage-cases-settings.asciidoc index f2f255b1ff..2a156d09fe 100644 --- a/docs/en/serverless/cases/manage-cases-settings.asciidoc +++ b/docs/en/serverless/cases/manage-cases-settings.asciidoc @@ -1,4 +1,4 @@ -[[case-settings]] +[[observability-case-settings]] = Configure case settings :description: Change the default behavior of {observability} cases by adding connectors, custom fields, templates, and closure options. @@ -21,7 +21,7 @@ image::images/observability-cases-settings.png[View case settings] // NOTE: This is an autogenerated screenshot. Do not edit it directly. [discrete] -[[case-settings-case-closures]] +[[observability-case-settings-case-closures]] == Case closures If you close cases in your external incident management system, the cases will remain open in Elastic Observability until you close them manually (the information is only sent in one direction). @@ -29,7 +29,7 @@ If you close cases in your external incident management system, the cases will r To close cases when they are sent to an external system, select **Automatically close cases when pushing new incident to external system**. [discrete] -[[case-settings-external-incident-management-systems]] +[[observability-case-settings-external-incident-management-systems]] == External incident management systems If you are using an external incident management system, you can integrate Elastic Observability @@ -60,7 +60,7 @@ After creating a connector, you can set your cases to automatically close when they are sent to an external system. [discrete] -[[case-settings-create-a-connector]] +[[observability-case-settings-create-a-connector]] === Create a connector . From the **Incident management system** list, select **Add new connector**. @@ -83,14 +83,14 @@ image::images/observability-cases-add-connector.png[Add a connector to send case . Click **Save**. [discrete] -[[case-settings-edit-a-connector]] +[[observability-case-settings-edit-a-connector]] === Edit a connector You can create additional connectors, update existing connectors, and change the connector used to send cases to external systems. [TIP] ==== -You can also configure which connector is used for each case individually. Refer to <<create-a-new-case>>. +You can also configure which connector is used for each case individually. Refer to <<observability-create-a-new-case>>. ==== To change the default connector used to send cases to external systems: @@ -103,7 +103,7 @@ To update an existing connector: . Update the connector fields as required. [discrete] -[[case-settings-custom-fields]] +[[observability-case-settings-custom-fields]] == Custom fields You can add optional and required fields for customized case collaboration. @@ -125,7 +125,7 @@ In existing cases, new custom text fields initially have null values. You can subsequently remove or edit custom fields on the **Settings** page. [discrete] -[[case-settings-templates]] +[[observability-case-settings-templates]] == Templates preview::[] diff --git a/docs/en/serverless/dashboards/dashboards-and-visualizations.asciidoc b/docs/en/serverless/dashboards/dashboards-and-visualizations.asciidoc index edffb0dd32..8aa107a9d8 100644 --- a/docs/en/serverless/dashboards/dashboards-and-visualizations.asciidoc +++ b/docs/en/serverless/dashboards/dashboards-and-visualizations.asciidoc @@ -1,4 +1,4 @@ -[[dashboards]] +[[observability-dashboards]] = Dashboards :description: Visualize your observability data using pre-built dashboards or create your own. @@ -24,7 +24,7 @@ Notice you can filter the list of dashboards: * Click a dashboard's tags to toggle filtering for each tag. [discrete] -[[dashboards-create-new-dashboards]] +[[observability-dashboards-create-new-dashboards]] == Create new dashboards To create a new dashboard, click **Create Dashboard** and begin adding visualizations. diff --git a/docs/en/serverless/elastic-entity-model.asciidoc b/docs/en/serverless/elastic-entity-model.asciidoc index b5fbee281e..9412ffe4fd 100644 --- a/docs/en/serverless/elastic-entity-model.asciidoc +++ b/docs/en/serverless/elastic-entity-model.asciidoc @@ -1,4 +1,4 @@ -[[elastic-entity-model]] +[[observability-elastic-entity-model]] = Elastic Entity Model :description: Learn about the model that empowers entity-centric Elastic solution features and workflows. @@ -22,12 +22,12 @@ The concept of an entity is important as a means to unify observability signals .Notes [NOTE] ==== -* The Elastic Entity Model currently supports the <<inventory,new inventory experience>> limited to service, host, and container entities. +* The Elastic Entity Model currently supports the <<observability-inventory,new inventory experience>> limited to service, host, and container entities. * During Technical Preview, Entity Discovery Framework components are not enabled by default. ==== [discrete] -[[elastic-entity-model-enable-the-elastic-entity-model]] +[[observability-elastic-entity-model-enable-the-elastic-entity-model]] == Enable the Elastic Entity Model :role: Admin @@ -37,10 +37,10 @@ include::./partials/roles.asciidoc[] :goal!: -You can enable the Elastic Entity Model from the new <<inventory,Inventory>>. If already enabled, you will not be prompted to enable the Elastic Entity Model. +You can enable the Elastic Entity Model from the new <<observability-inventory,Inventory>>. If already enabled, you will not be prompted to enable the Elastic Entity Model. [discrete] -[[elastic-entity-model-disable-the-elastic-entity-model]] +[[observability-elastic-entity-model-disable-the-elastic-entity-model]] == Disable the Elastic Entity Model :role: Admin @@ -53,7 +53,7 @@ include::./partials/roles.asciidoc[] From the Dev Console, run the command: `DELETE kbn:/internal/entities/managed/enablement` [discrete] -[[elastic-entity-model-limitations]] +[[observability-elastic-entity-model-limitations]] == Limitations * https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-cross-cluster-search.html[Cross-cluster search (CCS)] is not supported. EEM cannot leverage data stored on a remote cluster. diff --git a/docs/en/serverless/infra-monitoring/analyze-hosts.asciidoc b/docs/en/serverless/infra-monitoring/analyze-hosts.asciidoc index 0dc004ca58..b3d15797ef 100644 --- a/docs/en/serverless/infra-monitoring/analyze-hosts.asciidoc +++ b/docs/en/serverless/infra-monitoring/analyze-hosts.asciidoc @@ -1,4 +1,4 @@ -[[analyze-hosts]] +[[observability-analyze-hosts]] = Analyze and compare hosts :description: Get a metrics-driven view of your hosts backed by an easy-to-use interface called Lens. @@ -25,7 +25,7 @@ To access the **Hosts** page, in your {observability} project, go to [role="screenshot"] image::images/hosts.png[Screenshot of the Hosts page] -To learn more about the metrics shown on this page, refer to the <<metrics-reference>> documentation. +To learn more about the metrics shown on this page, refer to the <<observability-metrics-reference>> documentation. .Don't see any metrics? [NOTE] @@ -33,7 +33,7 @@ To learn more about the metrics shown on this page, refer to the <<metrics-refer If you haven't added data yet, click **Add data** to search for and install an Elastic integration. Need help getting started? Follow the steps in -<<get-started-with-metrics,Get started with system metrics>>. +<<observability-get-started-with-metrics,Get started with system metrics>>. ==== The **Hosts** page provides several ways to view host metrics: @@ -57,7 +57,7 @@ and alerts for all hosts returned by your search. [TIP] ==== -For more information about creating and viewing alerts, refer to <<alerting>>. +For more information about creating and viewing alerts, refer to <<observability-alerting>>. ==== [discrete] @@ -186,7 +186,7 @@ edit the rules and make sure they are correctly configured to associate the host * For Metric threshold or Custom threshold rules, select `host.name` in the **Group alerts by** field. * For Inventory rules, select **Host** for the node type under **Conditions**. -To learn more about creating and managing rules, refer to <<alerting>>. +To learn more about creating and managing rules, refer to <<observability-alerting>>. ==== [discrete] @@ -220,7 +220,7 @@ There are a few reasons why you may see dashed lines in your charts. * <<dashed-interval,The chart interval is too short>> * <<dashed-missing,Data is missing>> -* <<analyze-hosts-the-chart-interval-is-too-short-and-data-is-missing,The chart interval is too short and data is missing>> +* <<observability-analyze-hosts-the-chart-interval-is-too-short-and-data-is-missing,The chart interval is too short and data is missing>> [discrete] [[dashed-interval]] @@ -255,7 +255,7 @@ You may want to investigate this time period to determine if there is an outage image::images/hosts-missing-data.png[Screenshot showing missing data] [discrete] -[[analyze-hosts-the-chart-interval-is-too-short-and-data-is-missing]] +[[observability-analyze-hosts-the-chart-interval-is-too-short-and-data-is-missing]] === The chart interval is too short and data is missing In the example shown in the screenshot, @@ -270,7 +270,7 @@ to determine if there is an outage or issue. image::images/hosts-dashed-and-missing.png[Screenshot showing dashed lines and missing data] [discrete] -[[analyze-hosts-troubleshooting]] +[[observability-analyze-hosts-troubleshooting]] == Troubleshooting //// @@ -285,7 +285,7 @@ Content: //// [discrete] -[[analyze-hosts-what-does-mean]] +[[observability-analyze-hosts-what-does-mean]] === What does _this host has been detected by APM_ mean? // What the user sees/experiences (error message, UI, behavior, etc) @@ -306,7 +306,7 @@ it will be listed as a host with the partial metrics collected by APM. // What the user sees/experiences (error message, UI, behavior, etc) [discrete] -[[analyze-hosts-i-dont-recognize-a-host-name-and-i-see-a-question-mark-icon-next-to-it]] +[[observability-analyze-hosts-i-dont-recognize-a-host-name-and-i-see-a-question-mark-icon-next-to-it]] === I don't recognize a host name and I see a question mark icon next to it // Why it happens @@ -317,4 +317,4 @@ Instead, the host name might be the container name or the Kubernetes pod name. // How to fix it To get the correct host name, you need to set some additional configuration options, -specifically `system.kubernetes.node.name` as described in <<apm-server-api,Kubernetes data>>. +specifically `system.kubernetes.node.name` as described in <<observability-apm-server-api,Kubernetes data>>. diff --git a/docs/en/serverless/infra-monitoring/aws-metrics.asciidoc b/docs/en/serverless/infra-monitoring/aws-metrics.asciidoc index d1d6346131..16faa322b1 100644 --- a/docs/en/serverless/infra-monitoring/aws-metrics.asciidoc +++ b/docs/en/serverless/infra-monitoring/aws-metrics.asciidoc @@ -1,4 +1,4 @@ -[[aws-metrics]] +[[observability-aws-metrics]] = AWS metrics :description: Learn about key metrics used for AWS monitoring. @@ -120,4 +120,4 @@ or you can add <<custom-metrics,custom metrics>>. |=== For information about the fields used by the Infrastructure UI to display AWS services metrics, see the -<<infrastructure-monitoring-required-fields>>. +<<observability-infrastructure-monitoring-required-fields>>. diff --git a/docs/en/serverless/infra-monitoring/configure-infra-settings.asciidoc b/docs/en/serverless/infra-monitoring/configure-infra-settings.asciidoc index e1676472d9..15c9f6c2d5 100644 --- a/docs/en/serverless/infra-monitoring/configure-infra-settings.asciidoc +++ b/docs/en/serverless/infra-monitoring/configure-infra-settings.asciidoc @@ -1,4 +1,4 @@ -[[configure-intra-settings]] +[[observability-configure-intra-settings]] = Configure settings :description: Learn how to configure infrastructure UI settings. diff --git a/docs/en/serverless/infra-monitoring/container-metrics.asciidoc b/docs/en/serverless/infra-monitoring/container-metrics.asciidoc index 27f8a38d53..7905b0d7e7 100644 --- a/docs/en/serverless/infra-monitoring/container-metrics.asciidoc +++ b/docs/en/serverless/infra-monitoring/container-metrics.asciidoc @@ -1,4 +1,4 @@ -[[container-metrics]] +[[observability-container-metrics]] = Container metrics :description: Learn about key container metrics used for container monitoring. @@ -62,7 +62,7 @@ a| Derivative of the maximum of `docker.network.out.bytes` scaled to a 1 second |=== [discrete] -[[container-metrics-disk-metrics]] +[[observability-container-metrics-disk-metrics]] === Disk metrics |=== diff --git a/docs/en/serverless/infra-monitoring/detect-metric-anomalies.asciidoc b/docs/en/serverless/infra-monitoring/detect-metric-anomalies.asciidoc index cc39434aa9..93a97b7ad8 100644 --- a/docs/en/serverless/infra-monitoring/detect-metric-anomalies.asciidoc +++ b/docs/en/serverless/infra-monitoring/detect-metric-anomalies.asciidoc @@ -1,4 +1,4 @@ -[[detect-metric-anomalies]] +[[observability-detect-metric-anomalies]] = Detect metric anomalies :description: Detect and inspect memory usage and network traffic anomalies for hosts and Kubernetes pods. diff --git a/docs/en/serverless/infra-monitoring/get-started-with-metrics.asciidoc b/docs/en/serverless/infra-monitoring/get-started-with-metrics.asciidoc index 97b88592db..d60b07e485 100644 --- a/docs/en/serverless/infra-monitoring/get-started-with-metrics.asciidoc +++ b/docs/en/serverless/infra-monitoring/get-started-with-metrics.asciidoc @@ -1,4 +1,4 @@ -[[get-started-with-metrics]] +[[observability-get-started-with-metrics]] = Get started with system metrics :description: Learn how to onboard your system metrics data quickly. @@ -18,7 +18,7 @@ then observe the data in Elastic {observability}. To onboard system metrics data: -. <<create-an-observability-project,Create a new {observability} project>>, or open an existing one. +. <<observability-create-an-observability-project,Create a new {observability} project>>, or open an existing one. . In your {observability} project, go to **Project Settings** → **Integrations**. . Type **System** in the search bar, then select the integration to see more details about it. . Click **Add System**. @@ -49,15 +49,15 @@ and use the generated configuration as source for the input configurations that After the agent is installed and successfully streaming metrics data, go to **Infrastructure** → **Inventory** or **Hosts** to see a metrics-driven view of your infrastructure. -To learn more, refer to <<view-infrastructure-metrics>> or <<analyze-hosts>>. +To learn more, refer to <<observability-view-infrastructure-metrics>> or <<observability-analyze-hosts>>. [discrete] -[[get-started-with-metrics-next-steps]] +[[observability-get-started-with-metrics-next-steps]] == Next steps Now that you've added metrics and explored your data, learn how to onboard other types of data: -* <<get-started-with-logs>> -* <<stream-log-files>> -* <<apm-get-started>> +* <<observability-get-started-with-logs>> +* <<observability-stream-log-files>> +* <<observability-apm-get-started>> diff --git a/docs/en/serverless/infra-monitoring/handle-no-results-found-message.asciidoc b/docs/en/serverless/infra-monitoring/handle-no-results-found-message.asciidoc index 79a553a07e..16caed5b0c 100644 --- a/docs/en/serverless/infra-monitoring/handle-no-results-found-message.asciidoc +++ b/docs/en/serverless/infra-monitoring/handle-no-results-found-message.asciidoc @@ -1,4 +1,4 @@ -[[handle-no-results-found-message]] +[[observability-handle-no-results-found-message]] = Understanding "no results found" message :description: Learn about the reasons for "no results found" messages and how to fix them. @@ -9,7 +9,7 @@ preview:[] To correctly render visualizations in the {observability} UI, all metrics used by the UI must be present in the collected data. For a description of these metrics, -refer to <<metrics-reference>>. +refer to <<observability-metrics-reference>>. There are several reasons why metrics might be missing from the collected data: diff --git a/docs/en/serverless/infra-monitoring/host-metrics.asciidoc b/docs/en/serverless/infra-monitoring/host-metrics.asciidoc index a75b09c81c..aba070fcb2 100644 --- a/docs/en/serverless/infra-monitoring/host-metrics.asciidoc +++ b/docs/en/serverless/infra-monitoring/host-metrics.asciidoc @@ -1,4 +1,4 @@ -[[host-metrics]] +[[observability-host-metrics]] = Host metrics :description: Learn about key host metrics used for host monitoring. @@ -189,7 +189,7 @@ For legacy metric calculations, refer to <<legacy-metrics,Legacy metrics>>. |=== [discrete] -[[host-metrics-disk-metrics]] +[[observability-host-metrics-disk-metrics]] == Disk metrics |=== diff --git a/docs/en/serverless/infra-monitoring/infra-monitoring.asciidoc b/docs/en/serverless/infra-monitoring/infra-monitoring.asciidoc index 880d15951d..2df423c42c 100644 --- a/docs/en/serverless/infra-monitoring/infra-monitoring.asciidoc +++ b/docs/en/serverless/infra-monitoring/infra-monitoring.asciidoc @@ -1,4 +1,4 @@ -[[infrastructure-monitoring]] +[[observability-infrastructure-monitoring]] = Infrastructure monitoring :description: Monitor metrics from your servers, Docker, Kubernetes, Prometheus, and other services and applications. @@ -16,17 +16,17 @@ telemetry, and more. For more information, refer to the following links: -* <<get-started-with-metrics>>: +* <<observability-get-started-with-metrics>>: Learn how to onboard your system metrics data quickly. -* <<view-infrastructure-metrics>>: +* <<observability-view-infrastructure-metrics>>: Use the **Inventory page** to get a metrics-driven view of your infrastructure grouped by resource type. -* <<analyze-hosts>>: +* <<observability-analyze-hosts>>: Use the **Hosts** page to get a metrics-driven view of your infrastructure backed by an easy-to-use interface called Lens. -* <<detect-metric-anomalies>>: Detect and inspect memory usage and network traffic anomalies for hosts and Kubernetes pods. -* <<configure-intra-settings>>: Learn how to configure infrastructure UI settings. -* <<metrics-reference>>: Learn about key metrics used for infrastructure monitoring. -* <<infrastructure-monitoring-required-fields>>: Learn about the fields required to display data in the Infrastructure UI. +* <<observability-detect-metric-anomalies>>: Detect and inspect memory usage and network traffic anomalies for hosts and Kubernetes pods. +* <<observability-configure-intra-settings>>: Learn how to configure infrastructure UI settings. +* <<observability-metrics-reference>>: Learn about key metrics used for infrastructure monitoring. +* <<observability-infrastructure-monitoring-required-fields>>: Learn about the fields required to display data in the Infrastructure UI. By default, the Infrastructure UI displays metrics from {es} indices that match the `metrics-*` and `metricbeat-*` index patterns. To learn how to change -this behavior, refer to <<configure-intra-settings,Configure settings>>. +this behavior, refer to <<observability-configure-intra-settings,Configure settings>>. diff --git a/docs/en/serverless/infra-monitoring/kubernetes-pod-metrics.asciidoc b/docs/en/serverless/infra-monitoring/kubernetes-pod-metrics.asciidoc index aa4034ecad..49bcdf2970 100644 --- a/docs/en/serverless/infra-monitoring/kubernetes-pod-metrics.asciidoc +++ b/docs/en/serverless/infra-monitoring/kubernetes-pod-metrics.asciidoc @@ -1,4 +1,4 @@ -[[kubernetes-pod-metrics]] +[[observability-kubernetes-pod-metrics]] = Kubernetes pod metrics :description: Learn about key metrics used for Kubernetes monitoring. @@ -27,4 +27,4 @@ or you can add <<custom-metrics,custom metrics>>. |=== For information about the fields used by the Infrastructure UI to display Kubernetes pod metrics, see the -<<infrastructure-monitoring-required-fields>>. +<<observability-infrastructure-monitoring-required-fields>>. diff --git a/docs/en/serverless/infra-monitoring/metrics-app-fields.asciidoc b/docs/en/serverless/infra-monitoring/metrics-app-fields.asciidoc index 9a1cce3fca..7757a177f7 100644 --- a/docs/en/serverless/infra-monitoring/metrics-app-fields.asciidoc +++ b/docs/en/serverless/infra-monitoring/metrics-app-fields.asciidoc @@ -1,4 +1,4 @@ -[[infrastructure-monitoring-required-fields]] +[[observability-infrastructure-monitoring-required-fields]] = Required fields :description: Learn about the fields required to display data in the Infrastructure UI. @@ -10,7 +10,7 @@ This section lists the fields the Infrastructure UI uses to display data. Please note that some of the fields listed here are not {ecs-ref}/ecs-reference.html#_what_is_ecs[ECS fields]. [discrete] -[[infrastructure-monitoring-required-fields-additional-field-details]] +[[observability-infrastructure-monitoring-required-fields-additional-field-details]] == Additional field details The `event.dataset` field is required to display data properly in some views. This field diff --git a/docs/en/serverless/infra-monitoring/metrics-reference.asciidoc b/docs/en/serverless/infra-monitoring/metrics-reference.asciidoc index bd35f532f9..616a033c02 100644 --- a/docs/en/serverless/infra-monitoring/metrics-reference.asciidoc +++ b/docs/en/serverless/infra-monitoring/metrics-reference.asciidoc @@ -1,4 +1,4 @@ -[[metrics-reference]] +[[observability-metrics-reference]] = Metrics reference :description: Learn about key metrics used for infrastructure monitoring. @@ -9,7 +9,7 @@ preview:[] Learn about the key metrics displayed in the Infrastructure UI and how they are calculated. -* <<host-metrics,Host metrics>> -* <<kubernetes-pod-metrics,Kubernetes pod metrics>> -* <<container-metrics,Container metrics>> -* <<aws-metrics,AWS metrics>> +* <<observability-host-metrics,Host metrics>> +* <<observability-kubernetes-pod-metrics,Kubernetes pod metrics>> +* <<observability-container-metrics,Container metrics>> +* <<observability-aws-metrics,AWS metrics>> diff --git a/docs/en/serverless/infra-monitoring/troubleshooting-infra.asciidoc b/docs/en/serverless/infra-monitoring/troubleshooting-infra.asciidoc index a278c44b49..b6af5f8a7d 100644 --- a/docs/en/serverless/infra-monitoring/troubleshooting-infra.asciidoc +++ b/docs/en/serverless/infra-monitoring/troubleshooting-infra.asciidoc @@ -1,4 +1,4 @@ -[[troubleshooting-infrastructure-monitoring]] +[[observability-troubleshooting-infrastructure-monitoring]] = Troubleshooting :description: Learn how to troubleshoot issues with infrastructure monitoring. @@ -8,10 +8,10 @@ preview:[] Learn how to troubleshoot common issues on your own or ask for help. -* <<handle-no-results-found-message>> +* <<observability-handle-no-results-found-message>> [discrete] -[[troubleshooting-infrastructure-monitoring-elastic-support]] +[[observability-troubleshooting-infrastructure-monitoring-elastic-support]] == Elastic Support We offer a support experience unlike any other. @@ -19,7 +19,7 @@ Our team of professionals 'speak human and code' and love making your day. https://www.elastic.co/subscriptions[Learn more about subscriptions]. [discrete] -[[troubleshooting-infrastructure-monitoring-discussion-forum]] +[[observability-troubleshooting-infrastructure-monitoring-discussion-forum]] == Discussion forum For other questions and feature requests, diff --git a/docs/en/serverless/infra-monitoring/view-infrastructure-metrics.asciidoc b/docs/en/serverless/infra-monitoring/view-infrastructure-metrics.asciidoc index 84e9f4e47e..3e640398a3 100644 --- a/docs/en/serverless/infra-monitoring/view-infrastructure-metrics.asciidoc +++ b/docs/en/serverless/infra-monitoring/view-infrastructure-metrics.asciidoc @@ -1,4 +1,4 @@ -[[view-infrastructure-metrics]] +[[observability-view-infrastructure-metrics]] = View infrastructure metrics by resource type :description: Get a metrics-driven view of your infrastructure grouped by resource type. @@ -17,7 +17,7 @@ go to **Infrastructure** → **Inventory**. [role="screenshot"] image::images/metrics-app.png[Infrastructure UI in {kib}] -To learn more about the metrics shown on this page, refer to the <<metrics-reference>>. +To learn more about the metrics shown on this page, refer to the <<observability-metrics-reference>>. .Don't see any metrics? [NOTE] @@ -25,7 +25,7 @@ To learn more about the metrics shown on this page, refer to the <<metrics-refer If you haven't added data yet, click **Add data** to search for and install an Elastic integration. Need help getting started? Follow the steps in -<<get-started-with-metrics,Get started with system metrics>>. +<<observability-get-started-with-metrics,Get started with system metrics>>. ==== [discrete] @@ -146,5 +146,5 @@ image::images/add-custom-metric.png[Add custom metrics] Depending on the features you have installed and configured, you can view logs or traces relating to a specific resource. For example, in the high-level view, when you click a Kubernetes Pod resource, you can choose: -* **Kubernetes Pod logs** to <<log-monitoring,view corresponding logs>> in the {logs-app}. -* **Kubernetes Pod APM traces** to <<apm,view corresponding APM traces>> in the {apm-app}. +* **Kubernetes Pod logs** to <<observability-log-monitoring,view corresponding logs>> in the {logs-app}. +* **Kubernetes Pod APM traces** to <<observability-apm,view corresponding APM traces>> in the {apm-app}. diff --git a/docs/en/serverless/inventory.asciidoc b/docs/en/serverless/inventory.asciidoc index fc0098c1ee..5d18aa9d79 100644 --- a/docs/en/serverless/inventory.asciidoc +++ b/docs/en/serverless/inventory.asciidoc @@ -1,4 +1,4 @@ -[[inventory]] +[[observability-inventory]] = Inventory :description: Learn about the new Inventory experience that enables you to monitor all your entities from one single place. @@ -10,7 +10,7 @@ Inventory provides a single place to observe the status of your entire ecosystem [NOTE] ==== -The new Inventory requires the Elastic Entity Model (EEM). To learn more, refer to <<elastic-entity-model>>. +The new Inventory requires the Elastic Entity Model (EEM). To learn more, refer to <<observability-elastic-entity-model>>. ==== [role="screenshot"] @@ -40,7 +40,7 @@ Inventory allows you to: * Easily discover all entities related to the host, container or service you are viewing by leveraging your tags and labels [discrete] -[[inventory-explore-your-entities]] +[[observability-inventory-explore-your-entities]] == Explore your entities . In your {observability} project, go to **Inventory** to view all of your entities. @@ -72,13 +72,13 @@ image::images/entity-detailed-view.png[Entity detailed view] If you open an entity of type `host` or `container` that does not have infrastructure data, some of the visualizations will be blank and some features on the page will not be fully populated. [discrete] -[[inventory-add-entities-to-the-inventory]] +[[observability-inventory-add-entities-to-the-inventory]] == Add entities to the Inventory Entities are added to the Inventory through one of the following approaches: **Add data** or **Associate existing service logs**. [discrete] -[[inventory-add-data]] +[[observability-inventory-add-data]] === Add data To add entities, select **Add data** from the left-hand navigation and choose one of the following onboarding journeys: @@ -93,7 +93,7 @@ Elastic APM / OpenTelemetry / Synthetic Monitor:: Detects services [discrete] -[[inventory-associate-existing-service-logs]] +[[observability-inventory-associate-existing-service-logs]] === Associate existing service logs -To learn how, refer to <<add-logs-service-name>>. +To learn how, refer to <<observability-add-logs-service-name>>. diff --git a/docs/en/serverless/logging/add-logs-service-name.asciidoc b/docs/en/serverless/logging/add-logs-service-name.asciidoc index 6faa13e8c7..908cbb9c55 100644 --- a/docs/en/serverless/logging/add-logs-service-name.asciidoc +++ b/docs/en/serverless/logging/add-logs-service-name.asciidoc @@ -1,4 +1,4 @@ -[[add-logs-service-name]] +[[observability-add-logs-service-name]] = Add a service name to logs :description: Learn how to add a service name field to your logs. @@ -13,7 +13,7 @@ To add a service name to your logs, either: * Map an existing field from your data stream to the `service.name` field. [discrete] -[[add-logs-service-name-use-the-add-fields-processor-to-add-a-service-name]] +[[observability-add-logs-service-name-use-the-add-fields-processor-to-add-a-service-name]] == Use the add fields processor to add a service name For log data without a service name, use the {fleet-guide}/add_fields-processor.html[`add_fields` processor] to add the `service.name` field. @@ -38,7 +38,7 @@ image::images/add-field-processor.png[Add the add_fields processor to an integra For more on defining processors, refer to {fleet-guide}/elastic-agent-processor-configuration.html[define processors]. [discrete] -[[add-logs-service-name-map-an-existing-field-to-the-service-name-field]] +[[observability-add-logs-service-name-map-an-existing-field-to-the-service-name-field]] == Map an existing field to the service name field For logs that with an existing field being used to represent the service name, map that field to the `service.name` field using the {ref}/field-alias.html[alias field type]. @@ -55,7 +55,7 @@ Follow these steps to update your mapping: For more ways to add a field to your mapping, refer to {ref}/explicit-mapping.html#add-field-mapping[add a field to an existing mapping]. [discrete] -[[add-logs-service-name-additional-ways-to-process-data]] +[[observability-add-logs-service-name-additional-ways-to-process-data]] == Additional ways to process data The {stack} provides additional ways to process your data: diff --git a/docs/en/serverless/logging/correlate-application-logs.asciidoc b/docs/en/serverless/logging/correlate-application-logs.asciidoc index d070a7a3fe..c8e05e441a 100644 --- a/docs/en/serverless/logging/correlate-application-logs.asciidoc +++ b/docs/en/serverless/logging/correlate-application-logs.asciidoc @@ -1,4 +1,4 @@ -[[correlate-application-logs]] +[[observability-correlate-application-logs]] = Stream application logs :description: Learn about application logs and options for ingesting them. @@ -11,7 +11,7 @@ Application logs provide valuable insight into events that have occurred within The format of your logs (structured or plaintext) influences your log ingestion strategy. [discrete] -[[correlate-application-logs-plaintext-logs-vs-structured-elastic-common-schema-ecs-logs]] +[[observability-correlate-application-logs-plaintext-logs-vs-structured-elastic-common-schema-ecs-logs]] == Plaintext logs vs. structured Elastic Common Schema (ECS) logs Logs are typically produced as either plaintext or structured. @@ -40,40 +40,40 @@ For example, the previous example logs might look like this when structured with ---- [discrete] -[[correlate-application-logs-ingesting-logs]] +[[observability-correlate-application-logs-ingesting-logs]] == Ingesting logs There are several ways to ingest application logs into your project. Your specific situation helps determine the method that's right for you. [discrete] -[[correlate-application-logs-plaintext-logs]] +[[observability-correlate-application-logs-plaintext-logs]] === Plaintext logs With {filebeat} or {agent}, you can ingest plaintext logs, including existing logs, from any programming language or framework without modifying your application or its configuration. For plaintext logs to be useful, you need to use {filebeat} or {agent} to parse the log data. -**image:images/icons/documentation.svg[documentation icon] Learn more in <<plaintext-application-logs,Plaintext logs>>** +**image:images/icons/documentation.svg[documentation icon] Learn more in <<observability-plaintext-application-logs,Plaintext logs>>** [discrete] -[[correlate-application-logs-ecs-formatted-logs]] +[[observability-correlate-application-logs-ecs-formatted-logs]] === ECS formatted logs Logs formatted in ECS don't require manual parsing and the configuration can be reused across applications. They also include log correlation. You can format your logs in ECS by using ECS logging plugins or {apm-agent} ECS reformatting. [discrete] -[[correlate-application-logs-ecs-logging-plugins]] +[[observability-correlate-application-logs-ecs-logging-plugins]] ==== ECS logging plugins Add ECS logging plugins to your logging libraries to format your logs into ECS-compatible JSON that doesn't require parsing. To use ECS logging, you need to modify your application and its log configuration. -**image:images/icons/documentation.svg[documentation icon] Learn more in <<ecs-application-logs,ECS formatted logs>>** +**image:images/icons/documentation.svg[documentation icon] Learn more in <<observability-ecs-application-logs,ECS formatted logs>>** [discrete] -[[correlate-application-logs-apm-agent-log-reformatting]] +[[observability-correlate-application-logs-apm-agent-log-reformatting]] ==== {apm-agent} log reformatting Some Elastic {apm-agent}s can automatically reformat application logs to ECS format @@ -85,20 +85,20 @@ This feature is supported for the following {apm-agent}s: * {apm-py-ref}/logs.html#log-reformatting[Python] * {apm-java-ref}/logs.html#log-reformatting[Java] -**image:images/icons/documentation.svg[documentation icon] Learn more in <<ecs-application-logs,ECS formatted logs>>** +**image:images/icons/documentation.svg[documentation icon] Learn more in <<observability-ecs-application-logs,ECS formatted logs>>** [discrete] -[[correlate-application-logs-apm-agent-log-sending]] +[[observability-correlate-application-logs-apm-agent-log-sending]] === {apm-agent} log sending Automatically capture and send logs directly to the managed intake service using the {apm-agent} without using {filebeat} or {agent}. Log sending is supported in the Java {apm-agent}. -**image:images/icons/documentation.svg[documentation icon] Learn more in <<send-application-logs,{apm-agent} log sending>>** +**image:images/icons/documentation.svg[documentation icon] Learn more in <<observability-send-application-logs,{apm-agent} log sending>>** [discrete] -[[correlate-application-logs-log-correlation]] +[[observability-correlate-application-logs-log-correlation]] == Log correlation include::../transclusion/observability/application-logs/correlate-logs.asciidoc[] diff --git a/docs/en/serverless/logging/ecs-application-logs.asciidoc b/docs/en/serverless/logging/ecs-application-logs.asciidoc index 3bfcaf3a1c..ac73eaba3d 100644 --- a/docs/en/serverless/logging/ecs-application-logs.asciidoc +++ b/docs/en/serverless/logging/ecs-application-logs.asciidoc @@ -1,4 +1,4 @@ -[[ecs-application-logs]] +[[observability-ecs-application-logs]] = ECS formatted application logs :description: Use an ECS logger or an {apm-agent} to format your logs in ECS format. @@ -10,11 +10,11 @@ Logs formatted in Elastic Common Schema (ECS) don't require manual parsing, and You can format your logs in ECS format the following ways: -* <<ecs-application-logs-ecs-loggers,**ECS loggers:**>> plugins for your logging libraries that reformat your logs into ECS format. +* <<observability-ecs-application-logs-ecs-loggers,**ECS loggers:**>> plugins for your logging libraries that reformat your logs into ECS format. * <<reformatting-logs,**{apm-agent} ECS reformatting:**>> Java, Ruby, and Python {apm-agent}s automatically reformat application logs to ECS format without a logger. [discrete] -[[ecs-application-logs-ecs-loggers]] +[[observability-ecs-application-logs-ecs-loggers]] == ECS loggers ECS loggers reformat your application logs into ECS-compatible JSON, removing the need for manual parsing. @@ -22,7 +22,7 @@ ECS loggers require {filebeat} or {agent} configured to monitor and capture appl In addition, pairing ECS loggers with your framework's {apm-agent} allows you to correlate logs to easily view logs that belong to a particular trace. [discrete] -[[ecs-application-logs-get-started]] +[[observability-ecs-application-logs-get-started]] === Get started For more information on adding an ECS logger to your application, refer to the guide for your framework: @@ -43,12 +43,12 @@ Java, Ruby, and Python {apm-agent}s can automatically reformat application logs To set up log ECS reformatting: -. <<ecs-application-logs-enable-log-ecs-reformatting,Enable {apm-agent} reformatting>> -. <<ecs-application-logs-ingest-logs,Ingest logs with {filebeat} or {agent}.>> -. <<ecs-application-logs-view-logs,View logs in Logs Explorer>> +. <<observability-ecs-application-logs-enable-log-ecs-reformatting,Enable {apm-agent} reformatting>> +. <<observability-ecs-application-logs-ingest-logs,Ingest logs with {filebeat} or {agent}.>> +. <<observability-ecs-application-logs-view-logs,View logs in Logs Explorer>> [discrete] -[[ecs-application-logs-enable-log-ecs-reformatting]] +[[observability-ecs-application-logs-enable-log-ecs-reformatting]] === Enable log ECS reformatting Log ECS reformatting is controlled by the `log_ecs_reformatting` configuration option, and is disabled by default. Refer to the guide for your framework for information on enabling: @@ -58,16 +58,16 @@ Log ECS reformatting is controlled by the `log_ecs_reformatting` configuration o * {apm-py-ref}/configuration.html#config-log_ecs_reformatting[Python] [discrete] -[[ecs-application-logs-ingest-logs]] +[[observability-ecs-application-logs-ingest-logs]] === Ingest logs After enabling log ECS reformatting, send your application logs to your project using one of the following shipping tools: -* <<ecs-application-logs-ingest-logs-with-filebeat,**{filebeat}:**>> A lightweight data shipper that sends log data to your project. -* <<ecs-application-logs-ingest-logs-with-agent,**{agent}:**>> A single agent for logs, metrics, security data, and threat prevention. With Fleet, you can centrally manage {agent} policies and lifecycles directly from your project. +* <<observability-ecs-application-logs-ingest-logs-with-filebeat,**{filebeat}:**>> A lightweight data shipper that sends log data to your project. +* <<observability-ecs-application-logs-ingest-logs-with-agent,**{agent}:**>> A single agent for logs, metrics, security data, and threat prevention. With Fleet, you can centrally manage {agent} policies and lifecycles directly from your project. [discrete] -[[ecs-application-logs-ingest-logs-with-filebeat]] +[[observability-ecs-application-logs-ingest-logs-with-filebeat]] === Ingest logs with {filebeat} [IMPORTANT] @@ -78,7 +78,7 @@ Use {filebeat} version 8.11+ for the best experience when ingesting logs with {f Follow these steps to ingest application logs with {filebeat}. [discrete] -[[ecs-application-logs-step-1-install-filebeat]] +[[observability-ecs-application-logs-step-1-install-filebeat]] ==== Step 1: Install {filebeat} Install {filebeat} on the server you want to monitor by running the commands that align with your system: @@ -86,7 +86,7 @@ Install {filebeat} on the server you want to monitor by running the commands tha include::../transclusion/observability/tab-widgets/filebeat-install/widget.asciidoc[] [discrete] -[[ecs-application-logs-step-2-connect-to-your-project]] +[[observability-ecs-application-logs-step-2-connect-to-your-project]] ==== Step 2: Connect to your project Connect to your project using an API key to set up {filebeat}. Set the following information in the `filebeat.yml` file: @@ -123,7 +123,7 @@ POST /_security/api_key Refer to {filebeat-ref}/beats-api-keys.html[Grant access using API keys] for more information. [discrete] -[[ecs-application-logs-step-3-configure-filebeat]] +[[observability-ecs-application-logs-step-3-configure-filebeat]] ==== Step 3: Configure {filebeat} Add the following configuration to your `filebeat.yaml` file to start collecting log data. @@ -133,7 +133,7 @@ include::../transclusion/observability/tab-widgets/filebeat-logs/widget.asciidoc :ecs_logs!: [discrete] -[[ecs-application-logs-step-4-set-up-and-start-filebeat]] +[[observability-ecs-application-logs-step-4-set-up-and-start-filebeat]] ==== Step 4: Set up and start {filebeat} From the {filebeat} installation directory, set the {ref}/index-templates.html[index template] by running the command that aligns with your system: @@ -145,13 +145,13 @@ From the {filebeat} installation directory, start filebeat by running the comman include::../transclusion/observability/tab-widgets/filebeat-start/widget.asciidoc[] [discrete] -[[ecs-application-logs-ingest-logs-with-agent]] +[[observability-ecs-application-logs-ingest-logs-with-agent]] === Ingest logs with {agent} Add the custom logs integration to ingest and centrally manage your logs using {agent} and {fleet}: [discrete] -[[ecs-application-logs-step-1-add-the-custom-logs-integration-to-your-project]] +[[observability-ecs-application-logs-step-1-add-the-custom-logs-integration-to-your-project]] ==== Step 1: Add the custom logs integration to your project To add the custom logs integration to your project: @@ -202,12 +202,12 @@ fields: + <5> When set to `true`, custom fields are stored as top-level fields in the output document instead of being grouped under a fields sub-dictionary. + -<6> The `service.name` (required), `service.version` (optional), and `service.environment` (optional) of the service you're collecting logs from, used for <<correlate-application-logs-log-correlation,Log correlation>>. +<6> The `service.name` (required), `service.version` (optional), and `service.environment` (optional) of the service you're collecting logs from, used for <<observability-correlate-application-logs-log-correlation,Log correlation>>. . An agent policy is created that defines the data your {agent} collects. If you've previously installed an {agent} on the host you're collecting logs from, you can select the **Existing hosts** tab and use an existing agent policy. . Click **Save and continue**. [discrete] -[[ecs-application-logs-view-logs]] +[[observability-ecs-application-logs-view-logs]] == View logs -Use <<discover-and-explore-logs,Logs Explorer>> to search, filter, and visualize your logs. Refer to the <<filter-and-aggregate-logs,filter and aggregate logs>> documentation for more information. +Use <<observability-discover-and-explore-logs,Logs Explorer>> to search, filter, and visualize your logs. Refer to the <<observability-filter-and-aggregate-logs,filter and aggregate logs>> documentation for more information. diff --git a/docs/en/serverless/logging/filter-and-aggregate-logs.asciidoc b/docs/en/serverless/logging/filter-and-aggregate-logs.asciidoc index 589d1c7e23..0eec3c4553 100644 --- a/docs/en/serverless/logging/filter-and-aggregate-logs.asciidoc +++ b/docs/en/serverless/logging/filter-and-aggregate-logs.asciidoc @@ -1,4 +1,4 @@ -[[filter-and-aggregate-logs]] +[[observability-filter-and-aggregate-logs]] = Filter and aggregate logs :keywords: serverless, observability, how-to @@ -23,7 +23,7 @@ include::../partials/roles.asciidoc[] :goal!: -The examples on this page use the following ingest pipeline and index template, which you can set in **Developer Tools**. If you haven't used ingest pipelines and index templates to parse your log data and extract structured fields yet, start with the <<parse-log-data,Parse and organize logs>> documentation. +The examples on this page use the following ingest pipeline and index template, which you can set in **Developer Tools**. If you haven't used ingest pipelines and index templates to parse your log data and extract structured fields yet, start with the <<observability-parse-log-data,Parse and organize logs>> documentation. Set the ingest pipeline with the following command: diff --git a/docs/en/serverless/logging/get-started-with-logs.asciidoc b/docs/en/serverless/logging/get-started-with-logs.asciidoc index 1baf316f96..a857cca2cf 100644 --- a/docs/en/serverless/logging/get-started-with-logs.asciidoc +++ b/docs/en/serverless/logging/get-started-with-logs.asciidoc @@ -1,4 +1,4 @@ -[[get-started-with-logs]] +[[observability-get-started-with-logs]] = Get started with system logs :description: Learn how to onboard your system log data quickly. @@ -18,7 +18,7 @@ then observe the data in **Logs Explorer**. To onboard system log data: -. <<create-an-observability-project,Create a new {observability} project>>, or open an existing one. +. <<observability-create-an-observability-project,Create a new {observability} project>>, or open an existing one. . In your {observability} project, go to **Add data**. . Under **Collect and analyze logs**, click **Stream host system logs**. When the page loads, the system integration is installed automatically, and a new API key is created. @@ -37,13 +37,13 @@ and perform other actions to explore your data. image::images/log-explorer-select-syslogs.png[Screen capture of the Logs Explorer showing syslog dataset selected] [discrete] -[[get-started-with-logs-next-steps]] +[[observability-get-started-with-logs-next-steps]] == Next steps Now that you've added system logs and explored your data, learn how to onboard other types of data: -* <<stream-log-files>> -* <<apm-get-started>> +* <<observability-stream-log-files>> +* <<observability-apm-get-started>> To onboard other types of data, select **Add Data** from the main menu. diff --git a/docs/en/serverless/logging/log-monitoring.asciidoc b/docs/en/serverless/logging/log-monitoring.asciidoc index a8c080d73e..7e028f715e 100644 --- a/docs/en/serverless/logging/log-monitoring.asciidoc +++ b/docs/en/serverless/logging/log-monitoring.asciidoc @@ -1,4 +1,4 @@ -[[log-monitoring]] +[[observability-log-monitoring]] = Log monitoring :description: Use Elastic to deploy and manage logs at a petabyte scale, and get insights from your logs in minutes. @@ -8,16 +8,16 @@ preview:[] Elastic Observability allows you to deploy and manage logs at a petabyte scale, giving you insights into your logs in minutes. You can also search across your logs in one place, troubleshoot in real time, and detect patterns and outliers with categorization and anomaly detection. For more information, refer to the following links: -* <<get-started-with-logs,Get started with system logs>>: Onboard system log data from a machine or server. -* <<stream-log-files,Stream any log file>>: Send log files to your Observability project using a standalone {agent}. -* <<parse-log-data,Parse and route logs>>: Parse your log data and extract structured fields that you can use to analyze your data. +* <<observability-get-started-with-logs,Get started with system logs>>: Onboard system log data from a machine or server. +* <<observability-stream-log-files,Stream any log file>>: Send log files to your Observability project using a standalone {agent}. +* <<observability-parse-log-data,Parse and route logs>>: Parse your log data and extract structured fields that you can use to analyze your data. * <<logs-filter,Filter and aggregate logs>>: Filter and aggregate your log data to find specific information, gain insight, and monitor your systems more efficiently. -* <<discover-and-explore-logs,Explore logs>>: Find information on visualizing and analyzing logs. -* <<run-log-pattern-analysis,Run pattern analysis on log data>>: Find patterns in unstructured log messages and make it easier to examine your data. -* <<troubleshoot-logs,Troubleshoot logs>>: Find solutions for errors you might encounter while onboarding your logs. +* <<observability-discover-and-explore-logs,Explore logs>>: Find information on visualizing and analyzing logs. +* <<observability-run-log-pattern-analysis,Run pattern analysis on log data>>: Find patterns in unstructured log messages and make it easier to examine your data. +* <<observability-troubleshoot-logs,Troubleshoot logs>>: Find solutions for errors you might encounter while onboarding your logs. [discrete] -[[log-monitoring-send-logs-data-to-your-project]] +[[observability-log-monitoring-send-logs-data-to-your-project]] == Send logs data to your project You can send logs data to your project in different ways depending on your needs: @@ -29,14 +29,14 @@ When choosing between {agent} and {filebeat}, consider the different features an See {fleet-guide}/beats-agent-comparison.html[{beats} and {agent} capabilities] for more information on which option best fits your situation. [discrete] -[[log-monitoring-agent]] +[[observability-log-monitoring-agent]] === {agent} {agent} uses https://www.elastic.co/integrations/data-integrations[integrations] to ingest logs from Kubernetes, MySQL, and many more data sources. You have the following options when installing and managing an {agent}: [discrete] -[[log-monitoring-fleet-managed-agent]] +[[observability-log-monitoring-fleet-managed-agent]] ==== {fleet}-managed {agent} Install an {agent} and use {fleet} to define, configure, and manage your agents in a central location. @@ -44,7 +44,7 @@ Install an {agent} and use {fleet} to define, configure, and manage your agents See {fleet-guide}/install-fleet-managed-elastic-agent.html[install {fleet}-managed {agent}]. [discrete] -[[log-monitoring-standalone-agent]] +[[observability-log-monitoring-standalone-agent]] ==== Standalone {agent} Install an {agent} and manually configure it locally on the system where it’s installed. @@ -53,7 +53,7 @@ You are responsible for managing and upgrading the agents. See {fleet-guide}/install-standalone-elastic-agent.html[install standalone {agent}]. [discrete] -[[log-monitoring-agent-in-a-containerized-environment]] +[[observability-log-monitoring-agent-in-a-containerized-environment]] ==== {agent} in a containerized environment Run an {agent} inside of a container — either with {fleet-server} or standalone. @@ -61,7 +61,7 @@ Run an {agent} inside of a container — either with {fleet-server} or standalon See {fleet-guide}/install-elastic-agents-in-containers.html[install {agent} in containers]. [discrete] -[[log-monitoring-filebeat]] +[[observability-log-monitoring-filebeat]] === {filebeat} {filebeat} is a lightweight shipper for forwarding and centralizing log data. @@ -72,7 +72,7 @@ Installed as a service on your servers, {filebeat} monitors the log files or loc * {filebeat-ref}/setting-up-and-running.html[Set up and run {filebeat}]: Information on how to install, set up, and run {filebeat}. [discrete] -[[log-monitoring-configure-logs]] +[[observability-log-monitoring-configure-logs]] == Configure logs The following resources provide information on configuring your logs: @@ -84,31 +84,31 @@ The following resources provide information on configuring your logs: * {ref}/mapping.html[Mapping]: Define how data is stored and indexed. [discrete] -[[log-monitoring-view-and-monitor-logs]] +[[observability-log-monitoring-view-and-monitor-logs]] == View and monitor logs Use **Logs Explorer** to search, filter, and tail all your logs ingested into your project in one place. The following resources provide information on viewing and monitoring your logs: -* <<discover-and-explore-logs,Discover and explore>>: Discover and explore all of the log events flowing in from your servers, virtual machines, and containers in a centralized view. -* <<aiops-detect-anomalies,Detect log anomalies>>: Use {ml} to detect log anomalies automatically. +* <<observability-discover-and-explore-logs,Discover and explore>>: Discover and explore all of the log events flowing in from your servers, virtual machines, and containers in a centralized view. +* <<observability-aiops-detect-anomalies,Detect log anomalies>>: Use {ml} to detect log anomalies automatically. [discrete] -[[log-monitoring-monitor-data-sets]] +[[observability-log-monitoring-monitor-data-sets]] == Monitor data sets The **Data Set Quality** page provides an overview of your data sets and their quality. Use this information to get an idea of your overall data set quality, and find data sets that contain incorrectly parsed documents. -<<monitor-datasets,Monitor data sets>> +<<observability-monitor-datasets,Monitor data sets>> [discrete] -[[log-monitoring-application-logs]] +[[observability-log-monitoring-application-logs]] == Application logs Application logs provide valuable insight into events that have occurred within your services and applications. -See <<correlate-application-logs,Application logs>>. +See <<observability-correlate-application-logs,Application logs>>. //// /* ## Create a logs threshold alert diff --git a/docs/en/serverless/logging/parse-log-data.asciidoc b/docs/en/serverless/logging/parse-log-data.asciidoc index 2614a3cbe5..a32d63d84c 100644 --- a/docs/en/serverless/logging/parse-log-data.asciidoc +++ b/docs/en/serverless/logging/parse-log-data.asciidoc @@ -1,4 +1,4 @@ -[[parse-log-data]] +[[observability-parse-log-data]] = Parse and route logs :keywords: serverless, observability, how-to @@ -18,11 +18,11 @@ After parsing, you can use the structured fields to further organize your logs b Refer to the following sections for more on parsing and organizing your log data: -* <<parse-log-data-extract-structured-fields,Extract structured fields>>: Extract structured fields like timestamps, log levels, or IP addresses to make querying and filtering your data easier. -* <<parse-log-data-reroute-log-data-to-specific-data-streams,Reroute log data to specific data streams>>: Route data from the generic data stream to a target data stream for more granular control over data retention, permissions, and processing. +* <<observability-parse-log-data-extract-structured-fields,Extract structured fields>>: Extract structured fields like timestamps, log levels, or IP addresses to make querying and filtering your data easier. +* <<observability-parse-log-data-reroute-log-data-to-specific-data-streams,Reroute log data to specific data streams>>: Route data from the generic data stream to a target data stream for more granular control over data retention, permissions, and processing. [discrete] -[[parse-log-data-extract-structured-fields]] +[[observability-parse-log-data-extract-structured-fields]] == Extract structured fields Make your logs more useful by extracting structured fields from your unstructured log data. Extracting structured fields makes it easier to search, analyze, and filter your log data. @@ -106,7 +106,7 @@ These fields are part of the {ecs-ref}/ecs-reference.html[Elastic Common Schema ==== [discrete] -[[parse-log-data-extract-the-timestamp-field]] +[[observability-parse-log-data-extract-the-timestamp-field]] === Extract the `@timestamp` field When you added the log to your project in the previous section, the `@timestamp` field showed when the log was added. The timestamp showing when the log actually occurred was in the unstructured `message` field: @@ -128,13 +128,13 @@ When you added the log to your project in the previous section, the `@timestamp` When looking into issues, you want to filter for logs by when the issue occurred not when the log was added to your project. To do this, extract the timestamp from the unstructured `message` field to the structured `@timestamp` field by completing the following: -. <<parse-log-data-use-an-ingest-pipeline-to-extract-the-timestamp-field,Use an ingest pipeline to extract the `@timestamp` field>> -. <<parse-log-data-test-the-pipeline-with-the-simulate-pipeline-api,Test the pipeline with the simulate pipeline API>> -. <<parse-log-data-configure-a-data-stream-with-an-index-template,Configure a data stream with an index template>> -. <<parse-log-data-create-a-data-stream,Create a data stream>> +. <<observability-parse-log-data-use-an-ingest-pipeline-to-extract-the-timestamp-field,Use an ingest pipeline to extract the `@timestamp` field>> +. <<observability-parse-log-data-test-the-pipeline-with-the-simulate-pipeline-api,Test the pipeline with the simulate pipeline API>> +. <<observability-parse-log-data-configure-a-data-stream-with-an-index-template,Configure a data stream with an index template>> +. <<observability-parse-log-data-create-a-data-stream,Create a data stream>> [discrete] -[[parse-log-data-use-an-ingest-pipeline-to-extract-the-timestamp-field]] +[[observability-parse-log-data-use-an-ingest-pipeline-to-extract-the-timestamp-field]] ==== Use an ingest pipeline to extract the `@timestamp` field Ingest pipelines consist of a series of processors that perform common transformations on incoming documents before they are indexed. @@ -170,7 +170,7 @@ The previous command sets the following values for your ingest pipeline: * `pattern`: The pattern of the elements in your log data. The `%{@timestamp} %{message}` pattern extracts the timestamp, `2023-08-08T13:45:12.123Z`, to the `@timestamp` field, while the rest of the message, `WARN 192.168.1.101 Disk usage exceeds 90%.`, stays in the `message` field. The dissect processor looks for the space as a separator defined by the pattern. [discrete] -[[parse-log-data-test-the-pipeline-with-the-simulate-pipeline-api]] +[[observability-parse-log-data-test-the-pipeline-with-the-simulate-pipeline-api]] ==== Test the pipeline with the simulate pipeline API The {ref}/simulate-pipeline-api.html#ingest-verbose-param[simulate pipeline API] runs the ingest pipeline without storing any documents. @@ -220,7 +220,7 @@ Make sure you've created the ingest pipeline using the `PUT` command in the prev ==== [discrete] -[[parse-log-data-configure-a-data-stream-with-an-index-template]] +[[observability-parse-log-data-configure-a-data-stream-with-an-index-template]] ==== Configure a data stream with an index template After creating your ingest pipeline, run the following command to create an index template to configure your data stream's backing indices: @@ -267,7 +267,7 @@ The example index template above sets the following component templates: ** `ecs@mappings`: dynamic templates that automatically ensure your data stream mappings comply with the {ecs-ref}/ecs-reference.html[Elastic Common Schema (ECS)]. [discrete] -[[parse-log-data-create-a-data-stream]] +[[observability-parse-log-data-create-a-data-stream]] ==== Create a data stream Create your data stream using the {fleet-guide}/data-streams.html#data-streams-naming-scheme[data stream naming scheme]. Name your data stream to match the name of your ingest pipeline, `logs-example-default` in this case. Post the example log to your data stream with this command: @@ -318,7 +318,7 @@ You should see the pipeline has extracted the `@timestamp` field: You can now use the `@timestamp` field to sort your logs by the date and time they happened. [discrete] -[[parse-log-data-troubleshoot-the-timestamp-field]] +[[observability-parse-log-data-troubleshoot-the-timestamp-field]] ==== Troubleshoot the `@timestamp` field Check the following common issues and solutions with timestamps: @@ -328,7 +328,7 @@ Check the following common issues and solutions with timestamps: * **Incorrect timestamp format:** Your timestamp can be a Java time pattern or one of the following formats: ISO8601, UNIX, UNIX_MS, or TAI64N. For more information on timestamp formats, refer to the {ref}/mapping-date-format.html[mapping date format]. [discrete] -[[parse-log-data-extract-the-loglevel-field]] +[[observability-parse-log-data-extract-the-loglevel-field]] === Extract the `log.level` field Extracting the `log.level` field lets you filter by severity and focus on critical issues. This section shows you how to extract the `log.level` field from this example log: @@ -340,15 +340,15 @@ Extracting the `log.level` field lets you filter by severity and focus on critic To extract and use the `log.level` field: -. <<parse-log-data-add-loglevel-to-your-ingest-pipeline,Add the `log.level` field to the dissect processor pattern in your ingest pipeline.>> -. <<parse-log-data-test-the-pipeline-with-the-simulate-api,Test the pipeline with the simulate API.>> -. <<parse-log-data-query-logs-based-on-loglevel,Query your logs based on the `log.level` field.>> +. <<observability-parse-log-data-add-loglevel-to-your-ingest-pipeline,Add the `log.level` field to the dissect processor pattern in your ingest pipeline.>> +. <<observability-parse-log-data-test-the-pipeline-with-the-simulate-api,Test the pipeline with the simulate API.>> +. <<observability-parse-log-data-query-logs-based-on-loglevel,Query your logs based on the `log.level` field.>> [discrete] -[[parse-log-data-add-loglevel-to-your-ingest-pipeline]] +[[observability-parse-log-data-add-loglevel-to-your-ingest-pipeline]] ==== Add `log.level` to your ingest pipeline -Add the `%{log.level}` option to the dissect processor pattern in the ingest pipeline you created in the <<parse-log-data-use-an-ingest-pipeline-to-extract-the-timestamp-field,Extract the `@timestamp` field>> section with this command: +Add the `%{log.level}` option to the dissect processor pattern in the ingest pipeline you created in the <<observability-parse-log-data-use-an-ingest-pipeline-to-extract-the-timestamp-field,Extract the `@timestamp` field>> section with this command: [source,console] ---- @@ -372,10 +372,10 @@ Now your pipeline will extract these fields: * The `log.level` field: `WARN` * The `message` field: `192.168.1.101 Disk usage exceeds 90%.` -In addition to setting an ingest pipeline, you need to set an index template. Use the index template created in the <<parse-log-data-configure-a-data-stream-with-an-index-template,Extract the `@timestamp` field>> section. +In addition to setting an ingest pipeline, you need to set an index template. Use the index template created in the <<observability-parse-log-data-configure-a-data-stream-with-an-index-template,Extract the `@timestamp` field>> section. [discrete] -[[parse-log-data-test-the-pipeline-with-the-simulate-api]] +[[observability-parse-log-data-test-the-pipeline-with-the-simulate-api]] ==== Test the pipeline with the simulate API Test that your ingest pipeline works as expected with the {ref}/simulate-pipeline-api.html#ingest-verbose-param[simulate pipeline API]: @@ -420,7 +420,7 @@ The results should show the `@timestamp` and the `log.level` fields extracted fr ---- [discrete] -[[parse-log-data-query-logs-based-on-loglevel]] +[[observability-parse-log-data-query-logs-based-on-loglevel]] ==== Query logs based on `log.level` Once you've extracted the `log.level` field, you can query for high-severity logs like `WARN` and `ERROR`, which may need immediate attention, and filter out less critical `INFO` and `DEBUG` logs. @@ -504,7 +504,7 @@ The results should show only the high-severity logs: ---- [discrete] -[[parse-log-data-extract-the-hostip-field]] +[[observability-parse-log-data-extract-the-hostip-field]] === Extract the `host.ip` field Extracting the `host.ip` field lets you filter logs by host IP addresses allowing you to focus on specific hosts that you're having issues with or find disparities between hosts. @@ -523,15 +523,15 @@ This section shows you how to extract the `host.ip` field from the following exa To extract and use the `host.ip` field: -. <<parse-log-data-add-hostip-to-your-ingest-pipeline,Add the `host.ip` field to your dissect processor in your ingest pipeline.>> -. <<parse-log-data-test-the-pipeline-with-the-simulate-api,Test the pipeline with the simulate API.>> -. <<parse-log-data-query-logs-based-on-hostip,Query your logs based on the `host.ip` field.>> +. <<observability-parse-log-data-add-hostip-to-your-ingest-pipeline,Add the `host.ip` field to your dissect processor in your ingest pipeline.>> +. <<observability-parse-log-data-test-the-pipeline-with-the-simulate-api,Test the pipeline with the simulate API.>> +. <<observability-parse-log-data-query-logs-based-on-hostip,Query your logs based on the `host.ip` field.>> [discrete] -[[parse-log-data-add-hostip-to-your-ingest-pipeline]] +[[observability-parse-log-data-add-hostip-to-your-ingest-pipeline]] ==== Add `host.ip` to your ingest pipeline -Add the `%{host.ip}` option to the dissect processor pattern in the ingest pipeline you created in the <<parse-log-data-use-an-ingest-pipeline-to-extract-the-timestamp-field,Extract the `@timestamp` field>> section: +Add the `%{host.ip}` option to the dissect processor pattern in the ingest pipeline you created in the <<observability-parse-log-data-use-an-ingest-pipeline-to-extract-the-timestamp-field,Extract the `@timestamp` field>> section: [source,console] ---- @@ -556,10 +556,10 @@ Your pipeline will extract these fields: * The `host.ip` field: `192.168.1.101` * The `message` field: `Disk usage exceeds 90%.` -In addition to setting an ingest pipeline, you need to set an index template. Use the index template created in the <<parse-log-data-configure-a-data-stream-with-an-index-template,Extract the `@timestamp` field>> section. +In addition to setting an ingest pipeline, you need to set an index template. Use the index template created in the <<observability-parse-log-data-configure-a-data-stream-with-an-index-template,Extract the `@timestamp` field>> section. [discrete] -[[parse-log-data-test-the-pipeline-with-the-simulate-api-1]] +[[observability-parse-log-data-test-the-pipeline-with-the-simulate-api-1]] ==== Test the pipeline with the simulate API Test that your ingest pipeline works as expected with the {ref}/simulate-pipeline-api.html#ingest-verbose-param[simulate pipeline API]: @@ -605,7 +605,7 @@ The results should show the `host.ip`, `@timestamp`, and `log.level` fields extr ---- [discrete] -[[parse-log-data-query-logs-based-on-hostip]] +[[observability-parse-log-data-query-logs-based-on-hostip]] ==== Query logs based on `host.ip` You can query your logs based on the `host.ip` field in different ways, including using CIDR notation and range queries. @@ -626,7 +626,7 @@ POST logs-example-default/_bulk ---- [discrete] -[[parse-log-data-cidr-notation]] +[[observability-parse-log-data-cidr-notation]] ===== CIDR notation You can use https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#CIDR_notation[CIDR notation] to query your log data using a block of IP addresses that fall within a certain network segment. CIDR notations uses the format of `[IP address]/[prefix length]`. The following command queries IP addresses in the `192.168.1.0/24` subnet meaning IP addresses from `192.168.1.0` to `192.168.1.255`. @@ -718,7 +718,7 @@ Because all of the example logs are in this range, you'll get the following resu ---- [discrete] -[[parse-log-data-range-queries]] +[[observability-parse-log-data-range-queries]] ===== Range queries Use {ref}/query-dsl-range-query.html[range queries] to query logs in a specific range. @@ -789,7 +789,7 @@ You'll get the following results only showing logs in the range you've set: ---- [discrete] -[[parse-log-data-reroute-log-data-to-specific-data-streams]] +[[observability-parse-log-data-reroute-log-data-to-specific-data-streams]] == Reroute log data to specific data streams By default, an ingest pipeline sends your log data to a single data stream. To simplify log data management, use a {ref}/reroute-processor.html[reroute processor] to route data from the generic data stream to a target data stream. For example, you might want to send high-severity logs to a specific data stream to help with categorization. @@ -811,12 +811,12 @@ When routing data to different data streams, we recommend picking a field with a To use a reroute processor: -. <<parse-log-data-add-a-reroute-processor-to-the-ingest-pipeline,Add a reroute processor to your ingest pipeline.>> -. <<parse-log-data-add-logs-to-a-data-stream,Add the example logs to your data stream.>> -. <<parse-log-data-verify-the-reroute-processor-worked,Query your logs and verify the high-severity logs were routed to the new data stream.>> +. <<observability-parse-log-data-add-a-reroute-processor-to-the-ingest-pipeline,Add a reroute processor to your ingest pipeline.>> +. <<observability-parse-log-data-add-logs-to-a-data-stream,Add the example logs to your data stream.>> +. <<observability-parse-log-data-verify-the-reroute-processor-worked,Query your logs and verify the high-severity logs were routed to the new data stream.>> [discrete] -[[parse-log-data-add-a-reroute-processor-to-the-ingest-pipeline]] +[[observability-parse-log-data-add-a-reroute-processor-to-the-ingest-pipeline]] === Add a reroute processor to the ingest pipeline Add a reroute processor to your ingest pipeline with the following command: @@ -850,10 +850,10 @@ The previous command sets the following values for your reroute processor: * `if`: Conditionally runs the processor. In the example, `"ctx.log?.level == 'WARN' || ctx.log?.level == 'ERROR'",` means the processor runs when the `log.level` field is `WARN` or `ERROR`. * `dataset`: the data stream dataset to route your document to if the previous condition is `true`. In the example, logs with a `log.level` of `WARN` or `ERROR` are routed to the `logs-critical-default` data stream. -In addition to setting an ingest pipeline, you need to set an index template. Use the index template created in the <<parse-log-data-configure-a-data-stream-with-an-index-template,Extract the `@timestamp` field>> section. +In addition to setting an ingest pipeline, you need to set an index template. Use the index template created in the <<observability-parse-log-data-configure-a-data-stream-with-an-index-template,Extract the `@timestamp` field>> section. [discrete] -[[parse-log-data-add-logs-to-a-data-stream]] +[[observability-parse-log-data-add-logs-to-a-data-stream]] === Add logs to a data stream Add the example logs to your data stream with this command: @@ -872,7 +872,7 @@ POST logs-example-default/_bulk ---- [discrete] -[[parse-log-data-verify-the-reroute-processor-worked]] +[[observability-parse-log-data-verify-the-reroute-processor-worked]] === Verify the reroute processor worked The reroute processor should route any logs with a `log.level` of `WARN` or `ERROR` to the `logs-critical-default` data stream. Query the data stream using the following command to verify the log data was routed as intended: diff --git a/docs/en/serverless/logging/plaintext-application-logs.asciidoc b/docs/en/serverless/logging/plaintext-application-logs.asciidoc index eca726c5d2..b61e0df580 100644 --- a/docs/en/serverless/logging/plaintext-application-logs.asciidoc +++ b/docs/en/serverless/logging/plaintext-application-logs.asciidoc @@ -1,4 +1,4 @@ -[[plaintext-application-logs]] +[[observability-plaintext-application-logs]] = Plaintext application logs :description: Parse and ingest raw, plain-text application logs using a log shipper like Filebeat. @@ -11,25 +11,25 @@ Ingest and parse plaintext logs, including existing logs, from any programming l Plaintext logs require some additional setup that structured logs do not require: * To search, filter, and aggregate effectively, you need to parse plaintext logs using an ingest pipeline to extract structured fields. Parsing is based on log format, so you might have to maintain different settings for different applications. -* To <<plaintext-application-logs-correlate-logs,correlate plaintext logs>>, you need to inject IDs into log messages and parse them using an ingest pipeline. +* To <<observability-plaintext-application-logs-correlate-logs,correlate plaintext logs>>, you need to inject IDs into log messages and parse them using an ingest pipeline. To ingest, parse, and correlate plaintext logs: -. Ingest plaintext logs with <<plaintext-application-logs-ingest-logs-with-filebeat,{filebeat}>> or <<plaintext-application-logs-ingest-logs-with-agent,{agent}>> and parse them before indexing with an ingest pipeline. -. <<plaintext-application-logs-correlate-logs,Correlate plaintext logs with an {apm-agent}.>> -. <<plaintext-application-logs-view-logs,View logs in Logs Explorer>> +. Ingest plaintext logs with <<observability-plaintext-application-logs-ingest-logs-with-filebeat,{filebeat}>> or <<observability-plaintext-application-logs-ingest-logs-with-agent,{agent}>> and parse them before indexing with an ingest pipeline. +. <<observability-plaintext-application-logs-correlate-logs,Correlate plaintext logs with an {apm-agent}.>> +. <<observability-plaintext-application-logs-view-logs,View logs in Logs Explorer>> [discrete] -[[plaintext-application-logs-ingest-logs]] +[[observability-plaintext-application-logs-ingest-logs]] == Ingest logs Send application logs to your project using one of the following shipping tools: -* <<plaintext-application-logs-ingest-logs-with-filebeat,**{filebeat}:**>> A lightweight data shipper that sends log data to your project. -* <<plaintext-application-logs-ingest-logs-with-agent,**{agent}:**>> A single agent for logs, metrics, security data, and threat prevention. With Fleet, you can centrally manage {agent} policies and lifecycles directly from your project. +* <<observability-plaintext-application-logs-ingest-logs-with-filebeat,**{filebeat}:**>> A lightweight data shipper that sends log data to your project. +* <<observability-plaintext-application-logs-ingest-logs-with-agent,**{agent}:**>> A single agent for logs, metrics, security data, and threat prevention. With Fleet, you can centrally manage {agent} policies and lifecycles directly from your project. [discrete] -[[plaintext-application-logs-ingest-logs-with-filebeat]] +[[observability-plaintext-application-logs-ingest-logs-with-filebeat]] === Ingest logs with {filebeat} [IMPORTANT] @@ -40,7 +40,7 @@ Use {filebeat} version 8.11+ for the best experience when ingesting logs with {f Follow these steps to ingest application logs with {filebeat}. [discrete] -[[plaintext-application-logs-step-1-install-filebeat]] +[[observability-plaintext-application-logs-step-1-install-filebeat]] ==== Step 1: Install {filebeat} Install {filebeat} on the server you want to monitor by running the commands that align with your system: @@ -48,7 +48,7 @@ Install {filebeat} on the server you want to monitor by running the commands tha include::../transclusion/observability/tab-widgets/filebeat-install/widget.asciidoc[] [discrete] -[[plaintext-application-logs-step-2-connect-to-your-project]] +[[observability-plaintext-application-logs-step-2-connect-to-your-project]] ==== Step 2: Connect to your project Connect to your project using an API key to set up {filebeat}. Set the following information in the `filebeat.yml` file: @@ -85,7 +85,7 @@ POST /_security/api_key Refer to {filebeat-ref}/beats-api-keys.html[Grant access using API keys] for more information. [discrete] -[[plaintext-application-logs-step-3-configure-filebeat]] +[[observability-plaintext-application-logs-step-3-configure-filebeat]] ==== Step 3: Configure {filebeat} Add the following configuration to the `filebeat.yaml` file to start collecting log data. @@ -120,7 +120,7 @@ You can add additional settings to the `filebeat.yml` file to meet the needs of ---- [discrete] -[[plaintext-application-logs-step-4-set-up-and-start-filebeat]] +[[observability-plaintext-application-logs-step-4-set-up-and-start-filebeat]] ==== Step 4: Set up and start {filebeat} From the {filebeat} installation directory, set the {ref}/index-templates.html[index template] by running the command that aligns with your system: @@ -132,7 +132,7 @@ from the {filebeat} installation directory, start filebeat by running the comman include::../transclusion/observability/tab-widgets/filebeat-start/widget.asciidoc[] [discrete] -[[plaintext-application-logs-step-5-parse-logs-with-an-ingest-pipeline]] +[[observability-plaintext-application-logs-step-5-parse-logs-with-an-ingest-pipeline]] ==== Step 5: Parse logs with an ingest pipeline Use an ingest pipeline to parse the contents of your logs into structured, {ecs-ref}/ecs-reference.html[Elastic Common Schema (ECS)]-compatible fields. @@ -163,7 +163,7 @@ PUT _ingest/pipeline/filebeat* <1> <4> `pattern`: The pattern of the elements in your log data. The pattern varies depending on your log format. `%{@timestamp}`, `%{log.level}`, `%{host.ip}`, and `%{message}` are common {ecs-ref}/ecs-reference.html[ECS] fields. This pattern would match a log file in this format: `2023-11-07T09:39:01.012Z ERROR 192.168.1.110 Server hardware failure detected.` -Refer to <<parse-log-data-extract-structured-fields,Extract structured fields>> for more on using ingest pipelines to parse your log data. +Refer to <<observability-parse-log-data-extract-structured-fields,Extract structured fields>> for more on using ingest pipelines to parse your log data. After creating your pipeline, specify the pipeline for filebeat in the `filebeat.yml` file: @@ -178,13 +178,13 @@ output.elasticsearch: <1> Add the pipeline output and the name of your pipeline to the output. [discrete] -[[plaintext-application-logs-ingest-logs-with-agent]] +[[observability-plaintext-application-logs-ingest-logs-with-agent]] === Ingest logs with {agent} Follow these steps to ingest and centrally manage your logs using {agent} and {fleet}. [discrete] -[[plaintext-application-logs-step-1-add-the-custom-logs-integration-to-your-project]] +[[observability-plaintext-application-logs-step-1-add-the-custom-logs-integration-to-your-project]] ==== Step 1: Add the custom logs integration to your project To add the custom logs integration to your project: @@ -199,7 +199,7 @@ To add the custom logs integration to your project: . An agent policy is created that defines the data your {agent} collects. If you've previously installed an {agent} on the host you're collecting logs from, you can select the **Existing hosts** tab and use an existing agent policy. . Click **Save and continue**. -You can add additional settings to the integration under **Custom log file** by clicking **Advanced options** and adding YAML configurations to the **Custom configurations**. For example, the following settings would add a parser to manage messages that span multiple lines and add service fields. Service fields are used for <<correlate-application-logs-log-correlation,Log correlation>>. +You can add additional settings to the integration under **Custom log file** by clicking **Advanced options** and adding YAML configurations to the **Custom configurations**. For example, the following settings would add a parser to manage messages that span multiple lines and add service fields. Service fields are used for <<observability-correlate-application-logs-log-correlation,Log correlation>>. [source,yaml] ---- @@ -216,10 +216,10 @@ You can add additional settings to the integration under **Custom log file** by service.environment: your_service_environment <1> ---- -<1> for <<correlate-application-logs-log-correlation,Log correlation>>, add the `service.name` (required), `service.version` (optional), and `service.environment` (optional) of the service you're collecting logs from. +<1> for <<observability-correlate-application-logs-log-correlation,Log correlation>>, add the `service.name` (required), `service.version` (optional), and `service.environment` (optional) of the service you're collecting logs from. [discrete] -[[plaintext-application-logs-step-2-add-an-ingest-pipeline-to-your-integration]] +[[observability-plaintext-application-logs-step-2-add-an-ingest-pipeline-to-your-integration]] ==== Step 2: Add an ingest pipeline to your integration To aggregate or search for information in plaintext logs, use an ingest pipeline with your integration to parse the contents of your logs into structured, {ecs-ref}/ecs-reference.html[Elastic Common Schema (ECS)]-compatible fields. @@ -256,7 +256,7 @@ Click **Import processors** and add a similar JSON to the following example: . Save and deploy your integration. [discrete] -[[plaintext-application-logs-correlate-logs]] +[[observability-plaintext-application-logs-correlate-logs]] == Correlate logs Correlate your application logs with trace events to: @@ -280,9 +280,9 @@ Learn about correlating plaintext logs in the agent-specific ingestion guides: * {apm-ruby-ref}/log-correlation.html[Ruby] [discrete] -[[plaintext-application-logs-view-logs]] +[[observability-plaintext-application-logs-view-logs]] == View logs To view logs ingested by {filebeat}, go to **Discover**. Create a data view based on the `filebeat-*` index pattern. Refer to {kibana-ref}/data-views.html[Create a data view] for more information. -To view logs ingested by {agent}, go to **Discover** and select the <<discover-and-explore-logs,**Logs Explorer**>> tab. Refer to the <<filter-and-aggregate-logs,Filter and aggregate logs>> documentation for more on viewing and filtering your log data. +To view logs ingested by {agent}, go to **Discover** and select the <<observability-discover-and-explore-logs,**Logs Explorer**>> tab. Refer to the <<observability-filter-and-aggregate-logs,Filter and aggregate logs>> documentation for more on viewing and filtering your log data. diff --git a/docs/en/serverless/logging/run-log-pattern-analysis.asciidoc b/docs/en/serverless/logging/run-log-pattern-analysis.asciidoc index 351090b298..6caeb4500b 100644 --- a/docs/en/serverless/logging/run-log-pattern-analysis.asciidoc +++ b/docs/en/serverless/logging/run-log-pattern-analysis.asciidoc @@ -1,4 +1,4 @@ -[[run-log-pattern-analysis]] +[[observability-run-log-pattern-analysis]] = Run a pattern analysis on log data :description: Find patterns in unstructured log messages. diff --git a/docs/en/serverless/logging/send-application-logs.asciidoc b/docs/en/serverless/logging/send-application-logs.asciidoc index 329163ae8f..9ae9a7804c 100644 --- a/docs/en/serverless/logging/send-application-logs.asciidoc +++ b/docs/en/serverless/logging/send-application-logs.asciidoc @@ -1,4 +1,4 @@ -[[send-application-logs]] +[[observability-send-application-logs]] = {apm-agent} log sending :description: Use the Java {apm-agent} to capture and send logs. @@ -9,7 +9,7 @@ preview:[] include::../transclusion/observability/application-logs/apm-agent-log-sending.asciidoc[] [discrete] -[[send-application-logs-get-started]] +[[observability-send-application-logs-get-started]] == Get started See the {apm-java-ref}/logs.html#log-sending[Java agent] documentation to get started. diff --git a/docs/en/serverless/logging/stream-log-files.asciidoc b/docs/en/serverless/logging/stream-log-files.asciidoc index eb2d1f2f21..2717fc979f 100644 --- a/docs/en/serverless/logging/stream-log-files.asciidoc +++ b/docs/en/serverless/logging/stream-log-files.asciidoc @@ -1,4 +1,4 @@ -[[stream-log-files]] +[[observability-stream-log-files]] = Stream any log file :description: Send a log file to your Observability project using the standalone {agent}. @@ -30,7 +30,7 @@ This guide shows you how to send a log file to your Observability project using The quickest way to get started is to: -. Open your Observability project. If you don't have one, <<create-an-observability-project,create an observability project>>. +. Open your Observability project. If you don't have one, <<observability-create-an-observability-project,create an observability project>>. . Go to **Add Data**. . Under **Collect and analyze logs**, click **Stream log files**. @@ -39,7 +39,7 @@ This will kick off a set of guided instructions that walk you through configurin To install and configure the {agent} manually, refer to <<manually-install-agent-logs,Manually install and configure the standalone {agent}>>. [discrete] -[[stream-log-files-configure-inputs-and-integration]] +[[observability-stream-log-files-configure-inputs-and-integration]] == Configure inputs and integration Enter a few configuration details in the guided instructions. @@ -85,7 +85,7 @@ The value must be all lowercase and max 100 chars. Special characters will be re This will be passed to the `data_stream.dataset` field in the generated `elastic-agent.yml` file in a future step. [discrete] -[[stream-log-files-install-the-agent]] +[[observability-stream-log-files-install-the-agent]] == Install the {agent} After configuring the inputs and integration, you'll continue in the guided instructions to @@ -96,7 +96,7 @@ Turning on **Automatically download the agent's config** includes your updated { If you do not want to automatically download the configuration, click **Download config file** to download it manually and add it to `/opt/Elastic/Agent/elastic-agent.yml` on the host where you installed the {agent}. -The values you provided in <<stream-log-files-configure-inputs-and-integration,Configure inputs and integration>> will be prepopulated in the generated configuration file. +The values you provided in <<observability-stream-log-files-configure-inputs-and-integration,Configure inputs and integration>> will be prepopulated in the generated configuration file. [discrete] [[manually-install-agent-logs]] @@ -105,7 +105,7 @@ The values you provided in <<stream-log-files-configure-inputs-and-integration,C If you're not using the guided instructions, follow these steps to manually install and configure your the {agent}. [discrete] -[[stream-log-files-step-1-download-and-extract-the-agent-installation-package]] +[[observability-stream-log-files-step-1-download-and-extract-the-agent-installation-package]] === Step 1: Download and extract the {agent} installation package On your host, download and extract the installation package that corresponds with your system: @@ -113,7 +113,7 @@ On your host, download and extract the installation package that corresponds wit include::../transclusion/fleet/tab-widgets/download-widget.asciidoc[] [discrete] -[[stream-log-files-step-2-install-and-start-the-agent]] +[[observability-stream-log-files-step-2-install-and-start-the-agent]] === Step 2: Install and start the {agent} After downloading and extracting the installation package, you're ready to install the {agent}. @@ -135,13 +135,13 @@ During installation, you'll be prompted with some questions: . When asked if you want to enroll the agent in Fleet, enter `n`. [discrete] -[[stream-log-files-step-3-configure-the-agent]] +[[observability-stream-log-files-step-3-configure-the-agent]] === Step 3: Configure the {agent} After your agent is installed, configure it by updating the `elastic-agent.yml` file. [discrete] -[[stream-log-files-locate-your-configuration-file]] +[[observability-stream-log-files-locate-your-configuration-file]] ==== Locate your configuration file You'll find the `elastic-agent.yml` in one of the following locations according to your system: @@ -149,7 +149,7 @@ You'll find the `elastic-agent.yml` in one of the following locations according include::../transclusion/observability/tab-widgets/logs/agent-location/widget.asciidoc[] [discrete] -[[stream-log-files-update-your-configuration-file]] +[[observability-stream-log-files-update-your-configuration-file]] ==== Update your configuration file Update the default configuration in the `elastic-agent.yml` file manually. @@ -247,23 +247,23 @@ image::images/logs-stream-logs-api-key-beats.png[] a| A unique identifier for your stream of log data. If you're following the guided instructions in your project, this will be prepopulated with -the value you specified in <<stream-log-files-configure-inputs-and-integration,Configure inputs and integration>>. +the value you specified in <<observability-stream-log-files-configure-inputs-and-integration,Configure inputs and integration>>. | `data_stream.dataset` a| The name for your dataset data stream. Name this data stream anything that signifies the source of the data. In this configuration, the dataset is set to `example`. The default value is `generic`. If you're following the guided instructions in your project, this will be prepopulated with -the value you specified in <<stream-log-files-configure-inputs-and-integration,Configure inputs and integration>>. +the value you specified in <<observability-stream-log-files-configure-inputs-and-integration,Configure inputs and integration>>. | `paths` a| The path to your log files. You can also use a pattern like `/var/log/your-logs.log*`. If you're following the guided instructions in your project, this will be prepopulated with -the value you specified in <<stream-log-files-configure-inputs-and-integration,Configure inputs and integration>>. +the value you specified in <<observability-stream-log-files-configure-inputs-and-integration,Configure inputs and integration>>. |=== [discrete] -[[stream-log-files-restart-the-agent]] +[[observability-stream-log-files-restart-the-agent]] ==== Restart the {agent} After updating your configuration file, you need to restart the {agent}. @@ -277,7 +277,7 @@ Next, restart the {agent} using the command that works with your system: include::../transclusion/fleet/tab-widgets/start-widget.asciidoc[] [discrete] -[[stream-log-files-troubleshoot-your-agent-configuration]] +[[observability-stream-log-files-troubleshoot-your-agent-configuration]] == Troubleshoot your {agent} configuration If you're not seeing your log files in your project, verify the following in the `elastic-agent.yml` file: @@ -288,10 +288,10 @@ If you're not seeing your log files in your project, verify the following in the If you're still running into issues, refer to {fleet-guide}/fleet-troubleshooting.html[{agent} troubleshooting] and {fleet-guide}/elastic-agent-configuration.html[Configure standalone Elastic Agents]. [discrete] -[[stream-log-files-next-steps]] +[[observability-stream-log-files-next-steps]] == Next steps After you have your agent configured and are streaming log data to your project: -* Refer to the <<parse-log-data,Parse and organize logs>> documentation for information on extracting structured fields from your log data, rerouting your logs to different data streams, and filtering and aggregating your log data. -* Refer to the <<filter-and-aggregate-logs,Filter and aggregate logs>> documentation for information on filtering and aggregating your log data to find specific information, gain insight, and monitor your systems more efficiently. +* Refer to the <<observability-parse-log-data,Parse and organize logs>> documentation for information on extracting structured fields from your log data, rerouting your logs to different data streams, and filtering and aggregating your log data. +* Refer to the <<observability-filter-and-aggregate-logs,Filter and aggregate logs>> documentation for information on filtering and aggregating your log data to find specific information, gain insight, and monitor your systems more efficiently. diff --git a/docs/en/serverless/logging/troubleshoot-logs.asciidoc b/docs/en/serverless/logging/troubleshoot-logs.asciidoc index 46d0f4efe7..3997339fed 100644 --- a/docs/en/serverless/logging/troubleshoot-logs.asciidoc +++ b/docs/en/serverless/logging/troubleshoot-logs.asciidoc @@ -1,4 +1,4 @@ -[[troubleshoot-logs]] +[[observability-troubleshoot-logs]] = Troubleshoot logs :description: Find solutions to errors you might encounter while onboarding your logs. @@ -9,7 +9,7 @@ preview:[] This section provides possible solutions for errors you might encounter while onboarding your logs. [discrete] -[[troubleshoot-logs-user-does-not-have-permissions-to-create-api-key]] +[[observability-troubleshoot-logs-user-does-not-have-permissions-to-create-api-key]] == User does not have permissions to create API key When adding a new data using the guided instructions in your project (**Add data** → **Collect and analyze logs** → **Stream log files**), @@ -21,13 +21,13 @@ You need permission to manage API keys ==== [discrete] -[[troubleshoot-logs-solution]] +[[observability-troubleshoot-logs-solution]] === Solution You need to either: * Ask an administrator to update your user role to at least **Deployment access** → **Admin**. Read more about user roles in https://www.elastic.co/docs/current/serverless/general/assign-user-roles[Assign user roles and privileges]. After your use role is updated, restart the onboarding flow. -* Get an API key from an administrator and manually add the API to the {agent} configuration. See <<stream-log-files-step-3-configure-the-agent,Configure the {agent}>> for more on manually updating the configuration and adding the API key. +* Get an API key from an administrator and manually add the API to the {agent} configuration. See <<observability-stream-log-files-step-3-configure-the-agent,Configure the {agent}>> for more on manually updating the configuration and adding the API key. // Not sure if these are different in serverless... @@ -49,7 +49,7 @@ Once you have the necessary privileges, restart the onboarding flow. */ //// [discrete] -[[troubleshoot-logs-observability-project-not-accessible-from-host]] +[[observability-troubleshoot-logs-observability-project-not-accessible-from-host]] == Observability project not accessible from host If your Observability project is not accessible from the host, you'll see the following error message after pasting the **Install the {agent}** instructions into the host: @@ -60,7 +60,7 @@ Failed to connect to {host} port {port} after 0 ms: Connection refused ---- [discrete] -[[troubleshoot-logs-solution-1]] +[[observability-troubleshoot-logs-solution-1]] === Solution The host needs access to your project. Port `443` must be open and the project's {es} endpoint must be reachable. You can locate your project's endpoint by clicking the help icon (image:images/icons/help.svg[Help icon]) and selecting **Endpoints**. Run the following command, replacing the URL with your endpoint, and you should get an authentication error with more details on resolving your issue: @@ -71,7 +71,7 @@ curl https://your-endpoint.elastic.cloud ---- [discrete] -[[troubleshoot-logs-download-agent-failed]] +[[observability-troubleshoot-logs-download-agent-failed]] == Download {agent} failed If the host was able to download the installation script but cannot connect to the public artifact repository, you'll see the following error message: @@ -84,7 +84,7 @@ Failed to download Elastic Agent, see script for error. ---- [discrete] -[[troubleshoot-logs-solutions]] +[[observability-troubleshoot-logs-solutions]] === Solutions * If the combination of the {agent} version and operating system architecture is not available, you'll see the following error message: @@ -106,7 +106,7 @@ To fix this, delete previous downloads and restart the onboarding. * You're an Elastic Cloud Enterprise user without access to the Elastic downloads page. [discrete] -[[troubleshoot-logs-install-agent-failed]] +[[observability-troubleshoot-logs-install-agent-failed]] == Install {agent} failed If an {agent} already exists on your host, you'll see the following error message: @@ -119,7 +119,7 @@ Failed to install Elastic Agent, see script for error. ---- [discrete] -[[troubleshoot-logs-solution-2]] +[[observability-troubleshoot-logs-solution-2]] === Solution You can uninstall the current {agent} using the `elastic-agent uninstall` command, and run the script again. @@ -130,13 +130,13 @@ Uninstalling the current {agent} removes the entire current setup, including the ==== [discrete] -[[troubleshoot-logs-waiting-for-logs-to-be-shipped-step-never-completes]] +[[observability-troubleshoot-logs-waiting-for-logs-to-be-shipped-step-never-completes]] == Waiting for Logs to be shipped... step never completes If the **Waiting for Logs to be shipped...** step never completes, logs are not being shipped to your Observability project, and there is most likely an issue with your {agent} configuration. [discrete] -[[troubleshoot-logs-solution-3]] +[[observability-troubleshoot-logs-solution-3]] === Solution Inspect the {agent} logs for errors. See the {fleet-guide}/debug-standalone-agents.html#inspect-standalone-agent-logs[Debug standalone {agent}s] documentation for more on finding errors in {agent} logs. diff --git a/docs/en/serverless/logging/view-and-monitor-logs.asciidoc b/docs/en/serverless/logging/view-and-monitor-logs.asciidoc index fd60343690..351f65ff75 100644 --- a/docs/en/serverless/logging/view-and-monitor-logs.asciidoc +++ b/docs/en/serverless/logging/view-and-monitor-logs.asciidoc @@ -1,4 +1,4 @@ -[[discover-and-explore-logs]] +[[observability-discover-and-explore-logs]] = Explore logs :description: Visualize and analyze logs. @@ -16,14 +16,14 @@ Go to Logs Explorer by opening **Discover** from the navigation menu, and select image::images/log-explorer.png[Screen capture of the Logs Explorer] [discrete] -[[discover-and-explore-logs-required-kib-privileges]] +[[observability-discover-and-explore-logs-required-kib-privileges]] == Required {kib} privileges Viewing data in Logs Explorer requires `read` privileges for **Discover** and **Integrations**. For more on assigning Kibana privileges, refer to the {kibana-ref}/kibana-privileges.html[{kib} privileges] docs. [discrete] -[[discover-and-explore-logs-find-your-logs]] +[[observability-discover-and-explore-logs-find-your-logs]] == Find your logs By default, Logs Explorer shows all of your logs according to the index patterns set in the **logs source** advanced setting. @@ -38,7 +38,7 @@ Once you have the logs you want to focus on displayed, you can drill down furthe For more on filtering your data in Logs Explorer, refer to <<logs-filter-logs-explorer,Filter logs in Logs Explorer>>. [discrete] -[[discover-and-explore-logs-review-log-data-in-the-documents-table]] +[[observability-discover-and-explore-logs-review-log-data-in-the-documents-table]] == Review log data in the documents table The documents table in Logs Explorer functions similarly to the table in Discover. @@ -47,21 +47,21 @@ You can add fields, order table columns, sort fields, and update the row height Refer to the {kibana-ref}/discover.html[Discover] documentation for more information on updating the table. [discrete] -[[discover-and-explore-logs-analyze-data-with-smart-fields]] +[[observability-discover-and-explore-logs-analyze-data-with-smart-fields]] === Analyze data with smart fields Smart fields are dynamic fields that provide valuable insight on where your log documents come from, what information they contain, and how you can interact with them. The following sections detail the smart fields available in Logs Explorer. [discrete] -[[discover-and-explore-logs-resource-smart-field]] +[[observability-discover-and-explore-logs-resource-smart-field]] ==== Resource smart field The resource smart field shows where your logs are coming from by displaying fields like `service.name`, `container.name`, `orchestrator.namespace`, `host.name`, and `cloud.instance.id`. Use this information to see where issues are coming from and if issues are coming from the same source. [discrete] -[[discover-and-explore-logs-content-smart-field]] +[[observability-discover-and-explore-logs-content-smart-field]] ==== Content smart field The content smart field shows your logs' `log.level` and `message` fields. @@ -69,7 +69,7 @@ If neither of these fields are available, the content smart field will show the Use this information to see your log content and inspect issues. [discrete] -[[discover-and-explore-logs-actions-smart-field]] +[[observability-discover-and-explore-logs-actions-smart-field]] ==== Actions smart field The actions smart field provides access to additional information about your logs. @@ -83,7 +83,7 @@ Ignored fields could indicate malformed fields or other issues with your documen This indicator makes it easier to navigate through your documents and know if they contain additional information in the form of stack traces. [discrete] -[[discover-and-explore-logs-view-log-details]] +[[observability-discover-and-explore-logs-view-log-details]] == View log details Click the expand icon (image:images/icons/expand.svg[expand icon]) in the **Actions** column to get an in-depth look at an individual log file. @@ -99,11 +99,11 @@ The following actions help you filter and focus on specific fields in the log de * **Toggle column in table (image:images/icons/listAdd.svg[toggle column in table icon]):** Add or remove a column for the field to the main Logs Explorer table. [discrete] -[[discover-and-explore-logs-view-log-quality-issues]] +[[observability-discover-and-explore-logs-view-log-quality-issues]] == View log quality issues From the log details of a document with ignored fields, as shown by the degraded document indicator ((image:images/icons/pagesSelect.svg[degraded document indicator icon])), expand the **Quality issues** section to see the name and value of the fields that were ignored. Select **Data set details** to open the **Data Set Quality** page. Here you can monitor your data sets and investigate any issues. The **Data Set Details** page is also accessible from **Project settings** → **Management** → **Data Set Quality**. -Refer to <<monitor-datasets,Monitor data sets>> for more information. +Refer to <<observability-monitor-datasets,Monitor data sets>> for more information. diff --git a/docs/en/serverless/monitor-datasets.asciidoc b/docs/en/serverless/monitor-datasets.asciidoc index c06e8d9c7c..3b4ed0c460 100644 --- a/docs/en/serverless/monitor-datasets.asciidoc +++ b/docs/en/serverless/monitor-datasets.asciidoc @@ -1,4 +1,4 @@ -[[monitor-datasets]] +[[observability-monitor-datasets]] = Data set quality monitoring :description: Monitor data sets to find degraded documents. @@ -33,7 +33,7 @@ The percentage of degraded documents determines the data set's quality according Opening the details of a specific data set shows the degraded documents history, a summary for the data set, and other details that can help you determine if you need to investigate any issues. [discrete] -[[monitor-datasets-investigate-issues]] +[[observability-monitor-datasets-investigate-issues]] == Investigate issues The Data Set Quality page has a couple of different ways to help you find ignored fields and investigate issues. @@ -41,7 +41,7 @@ From the data set table, you can open the data set's details page, and view comm Open a logs data set in Logs Explorer or other data set types in Discover to find ignored fields in individual documents. [discrete] -[[monitor-datasets-find-ignored-fields-in-data-sets]] +[[observability-monitor-datasets-find-ignored-fields-in-data-sets]] === Find ignored fields in data sets To open the details page for a data set with poor or degraded quality and view ignored fields: @@ -52,7 +52,7 @@ To open the details page for a data set with poor or degraded quality and view i The **Quality issues** section shows fields that have been ignored, the number of documents that contain ignored fields, and the timestamp of last occurrence of the field being ignored. [discrete] -[[monitor-datasets-find-ignored-fields-in-individual-logs]] +[[observability-monitor-datasets-find-ignored-fields-in-individual-logs]] === Find ignored fields in individual logs To use Logs Explorer or Discover to find ignored fields in individual logs: diff --git a/docs/en/serverless/observability-overview.asciidoc b/docs/en/serverless/observability-overview.asciidoc index 7334c62267..0cdfedea47 100644 --- a/docs/en/serverless/observability-overview.asciidoc +++ b/docs/en/serverless/observability-overview.asciidoc @@ -1,4 +1,4 @@ -[[serverless-observability-overview]] +[[observability-serverless-observability-overview]] = Observability overview :description: Learn how to accelerate problem resolution with open, flexible, and unified observability powered by advanced machine learning and analytics. @@ -28,7 +28,7 @@ get information about the structure of the fields, and display your findings in [role="screenshot"] image::images/log-explorer-overview.png[Logs Explorer showing log events] -<<log-monitoring,Learn more about log monitoring →>> +<<observability-log-monitoring,Learn more about log monitoring →>> // RUM is not supported for this release. @@ -37,7 +37,7 @@ image::images/log-explorer-overview.png[Logs Explorer showing log events] // Universal Profiling is not supported for this release. [discrete] -[[serverless-observability-overview-application-performance-monitoring-apm]] +[[observability-serverless-observability-overview-application-performance-monitoring-apm]] == Application performance monitoring (APM) Instrument your code and collect performance data and errors at runtime by installing APM agents like Java, Go, .NET, and many more. @@ -52,7 +52,7 @@ The **Service** inventory provides a quick, high-level overview of the health an [role="screenshot"] image::images/services-inventory.png[Service inventory showing health and performance of instrumented services] -<<apm,Learn more about Application performance monitoring (APM) →>> +<<observability-apm,Learn more about Application performance monitoring (APM) →>> [discrete] [[metrics-overview]] @@ -76,19 +76,19 @@ From either page, you can view health and performance metrics to get visibility You can also drill down into details about a specific host, including performance metrics, host metadata, running processes, and logs. -<<infrastructure-monitoring,Learn more about infrastructure monitoring → >> +<<observability-infrastructure-monitoring,Learn more about infrastructure monitoring → >> [discrete] -[[serverless-observability-overview-synthetic-monitoring]] +[[observability-serverless-observability-overview-synthetic-monitoring]] == Synthetic monitoring Simulate actions and requests that an end user would perform on your site at predefined intervals and in a controlled environment. The end result is rich, consistent, and repeatable data that you can trend and alert on. -For more information, see <<monitor-synthetics,Synthetic monitoring>>. +For more information, see <<observability-monitor-synthetics,Synthetic monitoring>>. [discrete] -[[serverless-observability-overview-alerting]] +[[observability-serverless-observability-overview-alerting]] == Alerting Stay aware of potential issues in your environments with {observability}’s alerting @@ -101,10 +101,10 @@ On the **Alerts** page, the **Alerts** table provides a snapshot of alerts occur [role="screenshot"] image::images/observability-alerts-overview.png[Summary of Alerts on the {observability} overview page] -<<alerting,Learn more about alerting → >> +<<observability-alerting,Learn more about alerting → >> [discrete] -[[serverless-observability-overview-service-level-objectives-slos]] +[[observability-serverless-observability-overview-service-level-objectives-slos]] == Service-level objectives (SLOs) Set clear, measurable targets for your service performance, @@ -117,10 +117,10 @@ From the SLO overview list, you can see all of your SLOs and a quick summary of [role="screenshot"] image::images/slo-dashboard.png[Dashboard showing list of SLOs] -<<slos,Learn more about SLOs → >> +<<observability-slos,Learn more about SLOs → >> [discrete] -[[serverless-observability-overview-cases]] +[[observability-serverless-observability-overview-cases]] == Cases Collect and share information about observability issues by creating cases. @@ -132,10 +132,10 @@ such as ServiceNow and Jira. [role="screenshot"] image::images/cases.png[Screenshot showing list of cases] -<<cases,Learn more about cases → >> +<<observability-cases,Learn more about cases → >> [discrete] -[[serverless-observability-overview-aiops]] +[[observability-serverless-observability-overview-aiops]] == AIOps Reduce the time and effort required to detect, understand, investigate, and resolve incidents at scale @@ -148,4 +148,4 @@ by leveraging predictive analytics and machine learning: [role="screenshot"] image::images/log-rate-analysis.png[Log rate analysis page showing log rate spike ] -<<aiops,Learn more about AIOps →>> +<<observability-aiops,Learn more about AIOps →>> diff --git a/docs/en/serverless/projects/create-an-observability-project.asciidoc b/docs/en/serverless/projects/create-an-observability-project.asciidoc index 1a6dfd2025..e644a9489c 100644 --- a/docs/en/serverless/projects/create-an-observability-project.asciidoc +++ b/docs/en/serverless/projects/create-an-observability-project.asciidoc @@ -1,4 +1,4 @@ -[[create-an-observability-project]] +[[observability-create-an-observability-project]] = Create an Elastic {observability} project :description: Create a fully-managed Elastic {observability} project to monitor the health of your applications. @@ -39,11 +39,11 @@ To return to the onboarding page later, select **Add data** from the main menu. ==== [discrete] -[[create-an-observability-project-next-steps]] +[[observability-create-an-observability-project-next-steps]] == Next steps Learn how to add data to your project and start using {observability} features: -* <<get-started-with-logs>> -* <<apm-get-started>> -* <<get-started-with-metrics>> +* <<observability-get-started-with-logs>> +* <<observability-apm-get-started>> +* <<observability-get-started-with-metrics>> diff --git a/docs/en/serverless/quickstarts/k8s-logs-metrics.asciidoc b/docs/en/serverless/quickstarts/k8s-logs-metrics.asciidoc index c950f5100d..035bc281b4 100644 --- a/docs/en/serverless/quickstarts/k8s-logs-metrics.asciidoc +++ b/docs/en/serverless/quickstarts/k8s-logs-metrics.asciidoc @@ -1,4 +1,4 @@ -[[quickstarts-k8s-logs-metrics]] +[[observability-quickstarts-k8s-logs-metrics]] = Monitor your Kubernetes cluster with Elastic Agent :description: Learn how to monitor your cluster infrastructure running on Kubernetes. @@ -13,19 +13,19 @@ This new approach requires minimal configuration and provides you with an easy s The kubectl command installs the standalone Elastic Agent in your Kubernetes cluster, downloads all the Kubernetes resources needed to collect metrics from the cluster, and sends it to Elastic. [discrete] -[[quickstarts-k8s-logs-metrics-prerequisites]] +[[observability-quickstarts-k8s-logs-metrics-prerequisites]] == Prerequisites -* An {observability} project. To learn more, refer to <<create-an-observability-project>>. +* An {observability} project. To learn more, refer to <<observability-create-an-observability-project>>. * A user with the **Admin** role or higher—required to onboard system logs and metrics. To learn more, refer to https://www.elastic.co/docs/current/serverless/general/assign-user-roles[Assign user roles and privileges]. * A running Kubernetes cluster. * https://kubernetes.io/docs/reference/kubectl/[Kubectl]. [discrete] -[[quickstarts-k8s-logs-metrics-collect-your-data]] +[[observability-quickstarts-k8s-logs-metrics-collect-your-data]] == Collect your data -. <<create-an-observability-project,Create a new {observability} project>>, or open an existing one. +. <<observability-create-an-observability-project,Create a new {observability} project>>, or open an existing one. . In your {observability} project, go to **Add Data**. . Select **Monitor infrastructure**, and then select **Kubernetes**. + @@ -39,7 +39,7 @@ There might be a slight delay before data is ingested. When ready, you will see . Click **Explore Kubernetes cluster** to navigate to dashboards and explore your data. [discrete] -[[quickstarts-k8s-logs-metrics-visualize-your-data]] +[[observability-quickstarts-k8s-logs-metrics-visualize-your-data]] == Visualize your data After installation is complete and all relevant data is flowing into Elastic, @@ -50,4 +50,4 @@ image::images/quickstart-k8s-overview.png[Kubernetes overview dashboard] Furthermore, you can access other useful prebuilt dashboards for monitoring Kubernetes resources, for example running pods per namespace, as well as the resources they consume, like CPU and memory. -Refer to <<serverless-observability-overview>> for a description of other useful features. +Refer to <<observability-serverless-observability-overview>> for a description of other useful features. diff --git a/docs/en/serverless/quickstarts/monitor-hosts-with-elastic-agent.asciidoc b/docs/en/serverless/quickstarts/monitor-hosts-with-elastic-agent.asciidoc index b59d5ddba0..42a047e0b8 100644 --- a/docs/en/serverless/quickstarts/monitor-hosts-with-elastic-agent.asciidoc +++ b/docs/en/serverless/quickstarts/monitor-hosts-with-elastic-agent.asciidoc @@ -1,4 +1,4 @@ -[[quickstarts-monitor-hosts-with-elastic-agent]] +[[observability-quickstarts-monitor-hosts-with-elastic-agent]] = Monitor hosts with {agent} :description: Learn how to scan your hosts to detect and collect logs and metrics. @@ -16,15 +16,15 @@ which is used to collect observability data from the host and send it to Elastic The script also generates an {agent} configuration file that you can use with your existing Infrastructure-as-Code tooling. [discrete] -[[quickstarts-monitor-hosts-with-elastic-agent-prerequisites]] +[[observability-quickstarts-monitor-hosts-with-elastic-agent-prerequisites]] == Prerequisites -* An {observability} project. To learn more, refer to <<create-an-observability-project>>. +* An {observability} project. To learn more, refer to <<observability-create-an-observability-project>>. * A user with the **Admin** role or higher—required to onboard system logs and metrics. To learn more, refer to https://www.elastic.co/docs/current/serverless/general/assign-user-roles[Assign user roles and privileges]. * Root privileges on the host—required to run the auto-detection script used in this quickstart. [discrete] -[[quickstarts-monitor-hosts-with-elastic-agent-limitations]] +[[observability-quickstarts-monitor-hosts-with-elastic-agent-limitations]] == Limitations * The auto-detection script currently scans for metrics and logs from Apache, Docker, Nginx, and the host system. @@ -34,10 +34,10 @@ It also scans for custom log files. * Because Docker Desktop runs in a VM, its logs are not auto-detected. [discrete] -[[quickstarts-monitor-hosts-with-elastic-agent-collect-your-data]] +[[observability-quickstarts-monitor-hosts-with-elastic-agent-collect-your-data]] == Collect your data -. <<create-an-observability-project,Create a new {observability} project>>, or open an existing one. +. <<observability-create-an-observability-project,Create a new {observability} project>>, or open an existing one. . In your {observability} project, go to **Add Data**. . Select **Collect and analyze logs**, and then select **Auto-detect logs and metrics**. . Copy the command that's shown. For example: @@ -65,7 +65,7 @@ If the script misses any custom logs, you can add them manually by entering `n` ==== [discrete] -[[quickstarts-monitor-hosts-with-elastic-agent-visualize-your-data]] +[[observability-quickstarts-monitor-hosts-with-elastic-agent-visualize-your-data]] == Visualize your data After installation is complete and all relevant data is flowing into Elastic, @@ -99,7 +99,7 @@ Metrics that indicate a possible problem are highlighted in red. image::images/quickstart-host-overview.png[Host overview dashboard] [discrete] -[[quickstarts-monitor-hosts-with-elastic-agent-get-value-out-of-your-data]] +[[observability-quickstarts-monitor-hosts-with-elastic-agent-get-value-out-of-your-data]] == Get value out of your data After using the dashboards to examine your data and confirm you've ingested all the host logs and metrics you want to monitor, @@ -107,22 +107,22 @@ you can use Elastic {observability} to gain deeper insight into your data. For host monitoring, the following capabilities and features are recommended: -* In the <<infrastructure-monitoring,Infrastructure UI>>, analyze and compare data collected from your hosts. +* In the <<observability-infrastructure-monitoring,Infrastructure UI>>, analyze and compare data collected from your hosts. You can also: + -** <<detect-metric-anomalies,Detect anomalies>> for memory usage and network traffic on hosts. -** <<alerting,Create alerts>> that notify you when an anomaly is detected or a metric exceeds a given value. -* In the <<discover-and-explore-logs,Logs Explorer>>, search and filter your log data, +** <<observability-detect-metric-anomalies,Detect anomalies>> for memory usage and network traffic on hosts. +** <<observability-alerting,Create alerts>> that notify you when an anomaly is detected or a metric exceeds a given value. +* In the <<observability-discover-and-explore-logs,Logs Explorer>>, search and filter your log data, get information about the structure of log fields, and display your findings in a visualization. You can also: + -** <<monitor-datasets,Monitor log data set quality>> to find degraded documents. -** <<run-log-pattern-analysis,Run a pattern analysis>> to find patterns in unstructured log messages. -** <<alerting,Create alerts>> that notify you when an Observability data type reaches or exceeds a given value. -* Use <<aiops,AIOps features>> to apply predictive analytics and machine learning to your data: +** <<observability-monitor-datasets,Monitor log data set quality>> to find degraded documents. +** <<observability-run-log-pattern-analysis,Run a pattern analysis>> to find patterns in unstructured log messages. +** <<observability-alerting,Create alerts>> that notify you when an Observability data type reaches or exceeds a given value. +* Use <<observability-aiops,AIOps features>> to apply predictive analytics and machine learning to your data: + -** <<aiops-detect-anomalies,Detect anomalies>> by comparing real-time and historical data from different sources to look for unusual, problematic patterns. -** <<aiops-analyze-spikes,Analyze log spikes and drops>>. -** <<aiops-detect-change-points,Detect change points>> in your time series data. +** <<observability-aiops-detect-anomalies,Detect anomalies>> by comparing real-time and historical data from different sources to look for unusual, problematic patterns. +** <<observability-aiops-analyze-spikes,Analyze log spikes and drops>>. +** <<observability-aiops-detect-change-points,Detect change points>> in your time series data. -Refer to <<serverless-observability-overview>> for a description of other useful features. +Refer to <<observability-serverless-observability-overview>> for a description of other useful features. diff --git a/docs/en/serverless/quickstarts/overview.asciidoc b/docs/en/serverless/quickstarts/overview.asciidoc index b2d45bf33c..cacb2a9513 100644 --- a/docs/en/serverless/quickstarts/overview.asciidoc +++ b/docs/en/serverless/quickstarts/overview.asciidoc @@ -1,4 +1,4 @@ -[[quickstarts-overview]] +[[observability-quickstarts-overview]] = Quickstarts :description: Learn how to ingest your observability data and get immediate value. @@ -13,8 +13,8 @@ Each quickstart provides: * Quick access to related dashboards and visualizations [discrete] -[[quickstarts-overview-available-quickstarts]] +[[observability-quickstarts-overview-available-quickstarts]] == Available quickstarts -* <<quickstarts-monitor-hosts-with-elastic-agent>> -* <<quickstarts-k8s-logs-metrics>> +* <<observability-quickstarts-monitor-hosts-with-elastic-agent>> +* <<observability-quickstarts-k8s-logs-metrics>> diff --git a/docs/en/serverless/slos/create-an-slo.asciidoc b/docs/en/serverless/slos/create-an-slo.asciidoc index af14e20515..951cb8a63a 100644 --- a/docs/en/serverless/slos/create-an-slo.asciidoc +++ b/docs/en/serverless/slos/create-an-slo.asciidoc @@ -1,4 +1,4 @@ -[[create-an-slo]] +[[observability-create-an-slo]] = Create an SLO :description: Learn how to define a service-level indicator (SLI), set an objective, and create a service-level objective (SLO). @@ -184,9 +184,9 @@ out of the total number of checks. When defining a Synthetics availability SLI, set the following fields: -* **Monitor name** — The name of one or more <<synthetics-configuration,synthetic monitors>>. +* **Monitor name** — The name of one or more <<observability-synthetics-configuration,synthetic monitors>>. * **Project** — The ID of one or more <<synthetics-configuration-project,projects>> containing synthetic monitors. -* **Tags** — One or more <<synthetics-configuration,tags>> assigned to synthetic monitors. +* **Tags** — One or more <<observability-synthetics-configuration,tags>> assigned to synthetic monitors. * **Query filter** — An optional KQL query used to filter the Synthetics checks on some relevant criteria. [NOTE] @@ -256,4 +256,4 @@ When you use the UI to create an SLO, a default SLO burn rate alert rule is crea The burn rate rule will use the default configuration and no connector. You must configure a connector if you want to receive alerts for SLO breaches. -For more information about configuring the rule, see <<create-slo-burn-rate-alert-rule,Create an SLO burn rate rule>>. +For more information about configuring the rule, see <<observability-create-slo-burn-rate-alert-rule,Create an SLO burn rate rule>>. diff --git a/docs/en/serverless/slos/slos.asciidoc b/docs/en/serverless/slos/slos.asciidoc index 35c444bb94..604e6efff0 100644 --- a/docs/en/serverless/slos/slos.asciidoc +++ b/docs/en/serverless/slos/slos.asciidoc @@ -1,4 +1,4 @@ -[[slos]] +[[observability-slos]] = SLOs :description: Set clear, measurable targets for your service performance with service-level objectives (SLOs). @@ -48,7 +48,7 @@ Select an SLO from the overview to see additional details including: * **Burn rate:** the percentage of bad events over different time periods (1h, 6h, 24h, 72h) and the risk of exhausting your error budget within those time periods. * **Historical SLI:** the SLI value and how it's trending over the SLO time window. * **Error budget burn down:** the remaining error budget and how it's trending over the SLO time window. -* **Alerts:** active alerts if you've set any <<create-slo-burn-rate-alert-rule,SLO burn rate alert rules>> for the SLO. +* **Alerts:** active alerts if you've set any <<observability-create-slo-burn-rate-alert-rule,SLO burn rate alert rules>> for the SLO. [role="screenshot"] image::images/slo-detailed-view.png[Detailed view of a single SLO] @@ -76,7 +76,7 @@ image::images/slo-group-by.png[SLOs sorted by SLO status and grouped by tags] * Click icons to switch between a card view (image:images/icons/apps.svg[Card view icon]), list view (image:images/icons/list.svg[List view icon]), or compact view (image:images/icons/tableDensityCompact.svg[Compact view icon]]). [discrete] -[[slos-slo-dashboard-panels]] +[[observability-slos-slo-dashboard-panels]] == SLO dashboard panels SLO data is also available as Dashboard _panels_. @@ -90,7 +90,7 @@ Available SLO panels include: [role="screenshot"] image::images/slo-dashboard-panel.png[Detailed view of an SLO dashboard panel] -To learn more about Dashboards, see <<dashboards,Dashboards>>. +To learn more about Dashboards, see <<observability-dashboards,Dashboards>>. [discrete] [[slo-overview-next-steps]] @@ -100,7 +100,7 @@ Get started using SLOs to measure your service performance: // TODO: Find out if any special privileges are required to grant access to SLOs and document as required. Classic doclink was <DocLink id="enObservabilitySloPrivileges">Configure SLO access</DocLink> -* <<create-an-slo>> -* <<create-slo-burn-rate-alert-rule>> -* <<view-alerts>> -* <<triage-slo-burn-rate-breaches>> +* <<observability-create-an-slo>> +* <<observability-create-slo-burn-rate-alert-rule>> +* <<observability-view-alerts>> +* <<observability-triage-slo-burn-rate-breaches>> diff --git a/docs/en/serverless/synthetics/synthetics-analyze.asciidoc b/docs/en/serverless/synthetics/synthetics-analyze.asciidoc index ed9ff44e2d..3e64b23f77 100644 --- a/docs/en/serverless/synthetics/synthetics-analyze.asciidoc +++ b/docs/en/serverless/synthetics/synthetics-analyze.asciidoc @@ -1,4 +1,4 @@ -[[synthetics-analyze]] +[[observability-synthetics-analyze]] = Analyze data from synthetic monitors ++++ @@ -229,8 +229,8 @@ whether the step completed or failed. [NOTE] ==== -Customize screenshot behavior for all monitors in the <<synthetics-configuration,configuration file>>, -for one monitor using <<synthetics-monitor-use,`monitor.use`>>, or for a run using +Customize screenshot behavior for all monitors in the <<observability-synthetics-configuration,configuration file>>, +for one monitor using <<observability-synthetics-monitor-use,`monitor.use`>>, or for a run using the <<elastic-synthetics-command,CLI>>. ==== diff --git a/docs/en/serverless/synthetics/synthetics-command-reference.asciidoc b/docs/en/serverless/synthetics/synthetics-command-reference.asciidoc index 446562fd36..89b80ab814 100644 --- a/docs/en/serverless/synthetics/synthetics-command-reference.asciidoc +++ b/docs/en/serverless/synthetics/synthetics-command-reference.asciidoc @@ -1,4 +1,4 @@ -[[synthetics-command-reference]] +[[observability-synthetics-command-reference]] = Use the Synthetics CLI ++++ @@ -35,7 +35,7 @@ to `/*.journey.(ts|js)$/`, which matches files ending with `.journey.ts` or `.jo `--params <jsonstring>`:: JSON object that defines any variables your tests require. -Read more in <<synthetics-params-secrets,Work with params and secrets>>. +Read more in <<observability-synthetics-params-secrets,Work with params and secrets>>. + Params passed will be merged with params defined in your <<synthetics-configuration-params,`synthetics.config.js` file>>. @@ -62,7 +62,7 @@ The value defined via the CLI will take precedence. Path to the configuration file. By default, test runner looks for a `synthetics.config.(js|ts)` file in the current directory. Synthetics configuration provides options to configure how your tests are run and pushed to -Elastic. Allowed options are described in the <<synthetics-configuration,configuration file>> +Elastic. Allowed options are described in the <<observability-synthetics-configuration,configuration file>> `--reporter <json|junit|buildkite-cli|default>`:: One of `json`, `junit`, `buildkite-cli`, or `default`. Use the JUnit or Buildkite @@ -126,7 +126,7 @@ These files can be edited and then pushed to Elastic to create monitors. npx @elastic/synthetics init <name-of-synthetics-project> ---- -Read more about what's included in a template Synthetics project in <<synthetics-get-started-project-create-a-synthetics-project,Create a Synthetics project>>. +Read more about what's included in a template Synthetics project in <<observability-synthetics-get-started-project-create-a-synthetics-project,Create a Synthetics project>>. [discrete] [[elastic-synthetics-push-command]] @@ -171,7 +171,7 @@ However there are some limitations when using external packages: API key used for authentication. You can also set the API key via the `SYNTHETICS_API_KEY` environment variable. + To create an API key, you must be logged in as a user with -<<synthetics-feature-roles,Editor>> access. +<<observability-synthetics-feature-roles,Editor>> access. `--id <string>`:: A unique id associated with your Synthetics project. @@ -207,7 +207,7 @@ This can also be set in the configuration file using The value defined via the CLI will take precedence. `--private-locations Array<string>`:: -The <<synthetics-private-location,{private-location}s>> to which the monitors will be deployed. These {private-location}s refer to locations hosted and managed by you, whereas +The <<observability-synthetics-private-location,{private-location}s>> to which the monitors will be deployed. These {private-location}s refer to locations hosted and managed by you, whereas `locations` are hosted by Elastic. You can specify a {private-location} using the location's name. + To list available {private-location}s, refer to <<elastic-synthetics-locations-command,`@elastic/synthetics locations`>>. @@ -237,7 +237,7 @@ all monitors associated with the Synthetics project ID being pushed will be dele it using a _different_ ID, it will create duplicates of all monitors in the Synthetics project. [discrete] -[[synthetics-command-reference-tag-monitors]] +[[observability-synthetics-command-reference-tag-monitors]] == Tag monitors Synthetics journeys can be tagged with one or more tags. Use tags to @@ -269,7 +269,7 @@ tags: To apply tags to all browser and lightweight monitors, configure using the `monitor.tags` field in the `synthetics.config.ts` file. [discrete] -[[synthetics-command-reference-filter-monitors]] +[[observability-synthetics-command-reference-filter-monitors]] == Filter monitors When running the `npx @elastic/synthetics push` command, you can filter the monitors that are pushed to Elastic using the following flags: diff --git a/docs/en/serverless/synthetics/synthetics-configuration.asciidoc b/docs/en/serverless/synthetics/synthetics-configuration.asciidoc index 25f22fb8ce..3e13f1deff 100644 --- a/docs/en/serverless/synthetics/synthetics-configuration.asciidoc +++ b/docs/en/serverless/synthetics/synthetics-configuration.asciidoc @@ -1,4 +1,4 @@ -[[synthetics-configuration]] +[[observability-synthetics-configuration]] = Configure a Synthetics project preview:[] @@ -64,7 +64,7 @@ the tests based on environments, look at the <<synthetics-dynamic-configs,dynami == `params` A JSON object that defines any variables your tests require. -Read more in <<synthetics-params-secrets,Work with params and secrets>>. +Read more in <<observability-synthetics-params-secrets,Work with params and secrets>>. [discrete] [[synthetics-configuration-playwright-options]] @@ -159,7 +159,7 @@ playwrightOptions: { ---- To use a timezone and/or locale for a _specific_ monitor, add these options to a -journey using <<synthetics-monitor-use,`monitor.use`>>. +journey using <<observability-synthetics-monitor-use,`monitor.use`>>. [discrete] [[synthetics-config-device-emulation]] @@ -207,5 +207,5 @@ include::../transclusion/synthetics/configuration/monitor-config-options.asciido For information on configuring monitors individually, refer to: -* <<synthetics-monitor-use,Configure individual browser monitors>> for browser monitors -* <<synthetics-lightweight,Configure lightweight monitors>> for lightweight monitors +* <<observability-synthetics-monitor-use,Configure individual browser monitors>> for browser monitors +* <<observability-synthetics-lightweight,Configure lightweight monitors>> for lightweight monitors diff --git a/docs/en/serverless/synthetics/synthetics-create-test.asciidoc b/docs/en/serverless/synthetics/synthetics-create-test.asciidoc index 7cb5fe0eef..bf099fdf6f 100644 --- a/docs/en/serverless/synthetics/synthetics-create-test.asciidoc +++ b/docs/en/serverless/synthetics/synthetics-create-test.asciidoc @@ -1,9 +1,9 @@ -[[synthetics-create-test]] +[[observability-synthetics-create-test]] = Write a synthetic test preview:[] -After <<synthetics-get-started-project,setting up a Synthetics project>>, you can start writing synthetic tests that check critical actions and requests that an end-user might make +After <<observability-synthetics-get-started-project,setting up a Synthetics project>>, you can start writing synthetic tests that check critical actions and requests that an end-user might make on your site. [discrete] @@ -62,7 +62,7 @@ Learn more in <<before-after,Set up and remove a global state>>. | `monitor` a| The `monitor.use` method allows you to determine a monitor's configuration on a journey-by-journey basis. If you want two journeys to create monitors with different intervals, for example, you should call `monitor.use` in each of them and set the `schedule` property to different values in each. Note that this is only relevant when using the `push` command to create monitors in your Observability project. -Learn more in <<synthetics-monitor-use,Configure individual browser monitors>>. +Learn more in <<observability-synthetics-monitor-use,Configure individual browser monitors>>. |=== [discrete] @@ -115,7 +115,7 @@ that doesn't share cookies or cache with other browser contexts. `params`:: User-defined variables that allow you to invoke the Synthetics suite with custom parameters. For example, if you want to use a different homepage depending on the `env` -(`localhost` for `dev` and a URL for `prod`). See <<synthetics-params-secrets,Work with params and secrets>> +(`localhost` for `dev` and a URL for `prod`). See <<observability-synthetics-params-secrets,Work with params and secrets>> for more information. `request`:: @@ -180,7 +180,7 @@ If you want to generate code by interacting with a web page directly, you can us The recorder launches a https://www.chromium.org/Home/[Chromium browser] that will listen to each interaction you have with the web page and record them internally using Playwright. When you're done interacting with the browser, the recorder converts the recorded actions into JavaScript code that you can use with Elastic Synthetics or {heartbeat}. -For more details on getting started with the Synthetics Recorder, refer to <<synthetics-recorder,Use the Synthetics Recorder>>. +For more details on getting started with the Synthetics Recorder, refer to <<observability-synthetics-recorder,Use the Synthetics Recorder>>. ==== [discrete] @@ -286,13 +286,13 @@ with a few key differences: * The Elastic Synthetics `request` parameter comes built into the library so it doesn't have to be imported separately, which reduces the amount of code needed and allows you to -make API requests in <<synthetics-get-started-ui-add-a-browser-monitor,inline journeys>>. +make API requests in <<observability-synthetics-get-started-ui-add-a-browser-monitor,inline journeys>>. * The top level `request` object exposed by Elastic Synthetics has its own isolated cookie storage unlike Playwright's `context.request` and `page.request`, which share cookie storage with the corresponding https://playwright.dev/docs/api/class-browsercontext[`BrowserContext`]. * If you want to control the creation of the `request` object, you can do so by passing options via <<elastic-synthetics-command,`--playwright-options`>> or in the -<<synthetics-configuration,`synthetics.config.ts` file>>. +<<observability-synthetics-configuration,`synthetics.config.ts` file>>. For a full example that shows how to use the `request` object, refer to the https://github.com/elastic/synthetics-demo/blob/main/advanced-examples/journeys/api-requests.journey.ts[Elastic Synthetics demo repository]. @@ -355,7 +355,7 @@ journey('bundle test', ({ page, params }) => { }); ---- -When you <<synthetics-get-started-project,create a monitor>> from a journey that uses +When you <<observability-synthetics-get-started-project,create a monitor>> from a journey that uses external NPM packages, those packages will be bundled along with the journey code when the `push` command is invoked. diff --git a/docs/en/serverless/synthetics/synthetics-feature-roles.asciidoc b/docs/en/serverless/synthetics/synthetics-feature-roles.asciidoc index 083d33541f..9402ff7fc3 100644 --- a/docs/en/serverless/synthetics/synthetics-feature-roles.asciidoc +++ b/docs/en/serverless/synthetics/synthetics-feature-roles.asciidoc @@ -1,4 +1,4 @@ -[[synthetics-feature-roles]] +[[observability-synthetics-feature-roles]] = Grant users access to secured resources preview:[] diff --git a/docs/en/serverless/synthetics/synthetics-get-started-project.asciidoc b/docs/en/serverless/synthetics/synthetics-get-started-project.asciidoc index d57a7f0070..aca2059a78 100644 --- a/docs/en/serverless/synthetics/synthetics-get-started-project.asciidoc +++ b/docs/en/serverless/synthetics/synthetics-get-started-project.asciidoc @@ -1,4 +1,4 @@ -[[synthetics-get-started-project]] +[[observability-synthetics-get-started-project]] = Create monitors with a Synthetics project ++++ @@ -15,13 +15,13 @@ and deploy via a CLI tool, usually executed on a CI/CD platform. image::images/synthetics-get-started-projects.png[Diagram showing which pieces of software are used to configure monitors, create monitors, and view results when using Synthetic project monitors.] -This is one of <<synthetics-get-started,two approaches>> you can use to set up a synthetic monitor. +This is one of <<observability-synthetics-get-started,two approaches>> you can use to set up a synthetic monitor. [discrete] -[[synthetics-get-started-project-prerequisites]] +[[observability-synthetics-get-started-project-prerequisites]] == Prerequisites -You must be signed in as a user with <<synthetics-feature-roles,Editor>> access. +You must be signed in as a user with <<observability-synthetics-feature-roles,Editor>> access. // and Monitor Management must be enabled by an administrator as described in <DocLink slug="/serverless/observability/synthetics-feature-roles">Setup role</DocLink>. @@ -52,10 +52,10 @@ locations without having to manage your own infrastructure. Elastic takes care of software updates and capacity planning for you. * **{private-location}s**: {private-location}s allow you to run monitors from your own premises. To use {private-location}s you must create a {private-location} before continuing. -For step-by-step instructions, refer to <<synthetics-private-location,Monitor resources on private networks>>. +For step-by-step instructions, refer to <<observability-synthetics-private-location,Monitor resources on private networks>>. [discrete] -[[synthetics-get-started-project-create-a-synthetics-project]] +[[observability-synthetics-get-started-project-create-a-synthetics-project]] == Create a Synthetics project Start by creating your first Synthetics project. Run the command below to create a new @@ -79,7 +79,7 @@ to connect to your Observability project: + [IMPORTANT] ==== -To generate a Project API key, you must be logged in as a user with <<synthetics-feature-roles,Editor>> access. +To generate a Project API key, you must be logged in as a user with <<observability-synthetics-feature-roles,Editor>> access. ==== + [role="screenshot"] @@ -111,7 +111,7 @@ When you create a new Synthetics project, it will contain some basic configurati ==== The `synthetics.config.ts` in the sample Synthetics project uses a location on Elastic's global managed testing infrastructure. Administrators can restrict access to Elastic's global managed testing infrastructure. -When you attempt to <<synthetics-get-started-project-test-and-connect-to-your-observability-project,`push` the sample monitors>>, +When you attempt to <<observability-synthetics-get-started-project-test-and-connect-to-your-observability-project,`push` the sample monitors>>, if you see an error stating that you don't have permission to use Elastic managed global locations, refer to the <<synthetics-troubleshooting-no-locations,troubleshooting guide>> for guidance. ==== @@ -119,7 +119,7 @@ refer to the <<synthetics-troubleshooting-no-locations,troubleshooting guide>> f * `.github` contains sample workflow files to use with GitHub Actions. [discrete] -[[synthetics-get-started-project-examine-sample-monitors]] +[[observability-synthetics-get-started-project-examine-sample-monitors]] == Examine sample monitors Inside the `lightweight` directory you'll find sample lightweight monitors. @@ -137,7 +137,7 @@ heartbeat.monitors: ---- For more details on lightweight monitor configuration options, -refer to <<synthetics-lightweight,Configure lightweight monitors>>. +refer to <<observability-synthetics-lightweight,Configure lightweight monitors>>. Inside the `journeys` directory you'll find sample browser monitors. Here's an example of a TypeScript file defining a browser monitor: @@ -164,10 +164,10 @@ journey('My Example Journey', ({ page, params }) => { ---- For more details on writing journeys and configuring browser monitors, -refer to <<synthetics-journeys,Scripting browser monitors>>. +refer to <<observability-synthetics-journeys,Scripting browser monitors>>. [discrete] -[[synthetics-get-started-project-test-and-connect-to-your-observability-project]] +[[observability-synthetics-get-started-project-test-and-connect-to-your-observability-project]] == Test and connect to your Observability project While inside the Synthetics project directory you can do two things with the `npx @elastic/synthetics` command: @@ -192,7 +192,7 @@ For more details on using the `push` command, refer to <<elastic-synthetics-push [NOTE] ==== -If you've <<synthetics-private-location,added a {private-location}>>, +If you've <<observability-synthetics-private-location,added a {private-location}>>, you can `push` to that {private-location}. To list available {private-location}s, @@ -201,7 +201,7 @@ with the URL for the Observability project from which to fetch available locatio ==== [discrete] -[[synthetics-get-started-project-view-in-your-observability-project]] +[[observability-synthetics-get-started-project-view-in-your-observability-project]] == View in your Observability project Then, go to **Synthetics** in your Observability project. You should see your newly pushed monitors running. @@ -213,11 +213,11 @@ When a monitor is created or updated, the first run might not occur immediately, ==== [discrete] -[[synthetics-get-started-project-next-steps]] +[[observability-synthetics-get-started-project-next-steps]] == Next steps Learn more about: -* <<synthetics-lightweight,Configuring lightweight monitors>> -* <<synthetics-create-test,Configuring browser monitors>> +* <<observability-synthetics-lightweight,Configuring lightweight monitors>> +* <<observability-synthetics-create-test,Configuring browser monitors>> * <<synthetics-projects-best-practices,Implementing best practices for working with Synthetics projects>> diff --git a/docs/en/serverless/synthetics/synthetics-get-started-ui.asciidoc b/docs/en/serverless/synthetics/synthetics-get-started-ui.asciidoc index a6bf3f51a3..428999ab99 100644 --- a/docs/en/serverless/synthetics/synthetics-get-started-ui.asciidoc +++ b/docs/en/serverless/synthetics/synthetics-get-started-ui.asciidoc @@ -1,4 +1,4 @@ -[[synthetics-get-started-ui]] +[[observability-synthetics-get-started-ui]] = Create monitors in the Synthetics UI ++++ @@ -11,13 +11,13 @@ You can create synthetic monitors directly in the UI by opening an Observability image::images/synthetics-get-started-ui.png[Diagram showing which pieces of software are used to configure monitors, create monitors, and view results when using Synthetics projects.] -This is one of <<synthetics-get-started,two approaches>> you can use to set up a synthetic monitor. +This is one of <<observability-synthetics-get-started,two approaches>> you can use to set up a synthetic monitor. [discrete] -[[synthetics-get-started-ui-prerequisites]] +[[observability-synthetics-get-started-ui-prerequisites]] == Prerequisites -You must be signed in as a user with <<synthetics-feature-roles,Editor>> access. +You must be signed in as a user with <<observability-synthetics-feature-roles,Editor>> access. // and Monitor Management must be enabled by an administrator as described in <DocLink slug="/serverless/observability/synthetics-feature-roles">Setup role</DocLink>. @@ -30,12 +30,12 @@ locations without having to manage your own infrastructure. Elastic takes care of software updates and capacity planning for you. * **{private-location}s**: {private-location}s allow you to run monitors from your own premises. To use {private-location}s you must create a {private-location} before continuing. -For step-by-step instructions, refer to <<synthetics-private-location,Monitor resources on private networks>>. +For step-by-step instructions, refer to <<observability-synthetics-private-location,Monitor resources on private networks>>. include::../transclusion/synthetics/global-managed-paid-for.asciidoc[] [discrete] -[[synthetics-get-started-ui-add-a-lightweight-monitor]] +[[observability-synthetics-get-started-ui-add-a-lightweight-monitor]] == Add a lightweight monitor To use the UI to add a lightweight monitor: @@ -53,7 +53,7 @@ If you don't see any locations listed, refer to the + [NOTE] ==== -If you've <<synthetics-private-location,added a {private-location}>>, +If you've <<observability-synthetics-private-location,added a {private-location}>>, you'll see your the {private-location} in the list of _Locations_. [role="screenshot"] @@ -68,7 +68,7 @@ image::images/private-locations-monitor-locations.png[Screenshot of Monitor loca image::images/synthetics-get-started-ui-lightweight.png[Synthetics Create monitor UI] [discrete] -[[synthetics-get-started-ui-add-a-browser-monitor]] +[[observability-synthetics-get-started-ui-add-a-browser-monitor]] == Add a browser monitor You can also create a browser monitor in the UI using an **Inline script**. @@ -80,7 +80,7 @@ which must be maintained directly in the UI. If you depend on external packages, have your journeys next to your code repository, or want to embed and manage more than one journey from a single monitor configuration, -use a <<synthetics-get-started-project,Synthetics project>> instead. +use a <<observability-synthetics-get-started-project,Synthetics project>> instead. To use the UI to add a browser monitor: @@ -106,18 +106,18 @@ image::images/synthetics-ui-inline-script.png[Configure a synthetic monitor usin Alternatively, you can use the **Script recorder** option. You can use the Elastic Synthetics Recorder to interact with a web page, export journey code that reflects all the actions you took, and upload the results in the UI. -For more information, refer to <<synthetics-recorder,Use the Synthetics Recorder>>. +For more information, refer to <<observability-synthetics-recorder,Use the Synthetics Recorder>>. ==== . Click **Advanced options** to see more ways to configure your monitor. + ** Use **Data options** to add context to the data coming from your monitors. ** Use the **Synthetics agent options** to provide fine-tuned configuration for the synthetics agent. -Read more about available options in <<synthetics-command-reference,Use the Synthetics CLI>>. +Read more about available options in <<observability-synthetics-command-reference,Use the Synthetics CLI>>. . (Optional) Click **Run test** to verify that the test is valid. . Click **Create monitor**. [discrete] -[[synthetics-get-started-ui-view-in-your-observability-project]] +[[observability-synthetics-get-started-ui-view-in-your-observability-project]] == View in your Observability project Navigate to **Synthetics** in your Observability project, where you can see screenshots of each run, @@ -133,11 +133,11 @@ When a monitor is created or updated, the first run might not occur immediately, ==== [discrete] -[[synthetics-get-started-ui-next-steps]] +[[observability-synthetics-get-started-ui-next-steps]] == Next steps Learn more about: -* <<synthetics-create-test,Writing user journeys>> to use as inline scripts -* Using the <<synthetics-recorder,Synthetics Recorder>> -* <<synthetics-lightweight,Configuring lightweight monitors>> +* <<observability-synthetics-create-test,Writing user journeys>> to use as inline scripts +* Using the <<observability-synthetics-recorder,Synthetics Recorder>> +* <<observability-synthetics-lightweight,Configuring lightweight monitors>> diff --git a/docs/en/serverless/synthetics/synthetics-get-started.asciidoc b/docs/en/serverless/synthetics/synthetics-get-started.asciidoc index 48daa73a99..749dd68bca 100644 --- a/docs/en/serverless/synthetics/synthetics-get-started.asciidoc +++ b/docs/en/serverless/synthetics/synthetics-get-started.asciidoc @@ -1,4 +1,4 @@ -[[synthetics-get-started]] +[[observability-synthetics-get-started]] = Get started preview:[] @@ -14,7 +14,7 @@ There are two ways to set up a synthetic monitor: Read more about each option below, and choose the approach that works best for you. [discrete] -[[synthetics-get-started-synthetics-project]] +[[observability-synthetics-get-started-synthetics-project]] == Synthetics project With a Synthetics project, you write tests in an external version-controlled Node.js project @@ -25,17 +25,17 @@ monitors in your Observability project. This approach works well if you want to create both browser monitors and lightweight monitors. It also allows you to configure and update monitors using a GitOps workflow. -Get started in <<synthetics-get-started-project,Create monitors in a Synthetics project>>. +Get started in <<observability-synthetics-get-started-project,Create monitors in a Synthetics project>>. image::images/synthetics-get-started-projects.png[Diagram showing which pieces of software are used to configure monitors, create monitors, and view results when using Synthetics projects.] [discrete] -[[synthetics-get-started-synthetics-ui]] +[[observability-synthetics-get-started-synthetics-ui]] == Synthetics UI You can create monitors directly in the user interface. This approach works well if you want to create and manage your monitors in the browser. -Get started in <<synthetics-get-started-ui,Create monitors in the Synthetics UI>>. +Get started in <<observability-synthetics-get-started-ui,Create monitors in the Synthetics UI>>. image::images/synthetics-get-started-ui.png[Diagram showing which pieces of software are used to configure monitors, create monitors, and view results when using the Synthetics UI.] diff --git a/docs/en/serverless/synthetics/synthetics-intro.asciidoc b/docs/en/serverless/synthetics/synthetics-intro.asciidoc index 596df3f415..6eea8a46ad 100644 --- a/docs/en/serverless/synthetics/synthetics-intro.asciidoc +++ b/docs/en/serverless/synthetics/synthetics-intro.asciidoc @@ -1,4 +1,4 @@ -[[monitor-synthetics]] +[[observability-monitor-synthetics]] = Synthetic monitoring preview:[] @@ -6,24 +6,24 @@ preview:[] [NOTE] ==== The Synthetics UI is for viewing result data from monitors created and managed -directly in the <<synthetics-get-started-ui,Synthetics UI>> or managed externally -using a <<synthetics-get-started-project,Synthetics project>>. +directly in the <<observability-synthetics-get-started-ui,Synthetics UI>> or managed externally +using a <<observability-synthetics-get-started-project,Synthetics project>>. This can include both lightweight and browser-based monitors, and can include monitors running from either Elastic's global managed testing infrastructure or from -<<synthetics-private-location,{private-location}s>>. +<<observability-synthetics-private-location,{private-location}s>>. ==== Synthetics periodically checks the status of your services and applications. Monitor the availability of network endpoints and services using the following types of monitors: -* <<monitor-synthetics-lightweight-https-tcp-and-icmp-monitors,Lightweight HTTP/S, TCP, and ICMP monitors>> -* <<monitor-synthetics-browser-monitors,Browser monitors>> +* <<observability-monitor-synthetics-lightweight-https-tcp-and-icmp-monitors,Lightweight HTTP/S, TCP, and ICMP monitors>> +* <<observability-monitor-synthetics-browser-monitors,Browser monitors>> [role="screenshot"] image::images/synthetics-monitor-page.png[Synthetics UI] [discrete] -[[monitor-synthetics-lightweight-https-tcp-and-icmp-monitors]] +[[observability-monitor-synthetics-lightweight-https-tcp-and-icmp-monitors]] == Lightweight HTTP/S, TCP, and ICMP monitors You can monitor the status of network endpoints using the following lightweight checks: @@ -43,10 +43,10 @@ You can monitor the status of network endpoints using the following lightweight | Monitor the services running on your hosts. The TCP monitor checks individual ports to make sure the service is accessible and running. |=== -To set up your first monitor, refer to <<synthetics-get-started,Get started>>. +To set up your first monitor, refer to <<observability-synthetics-get-started,Get started>>. [discrete] -[[monitor-synthetics-browser-monitors]] +[[observability-monitor-synthetics-browser-monitors]] == Browser monitors Real browser synthetic monitoring enables you to test critical actions and requests that an end-user would make @@ -63,4 +63,4 @@ view each synthetic monitoring journey in your Observability project side-by-sid Alerting helps you detect degraded performance or broken actions before your users do. By receiving alerts early, you can fix issues before they impact your bottom line or customer experience. -To set up your first monitor, refer to <<synthetics-get-started,Get started>>. +To set up your first monitor, refer to <<observability-synthetics-get-started,Get started>>. diff --git a/docs/en/serverless/synthetics/synthetics-journeys.asciidoc b/docs/en/serverless/synthetics/synthetics-journeys.asciidoc index c17c18f510..05709d39dd 100644 --- a/docs/en/serverless/synthetics/synthetics-journeys.asciidoc +++ b/docs/en/serverless/synthetics/synthetics-journeys.asciidoc @@ -1,4 +1,4 @@ -[[synthetics-journeys]] +[[observability-synthetics-journeys]] = Scripting browser monitors preview:[] @@ -13,11 +13,11 @@ Synthetic monitors can also help you catch bugs in features that don't get much Start by learning the basics of synthetic monitoring, including how to: -* <<synthetics-create-test,Write a synthetic test>> +* <<observability-synthetics-create-test,Write a synthetic test>> * <<synthetics-test-locally,Test locally>> -* <<synthetics-monitor-use,Configure individual browser monitors>> -* <<synthetics-params-secrets,Work with params and secrets>> -* <<synthetics-recorder,Use the Synthetics Recorder>> +* <<observability-synthetics-monitor-use,Configure individual browser monitors>> +* <<observability-synthetics-params-secrets,Work with params and secrets>> +* <<observability-synthetics-recorder,Use the Synthetics Recorder>> [role="screenshot"] image::images/synthetic-monitor-lifecycle.png[Diagram of the lifecycle of a synthetic monitor: write a test, test it locally, create a monitor, manage a monitor, delete a monitor] diff --git a/docs/en/serverless/synthetics/synthetics-lightweight.asciidoc b/docs/en/serverless/synthetics/synthetics-lightweight.asciidoc index 8112f66d2b..637f414d50 100644 --- a/docs/en/serverless/synthetics/synthetics-lightweight.asciidoc +++ b/docs/en/serverless/synthetics/synthetics-lightweight.asciidoc @@ -1,4 +1,4 @@ -[[synthetics-lightweight]] +[[observability-synthetics-lightweight]] = Configure lightweight monitors preview:[] @@ -15,23 +15,23 @@ not. to make sure the service is accessible and running. Lightweight monitors can be configured using either the <<synthetics-lightweight-ui,Synthetics UI>> -or a <<synthetics-lightweight-synthetics-project,Synthetics project>>. +or a <<observability-synthetics-lightweight-synthetics-project,Synthetics project>>. [discrete] [[synthetics-lightweight-ui]] == Synthetics UI To use the UI, go to **Synthetics** in your Observability project to create and configure monitors. -For step-by-step instructions, refer to <<synthetics-get-started-ui,Create monitors in the Synthetics UI>>. +For step-by-step instructions, refer to <<observability-synthetics-get-started-ui,Create monitors in the Synthetics UI>>. [role="screenshot"] image::images/synthetics-get-started-ui-lightweight.png[Synthetics Create monitor UI] [discrete] -[[synthetics-lightweight-synthetics-project]] +[[observability-synthetics-lightweight-synthetics-project]] == Synthetics project -To use YAML files to create lightweight monitors in a Synthetics project, <<synthetics-get-started-project,set up the Synthetics project>> +To use YAML files to create lightweight monitors in a Synthetics project, <<observability-synthetics-get-started-project,set up the Synthetics project>> and configure monitors in YAML files in the `lightweight` directory. In each YAML file, define a set of `monitors` to check your remote hosts. diff --git a/docs/en/serverless/synthetics/synthetics-manage-monitors.asciidoc b/docs/en/serverless/synthetics/synthetics-manage-monitors.asciidoc index ae21b393b2..cf4445c0bc 100644 --- a/docs/en/serverless/synthetics/synthetics-manage-monitors.asciidoc +++ b/docs/en/serverless/synthetics/synthetics-manage-monitors.asciidoc @@ -1,9 +1,9 @@ -[[synthetics-manage-monitors]] +[[observability-synthetics-manage-monitors]] = Manage monitors preview:[] -After you've <<synthetics-get-started,created a synthetic monitor>>, +After you've <<observability-synthetics-get-started,created a synthetic monitor>>, you'll need to manage that monitor over time. This might include updating or permanently deleting an existing monitor. @@ -48,7 +48,7 @@ configuration in your journey's code or in the Synthetics UI using the _Enabled_ This is only relevant to monitors created using a Synthetics project. ==== -After you've <<synthetics-get-started-project,set up a Synthetics project>>, +After you've <<observability-synthetics-get-started-project,set up a Synthetics project>>, there are some best practices you can implement to manage the Synthetics project effectively. [discrete] diff --git a/docs/en/serverless/synthetics/synthetics-manage-retention.asciidoc b/docs/en/serverless/synthetics/synthetics-manage-retention.asciidoc index 856191b009..66bfb3fc37 100644 --- a/docs/en/serverless/synthetics/synthetics-manage-retention.asciidoc +++ b/docs/en/serverless/synthetics/synthetics-manage-retention.asciidoc @@ -1,4 +1,4 @@ -[[synthetics-manage-retention]] +[[observability-synthetics-manage-retention]] = Manage data retention preview:[] @@ -14,7 +14,7 @@ If you want to reduce the amount of storage required or store data for longer, you can customize how long to retain data for each data stream. [discrete] -[[synthetics-manage-retention-synthetics-data-streams]] +[[observability-synthetics-manage-retention-synthetics-data-streams]] == Synthetics data streams There are six data streams recorded by synthetic monitors: @@ -60,7 +60,7 @@ The relative sizes of each vary depending on the sites being checked with network data usually being the larger of the two by a significant factor. [discrete] -[[synthetics-manage-retention-customize-data-stream-lifecycles]] +[[observability-synthetics-manage-retention-customize-data-stream-lifecycles]] == Customize data stream lifecycles If Synthetics browser data streams are storing data longer than necessary, diff --git a/docs/en/serverless/synthetics/synthetics-monitor-use.asciidoc b/docs/en/serverless/synthetics/synthetics-monitor-use.asciidoc index 382abc95e4..af2bf4c7cf 100644 --- a/docs/en/serverless/synthetics/synthetics-monitor-use.asciidoc +++ b/docs/en/serverless/synthetics/synthetics-monitor-use.asciidoc @@ -1,4 +1,4 @@ -[[synthetics-monitor-use]] +[[observability-synthetics-monitor-use]] = Configure individual browser monitors ++++ @@ -9,12 +9,12 @@ preview:[] [NOTE] ==== -This is only relevant for monitors that are created and managed using a <<synthetics-get-started-synthetics-project,Synthetics project>>. +This is only relevant for monitors that are created and managed using a <<observability-synthetics-get-started-synthetics-project,Synthetics project>>. For more information on configuring browser monitors added in the UI, -refer to <<synthetics-get-started-ui,Create monitors in the Synthetics UI>>. +refer to <<observability-synthetics-get-started-ui,Create monitors in the Synthetics UI>>. ==== -After <<synthetics-create-test,writing synthetic journeys>>, you can use `monitor.use` +After <<observability-synthetics-create-test,writing synthetic journeys>>, you can use `monitor.use` to configure the browser monitors that will run your tests. You'll need to set a few configuration options: @@ -22,7 +22,7 @@ You'll need to set a few configuration options: * **Give your monitor a name.** Provide a human readable name and a unique ID for the monitor. This will appear in your Observability project where you can view and manage monitors after they're created. * **Set the schedule.** Specify the interval at which your tests will run. * **Specify where the monitors should run.** You can run monitors on Elastic's global managed testing infrastructure -or <<synthetics-private-location,create a {private-location}>> to run monitors from your own premises. +or <<observability-synthetics-private-location,create a {private-location}>> to run monitors from your own premises. * **Set other options as needed.** There are several other options you can set to customize your implementation including params, tags, screenshot options, throttling options, and more. Configure each monitor directly in your `journey` code using `monitor.use`. @@ -58,4 +58,4 @@ journey('Ensure placeholder is correct', ({ page, params }) => { For each journey, you can specify its `schedule` and the `locations` in which it runs. When those options are not set, Synthetics will use the default values in the global configuration file. -For more details, refer to <<synthetics-configuration,Configure a Synthetics project>>. +For more details, refer to <<observability-synthetics-configuration,Configure a Synthetics project>>. diff --git a/docs/en/serverless/synthetics/synthetics-params-secrets.asciidoc b/docs/en/serverless/synthetics/synthetics-params-secrets.asciidoc index dc1231f5eb..7c31afc78a 100644 --- a/docs/en/serverless/synthetics/synthetics-params-secrets.asciidoc +++ b/docs/en/serverless/synthetics/synthetics-params-secrets.asciidoc @@ -1,4 +1,4 @@ -[[synthetics-params-secrets]] +[[observability-synthetics-params-secrets]] = Work with params and secrets preview:[] @@ -24,7 +24,7 @@ Param values can be declared by any of the following methods: [NOTE] ==== If you are creating and managing synthetic monitors using a -<<synthetics-get-started-project,Synthetics project>>, you can also use regular environment +<<observability-synthetics-get-started-project,Synthetics project>>, you can also use regular environment variables via the standard node `process.env` global object. ==== @@ -42,7 +42,7 @@ When running a script using the CLI, _Global parameters_ defined in the Observab on the test because it won't have access to the Observability project. [discrete] -[[synthetics-params-secrets-global-parameters-in-your-observability-project]] +[[observability-synthetics-params-secrets-global-parameters-in-your-observability-project]] === Global parameters in your Observability project From any page in the Observability project's **Synthetics** section: @@ -82,7 +82,7 @@ The example above uses the `env` variable, which corresponds to the value of the [[synthetics-cli-params]] === CLI argument -To set parameters when running <<synthetics-command-reference,`npx @elastic/synthetics` on the command line>>, +To set parameters when running <<observability-synthetics-command-reference,`npx @elastic/synthetics` on the command line>>, use the `--params` or `-p` flag. The provided map is merged over any existing variables defined in the `synthetics.config.{js,ts}` file. For example, to override the `my_url` parameter, you would run: @@ -100,7 +100,7 @@ You can use params in both lightweight and browser monitors created in either a Synthetics project or the Synthetics UI in your Observability project. [discrete] -[[synthetics-params-secrets-in-a-synthetics-project]] +[[observability-synthetics-params-secrets-in-a-synthetics-project]] === In a Synthetics project For lightweight monitors in a Synthetics project, wrap the name of the param in `${}` (for example, `${my_url}`). diff --git a/docs/en/serverless/synthetics/synthetics-private-location.asciidoc b/docs/en/serverless/synthetics/synthetics-private-location.asciidoc index 0ef50ed2e0..67fce05aa6 100644 --- a/docs/en/serverless/synthetics/synthetics-private-location.asciidoc +++ b/docs/en/serverless/synthetics/synthetics-private-location.asciidoc @@ -1,4 +1,4 @@ -[[synthetics-private-location]] +[[observability-synthetics-private-location]] = Monitor resources on private networks preview:[] @@ -168,4 +168,4 @@ a factor of 5. In the previous example that would mean allocating 5 slots. [[synthetics-private-location-next]] == Next steps -Now you can add monitors to your {private-location} in <<synthetics-get-started-ui,the Synthetics UI>> or using the <<synthetics-get-started-project,Elastic Synthetics library's `push` method>>. +Now you can add monitors to your {private-location} in <<observability-synthetics-get-started-ui,the Synthetics UI>> or using the <<observability-synthetics-get-started-project,Elastic Synthetics library's `push` method>>. diff --git a/docs/en/serverless/synthetics/synthetics-recorder.asciidoc b/docs/en/serverless/synthetics/synthetics-recorder.asciidoc index 67e4bb4799..9cb1c57c90 100644 --- a/docs/en/serverless/synthetics/synthetics-recorder.asciidoc +++ b/docs/en/serverless/synthetics/synthetics-recorder.asciidoc @@ -1,4 +1,4 @@ -[[synthetics-recorder]] +[[observability-synthetics-recorder]] = Use the Synthetics Recorder preview:[] @@ -8,7 +8,7 @@ preview:[] As with any script recording technology, the Elastic Synthetics Recorder should be used as a tool to help create the main structure of the script. For simpler sites, you may be able to use the Synthetics Recorder's output directly to create a synthetic monitor, but for more complex and dynamic sites, or to limit flakiness, you'll likely need to edit its output before using it to create a monitor. ==== -You can use the Synthetics Recorder to <<synthetics-create-test,write a synthetic test>> by interacting with a web page and exporting journey code that reflects all the actions you took. +You can use the Synthetics Recorder to <<observability-synthetics-create-test,write a synthetic test>> by interacting with a web page and exporting journey code that reflects all the actions you took. [role="screenshot"] image::images/synthetics-create-test-script-recorder.png[Elastic Synthetics Recorder after recording a journey and clicking Export] @@ -140,7 +140,7 @@ When you are satisfied with journey you've created, you can export it from the r Click **Export** to view the final journey code. From there you can use the code by: -* Copy and pasting code containing all steps into a new or existing <<synthetics-get-started-project,Synthetics project>> or an <<synthetics-get-started-ui,inline monitor>>. +* Copy and pasting code containing all steps into a new or existing <<observability-synthetics-get-started-project,Synthetics project>> or an <<observability-synthetics-get-started-ui,inline monitor>>. * Click **Export** to save a JavaScript file containing all steps. You can also check **Export as project** and either copy and paste or **Export** diff --git a/docs/en/serverless/synthetics/synthetics-scale-and-architect.asciidoc b/docs/en/serverless/synthetics/synthetics-scale-and-architect.asciidoc index d46529f5aa..1deaba9b60 100644 --- a/docs/en/serverless/synthetics/synthetics-scale-and-architect.asciidoc +++ b/docs/en/serverless/synthetics/synthetics-scale-and-architect.asciidoc @@ -1,4 +1,4 @@ -[[synthetics-scale-and-architect]] +[[observability-synthetics-scale-and-architect]] = Scale and architect a Synthetics deployment ++++ @@ -21,4 +21,4 @@ Many of the views in the Synthetics UI are tag-aware and can group data by tag. [[synthetics-custom-dashboards]] == Create custom dashboards -If we don't provide a UI for your exact needs, you can use <<dashboards,dashboards>> to build custom visualizations. +If we don't provide a UI for your exact needs, you can use <<observability-dashboards,dashboards>> to build custom visualizations. diff --git a/docs/en/serverless/synthetics/synthetics-security-encryption.asciidoc b/docs/en/serverless/synthetics/synthetics-security-encryption.asciidoc index 83e8466450..dc3110d6da 100644 --- a/docs/en/serverless/synthetics/synthetics-security-encryption.asciidoc +++ b/docs/en/serverless/synthetics/synthetics-security-encryption.asciidoc @@ -1,4 +1,4 @@ -[[synthetics-security-encryption]] +[[observability-synthetics-security-encryption]] = Synthetics Encryption and Security preview:[] @@ -7,7 +7,7 @@ Elastic Synthetics was designed with security in mind encrypting both persisted This page catalogs the points within Elastic Synthetics where data is either stored or transmitted in an encrypted fashion. [discrete] -[[synthetics-security-encryption-synthetics-ui]] +[[observability-synthetics-security-encryption-synthetics-ui]] == Synthetics UI Data is stored in {kibana-ref}/xpack-security-secure-saved-objects.html[Kibana Secure Saved Objects], diff --git a/docs/en/serverless/synthetics/synthetics-settings.asciidoc b/docs/en/serverless/synthetics/synthetics-settings.asciidoc index 5e927abb6a..1e3fb6af4e 100644 --- a/docs/en/serverless/synthetics/synthetics-settings.asciidoc +++ b/docs/en/serverless/synthetics/synthetics-settings.asciidoc @@ -1,4 +1,4 @@ -[[synthetics-settings]] +[[observability-synthetics-settings]] = Configure Synthetics settings preview:[] @@ -43,16 +43,16 @@ image::images/synthetics-settings-disable-default-rules.png[Rules page with defa ==== You can enable and disable default alerts for individual monitors in a few ways: -* In the UI when you <<synthetics-get-started-ui,create a monitor>>. +* In the UI when you <<observability-synthetics-get-started-ui,create a monitor>>. * In the UI _after_ a monitor is already created, on the **Monitors** page or on the **Edit monitor** page for the monitor. -* In a Synthetics project when <<synthetics-lightweight,configuring a lightweight monitor>>. +* In a Synthetics project when <<observability-synthetics-lightweight,configuring a lightweight monitor>>. ==== In the **Alerting** tab on the Synthetics Settings page, you can add and configure connectors. If you are running in Elastic Cloud, then an SMTP connector will automatically be configured, allowing you to easily set up email alerts. -Read more about all available connectors in <<create-anomaly-alert-rule,Action types>>. +Read more about all available connectors in <<observability-create-anomaly-alert-rule,Action types>>. [role="screenshot"] image::images/synthetics-settings-alerting.png[Alerting tab on the Synthetics Settings page in an Observability project] @@ -79,7 +79,7 @@ Global parameters can be defined once and used across the configuration of light In the **Global parameters** tab, you can define variables and parameters. This is one of several methods you can use to define variables and parameters. -To learn more about the other methods and which methods take precedence over others, see <<synthetics-params-secrets,Work with params and secrets>>. +To learn more about the other methods and which methods take precedence over others, see <<observability-synthetics-params-secrets,Work with params and secrets>>. [role="screenshot"] image::images/synthetics-settings-global-parameters.png[Global parameters tab on the Synthetics Settings page in an Observability project] @@ -94,7 +94,7 @@ You can customize how long synthetics data is stored by creating your own index and attaching it to the relevant custom Component Template in Stack Management. In the **Data retention** tab, use the links to jump to the relevant policy for each data stream. -Learn more about the data included in each data stream in <<synthetics-manage-retention,Manage data retention>>. +Learn more about the data included in each data stream in <<observability-synthetics-manage-retention,Manage data retention>>. [role="screenshot"] image::images/synthetics-settings-data-retention.png[Data retention tab on the Synthetics Settings page in an Observability project] @@ -106,12 +106,12 @@ image::images/synthetics-settings-data-retention.png[Data retention tab on the S Project API keys are used to push monitors created and managed in a Synthetics project remotely from a CLI or CD pipeline. In the **Project API keys** tab, you can generate API keys to use with your Synthetics project. -Learn more about using API keys in <<synthetics-get-started-project,Create monitors with a Synthetics project>>. +Learn more about using API keys in <<observability-synthetics-get-started-project,Create monitors with a Synthetics project>>. [IMPORTANT] ==== To create a Project API key, you must be logged in as a user with -<<synthetics-feature-roles,Editor>> access. +<<observability-synthetics-feature-roles,Editor>> access. ==== [role="screenshot"] diff --git a/docs/en/serverless/synthetics/synthetics-troubleshooting.asciidoc b/docs/en/serverless/synthetics/synthetics-troubleshooting.asciidoc index 20c047c2ea..312a3952cf 100644 --- a/docs/en/serverless/synthetics/synthetics-troubleshooting.asciidoc +++ b/docs/en/serverless/synthetics/synthetics-troubleshooting.asciidoc @@ -1,4 +1,4 @@ -[[synthetics-troubleshooting]] +[[observability-synthetics-troubleshooting]] = Troubleshooting Synthetics ++++ @@ -13,7 +13,7 @@ preview:[] For debugging synthetic tests locally, you can set an environment variable, `DEBUG=synthetics`, to capture Synthetics agent logs when using the -<<synthetics-command-reference,Synthetics CLI>>. +<<observability-synthetics-command-reference,Synthetics CLI>>. [discrete] [[synthetics-troubleshooting-common-issues]] @@ -96,8 +96,8 @@ available yet. There are a few ways to fix this: -* If you have <<synthetics-feature-roles,Editor>> access, you can <<monitor-via-private-agent,create a new Private Location>>. Then try creating the monitor again. -* If you do _not_ have the right privileges to create a Private Location, you can ask an <<synthetics-feature-roles,Admin>> to create a Private Location or give you the necessary privileges so you can <<monitor-via-private-agent,create a new Private Location>>. Then try creating the monitor again. +* If you have <<observability-synthetics-feature-roles,Editor>> access, you can <<monitor-via-private-agent,create a new Private Location>>. Then try creating the monitor again. +* If you do _not_ have the right privileges to create a Private Location, you can ask an <<observability-synthetics-feature-roles,Admin>> to create a Private Location or give you the necessary privileges so you can <<monitor-via-private-agent,create a new Private Location>>. Then try creating the monitor again. // * If you want to create a monitor to run on Elastic's global managed infrastructure, ask an <DocLink slug="/serverless/observability/synthetics-feature-roles">Admin</DocLink> to update <DocLink slug="/serverless/observability/synthetics-feature-roles" section="to-restrict-using-elastics-global-managed-infrastructure">`Synthetics and Uptime` sub-feature privileges</DocLink> for the role you're currently assigned. Then try creating the monitor again. diff --git a/docs/en/serverless/transclusion/apm/guide/about/go.asciidoc b/docs/en/serverless/transclusion/apm/guide/about/go.asciidoc index 7a0ff7dc5e..6cdc9d45c5 100644 --- a/docs/en/serverless/transclusion/apm/guide/about/go.asciidoc +++ b/docs/en/serverless/transclusion/apm/guide/about/go.asciidoc @@ -31,7 +31,7 @@ This collection happens in a background goroutine that is automatically started **Learn more** -If you're ready to give Elastic APM a try, see <<apm-get-started,Get started with traces and APM>>. +If you're ready to give Elastic APM a try, see <<observability-apm-get-started,Get started with traces and APM>>. See the {apm-go-ref}/introduction.html[Go agent reference] for full documentation, including: diff --git a/docs/en/serverless/transclusion/apm/guide/about/java.asciidoc b/docs/en/serverless/transclusion/apm/guide/about/java.asciidoc index b9423327c6..786840398c 100644 --- a/docs/en/serverless/transclusion/apm/guide/about/java.asciidoc +++ b/docs/en/serverless/transclusion/apm/guide/about/java.asciidoc @@ -13,7 +13,7 @@ Transactions and Spans are sent to Elastic, where they're transformed, stored, a **Learn more** -If you're ready to give Elastic APM a try, see <<apm-get-started,Get started with traces and APM>>. +If you're ready to give Elastic APM a try, see <<observability-apm-get-started,Get started with traces and APM>>. See the {apm-java-ref}/intro.html[Java agent reference] for full documentation, including: diff --git a/docs/en/serverless/transclusion/apm/guide/about/net.asciidoc b/docs/en/serverless/transclusion/apm/guide/about/net.asciidoc index 321026b365..7dd952cbac 100644 --- a/docs/en/serverless/transclusion/apm/guide/about/net.asciidoc +++ b/docs/en/serverless/transclusion/apm/guide/about/net.asciidoc @@ -15,7 +15,7 @@ These events, called Transactions and Spans, are sent to Elastic, where they're **Learn more** -If you're ready to give Elastic APM a try, see <<apm-get-started,Get started with traces and APM>>. +If you're ready to give Elastic APM a try, see <<observability-apm-get-started,Get started with traces and APM>>. See the {apm-dotnet-ref}/intro.html[.NET agent reference] for full documentation, including: diff --git a/docs/en/serverless/transclusion/apm/guide/about/node.asciidoc b/docs/en/serverless/transclusion/apm/guide/about/node.asciidoc index a3bfe0e611..c025818f43 100644 --- a/docs/en/serverless/transclusion/apm/guide/about/node.asciidoc +++ b/docs/en/serverless/transclusion/apm/guide/about/node.asciidoc @@ -13,7 +13,7 @@ These events, called Transactions and Spans, are sent to Elastic, where they're **Learn more** -If you're ready to give Elastic APM a try, see <<apm-get-started,Get started with traces and APM>>. +If you're ready to give Elastic APM a try, see <<observability-apm-get-started,Get started with traces and APM>>. See the {apm-node-ref}/intro.html[Node.js agent reference] for full documentation, including: diff --git a/docs/en/serverless/transclusion/apm/guide/about/php.asciidoc b/docs/en/serverless/transclusion/apm/guide/about/php.asciidoc index 387185df71..86903edae6 100644 --- a/docs/en/serverless/transclusion/apm/guide/about/php.asciidoc +++ b/docs/en/serverless/transclusion/apm/guide/about/php.asciidoc @@ -7,7 +7,7 @@ This extension must be installed in your PHP environment. **Learn more** -If you're ready to give Elastic APM a try, see <<apm-get-started,Get started with traces and APM>>. +If you're ready to give Elastic APM a try, see <<observability-apm-get-started,Get started with traces and APM>>. See the {apm-php-ref}/intro.html[PHP agent reference] for full documentation, including: diff --git a/docs/en/serverless/transclusion/apm/guide/about/python.asciidoc b/docs/en/serverless/transclusion/apm/guide/about/python.asciidoc index 3fcae6605c..afbaf9cb10 100644 --- a/docs/en/serverless/transclusion/apm/guide/about/python.asciidoc +++ b/docs/en/serverless/transclusion/apm/guide/about/python.asciidoc @@ -19,7 +19,7 @@ This collection happens in a background thread that is started by the agent. **Learn more** -If you're ready to give Elastic APM a try, see <<apm-get-started,Get started with traces and APM>>. +If you're ready to give Elastic APM a try, see <<observability-apm-get-started,Get started with traces and APM>>. See the {apm-py-ref}/getting-started.html[Python agent reference] for full documentation, including: diff --git a/docs/en/serverless/transclusion/apm/guide/about/ruby.asciidoc b/docs/en/serverless/transclusion/apm/guide/about/ruby.asciidoc index 98f9d14edc..f73b2a0d64 100644 --- a/docs/en/serverless/transclusion/apm/guide/about/ruby.asciidoc +++ b/docs/en/serverless/transclusion/apm/guide/about/ruby.asciidoc @@ -13,7 +13,7 @@ These events, called Transactions and Spans, are sent to Elastic, where they're **Learn more** -If you're ready to give Elastic APM a try, see <<apm-get-started,Get started with traces and APM>>. +If you're ready to give Elastic APM a try, see <<observability-apm-get-started,Get started with traces and APM>>. See the {apm-ruby-ref}/introduction.html[Ruby agent reference] for full documentation, including: diff --git a/docs/en/serverless/transclusion/apm/guide/open-telemetry/otel-get-started.asciidoc b/docs/en/serverless/transclusion/apm/guide/open-telemetry/otel-get-started.asciidoc index 574d4bee28..89396f32a4 100644 --- a/docs/en/serverless/transclusion/apm/guide/open-telemetry/otel-get-started.asciidoc +++ b/docs/en/serverless/transclusion/apm/guide/open-telemetry/otel-get-started.asciidoc @@ -2,4 +2,4 @@ Elastic integrates with OpenTelemetry, allowing you to reuse your existing instr to easily send observability data to Elastic. For more information on how to combine Elastic and OpenTelemetry, -refer to <<apm-agents-opentelemetry>>. +refer to <<observability-apm-agents-opentelemetry>>. diff --git a/docs/en/serverless/transclusion/apm/guide/tab-widgets/no-data-indexed/fleet-managed.asciidoc b/docs/en/serverless/transclusion/apm/guide/tab-widgets/no-data-indexed/fleet-managed.asciidoc index 0affe08c6f..5c8f301a2c 100644 --- a/docs/en/serverless/transclusion/apm/guide/tab-widgets/no-data-indexed/fleet-managed.asciidoc +++ b/docs/en/serverless/transclusion/apm/guide/tab-widgets/no-data-indexed/fleet-managed.asciidoc @@ -3,10 +3,10 @@ Double check that the intake URL and API key are correct in your APM agent configuration. Reference the relevant {apm-agents-ref}/index.html[{apm-agent} documentation] for details on how to set these configuration variables. -To create a new API key, see <<apm-keep-data-secure-create-a-new-api-key,Create a new API key>>. +To create a new API key, see <<observability-apm-keep-data-secure-create-a-new-api-key,Create a new API key>>. If you see requests coming through the managed intake service but they are not accepted (a response code other than `202`), -see <<apm-troubleshooting-common-response-codes,managed intake service response codes>> to narrow down the possible causes. +see <<observability-apm-troubleshooting-common-response-codes,managed intake service response codes>> to narrow down the possible causes. **Are there instrumentation gaps?** diff --git a/docs/en/serverless/transclusion/kibana/apm/service-overview/dependencies.asciidoc b/docs/en/serverless/transclusion/kibana/apm/service-overview/dependencies.asciidoc index e57448802b..966e09a049 100644 --- a/docs/en/serverless/transclusion/kibana/apm/service-overview/dependencies.asciidoc +++ b/docs/en/serverless/transclusion/kibana/apm/service-overview/dependencies.asciidoc @@ -1,7 +1,7 @@ The **Dependencies** table displays a list of downstream services or external connections relevant to the service at the selected time range. The table displays latency, throughput, failed transaction rate, and the impact of each dependency. By default, dependencies are sorted by _Impact_ to show the most used and the slowest dependency. -If there is a particular dependency you are interested in, click **<<apm-dependencies,View dependencies>>** to learn more about it. +If there is a particular dependency you are interested in, click **<<observability-apm-dependencies,View dependencies>>** to learn more about it. //// /* TODO: FIX THIS IMAGE diff --git a/docs/en/serverless/transclusion/kibana/apm/service-overview/throughput-transactions.asciidoc b/docs/en/serverless/transclusion/kibana/apm/service-overview/throughput-transactions.asciidoc index 4de89d8b09..deb0cf7448 100644 --- a/docs/en/serverless/transclusion/kibana/apm/service-overview/throughput-transactions.asciidoc +++ b/docs/en/serverless/transclusion/kibana/apm/service-overview/throughput-transactions.asciidoc @@ -6,7 +6,7 @@ Transactions that share the same name are grouped, and only one entry is display By default, transaction groups are sorted by _Impact_ to show the most used and slowest endpoints in your service. If there is a particular endpoint you are interested in, click **View transactions** to view a -list of similar transactions on the <<apm-transactions,transactions overview>> page. +list of similar transactions on the <<observability-apm-transactions,transactions overview>> page. //// /* TODO: Figure out this image diff --git a/docs/en/serverless/transclusion/kibana/logs/log-overview.asciidoc b/docs/en/serverless/transclusion/kibana/logs/log-overview.asciidoc index 6c5d4706d2..ad54ec568a 100644 --- a/docs/en/serverless/transclusion/kibana/logs/log-overview.asciidoc +++ b/docs/en/serverless/transclusion/kibana/logs/log-overview.asciidoc @@ -3,4 +3,4 @@ Logs provide detailed information about specific events, and are crucial to succ If you've correlated your application's logs and traces, you never have to search for relevant data; it's already available to you. Viewing log and trace data together allows you to quickly diagnose and solve problems. To learn how to correlate your logs with your instrumented services, -refer to <<correlate-application-logs>>. +refer to <<observability-correlate-application-logs>>. diff --git a/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-logs/content/logs.asciidoc b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-logs/content/logs.asciidoc index a6334e036d..2cfbb03154 100644 --- a/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-logs/content/logs.asciidoc +++ b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-logs/content/logs.asciidoc @@ -36,7 +36,7 @@ processors: <6> <4> {filebeat} will recursively de-dot keys in the decoded JSON, and expand them into a hierarchical object structure. -<5> The `service.name` (required), `service.version` (optional) and `service.environment` (optional) of the service you're collecting logs from, used for <<correlate-application-logs-log-correlation,Log correlation>>. +<5> The `service.name` (required), `service.version` (optional) and `service.environment` (optional) of the service you're collecting logs from, used for <<observability-correlate-application-logs-log-correlation,Log correlation>>. <6> Processors enhance your data. See {filebeat-ref}/filtering-and-enhancing-data.html[processors] to learn more. endif::[] diff --git a/docs/en/serverless/transclusion/synthetics/configuration/monitor-config-options.asciidoc b/docs/en/serverless/transclusion/synthetics/configuration/monitor-config-options.asciidoc index 48b349529b..db01f67693 100644 --- a/docs/en/serverless/transclusion/synthetics/configuration/monitor-config-options.asciidoc +++ b/docs/en/serverless/transclusion/synthetics/configuration/monitor-config-options.asciidoc @@ -23,7 +23,7 @@ To list available locations you can: Locations will be listed in _Locations_. `privateLocations` (`Array<string>`):: -The <<synthetics-private-location,{private-location}s>> to which the monitors will be deployed. These {private-location}s refer to locations hosted and managed by you, whereas +The <<observability-synthetics-private-location,{private-location}s>> to which the monitors will be deployed. These {private-location}s refer to locations hosted and managed by you, whereas `locations` are hosted by Elastic. You can specify a {private-location} using the location's name. + To list available {private-location}s you can: diff --git a/docs/en/serverless/transclusion/synthetics/reference/lightweight-config/common.asciidoc b/docs/en/serverless/transclusion/synthetics/reference/lightweight-config/common.asciidoc index 26ffb838c3..8182a8ce74 100644 --- a/docs/en/serverless/transclusion/synthetics/reference/lightweight-config/common.asciidoc +++ b/docs/en/serverless/transclusion/synthetics/reference/lightweight-config/common.asciidoc @@ -1,14 +1,14 @@ |=== | Option (type) | Description -| [[common-monitor-type]]**`type`** (`"http"`, `"icmp"`, or `"tcp"`) +| [[monitor-type]]**`type`** (`"http"`, `"icmp"`, or `"tcp"`) a| **Required**. The type of monitor to run. One of: * `http`: Connects via HTTP and optionally verifies that the host returns the expected response. * `icmp`: Uses an ICMP (v4 and v6) Echo Request to ping the configured hosts. Requires special permissions or root access. * `tcp`: Connects via TCP and optionally verifies the endpoint by sending and/or receiving a custom payload. -| [[common-monitor-id]]**`id`** +| [[monitor-id]]**`id`** (<<synthetics-lightweight-data-string,string>>) a| **Required**. A unique identifier for this configuration. This should not change with edits to the monitor configuration regardless of changes to any config fields. @@ -47,11 +47,11 @@ name: Uploader service name: Example website ---- -| [[common-monitor-service_name]]**`service.name`** +| [[monitor-service_name]]**`service.name`** (<<synthetics-lightweight-data-string,string>>) | APM service name for this monitor. Corresponds to the `service.name` ECS field. Set this when monitoring an app that is also using APM to enable integrations between Synthetics and APM data in your Observability project. -| [[common-monitor-enabled]]**`enabled`** +| [[monitor-enabled]]**`enabled`** (<<synthetics-lightweight-data-bool,boolean>>) a| Whether the monitor is enabled. @@ -64,7 +64,7 @@ a| Whether the monitor is enabled. enabled: false ---- -| [[common-monitor-schedule]]**`schedule`** +| [[monitor-schedule]]**`schedule`** (<<synthetics-lightweight-data-duration,duration>>) a| **Required**. The task schedule. @@ -81,7 +81,7 @@ Run the task every 5 minutes from the time the monitor was started. schedule: @every 5m ---- -| [[common-monitor-timeout]]**`timeout`** +| [[monitor-timeout]]**`timeout`** (<<synthetics-lightweight-data-duration,duration>>) a| The total running time for each ping test. This is the total time allowed for testing the connection and exchanging data. @@ -112,8 +112,8 @@ tags: tags: ["tag one", "tag two"] ---- -| [[common-monitor-mode]]**`mode`** -(`"any"` \| `"all"`) +| [[monitor-mode]]**`mode`** +(`"any"` or `"all"`) a| One of two modes in which to run the monitor: * `any`: The monitor pings only one IP address for a hostname. @@ -124,7 +124,7 @@ a| One of two modes in which to run the monitor: **Example**: If you're using a DNS-load balancer and want to ping every IP address for the specified hostname, you should use `all`. -| [[common-monitor-ipv4]]**`ipv4`** +| [[monitor-ipv4]]**`ipv4`** (<<synthetics-lightweight-data-bool,boolean>>) a| Whether to ping using the ipv4 protocol if hostnames are configured. @@ -137,7 +137,7 @@ a| Whether to ping using the ipv4 protocol if hostnames are configured. ipv4: false ---- -| [[common-monitor-ipv6]]**`ipv6`** +| [[monitor-ipv6]]**`ipv6`** (<<synthetics-lightweight-data-bool,boolean>>) a| Whether to ping using the ipv6 protocol if hostnames are configured. @@ -150,7 +150,7 @@ a| Whether to ping using the ipv6 protocol if hostnames are configured. ipv6: false ---- -| [[common-monitor-alert]]**`alert`** +| [[monitor-alert]]**`alert`** a| Enable or disable alerts on this monitor. Read more about alerts in <<synthetics-settings-alerting,Alerting>>. **`status.enabled`** (<<synthetics-lightweight-data-bool,boolean>>):: @@ -177,7 +177,7 @@ Enable TLS certificate alerts on this monitor. alert.tls.enabled: true ---- -| [[common-monitor-retest_on_failure]]**`retest_on_failure`** +| [[monitor-retest_on_failure]]**`retest_on_failure`** (<<synthetics-lightweight-data-bool,boolean>>) a| Enable or disable retesting when a monitor fails. Default is `true`. @@ -190,7 +190,7 @@ By default, monitors are automatically retested if the monitor goes from "up" to retest_on_failure: false ---- -| [[common-monitor-locations]]**`locations`** +| [[monitor-locations]]**`locations`** (list of https://github.com/elastic/synthetics/blob/{synthetics_version}/src/locations/public-locations.ts#L28-L37[`SyntheticsLocationsType`]) a| Where to deploy the monitor. You can deploy monitors in multiple locations to detect differences in availability and response times across those locations. @@ -223,9 +223,9 @@ The value defined via the CLI takes precedence over the value defined in the lig and the value defined in the lightweight monitor configuration takes precedence over the value defined in Synthetics project configuration file. ==== -| [[common-monitor-private_locations]]**`private_locations`** +| [[monitor-private_locations]]**`private_locations`** (list of <<synthetics-lightweight-data-string,string>>s) -a| The <<synthetics-private-location,{private-location}s>> to which the monitors will be deployed. These {private-location}s refer to locations hosted and managed by you, whereas `locations` are hosted by Elastic. You can specify a {private-location} using the location's name. +a| The <<observability-synthetics-private-location,{private-location}s>> to which the monitors will be deployed. These {private-location}s refer to locations hosted and managed by you, whereas `locations` are hosted by Elastic. You can specify a {private-location} using the location's name. To list available {private-location}s you can: @@ -256,7 +256,7 @@ The value defined via the CLI takes precedence over the value defined in the lig and the value defined in the lightweight monitor configuration takes precedence over the value defined in Synthetics project configuration file. ==== -| [[common-monitor-fields]]**`fields`** +| [[monitor-fields]]**`fields`** a| A list of key-value pairs that will be sent with each monitor event. The `fields` are appended to {es} documents as `labels`, and those labels are displayed in {kib} in the _Monitor details_ panel in the diff --git a/docs/en/serverless/transclusion/synthetics/tab-widgets/manage-monitors-delete-monitor-content/project.asciidoc b/docs/en/serverless/transclusion/synthetics/tab-widgets/manage-monitors-delete-monitor-content/project.asciidoc index f5a944e30e..5785a1614f 100644 --- a/docs/en/serverless/transclusion/synthetics/tab-widgets/manage-monitors-delete-monitor-content/project.asciidoc +++ b/docs/en/serverless/transclusion/synthetics/tab-widgets/manage-monitors-delete-monitor-content/project.asciidoc @@ -1,4 +1,4 @@ -If you <<synthetics-get-started-project,set up the monitor using a Synthetics project>>, +If you <<observability-synthetics-get-started-project,set up the monitor using a Synthetics project>>, you'll delete the monitor from the Synthetics project and push changes. For lightweight monitors, delete the monitor from the YAML file. diff --git a/docs/en/serverless/transclusion/synthetics/tab-widgets/manage-monitors-delete-monitor-content/ui.asciidoc b/docs/en/serverless/transclusion/synthetics/tab-widgets/manage-monitors-delete-monitor-content/ui.asciidoc index 6b95c4bdb3..b19dcfd6ca 100644 --- a/docs/en/serverless/transclusion/synthetics/tab-widgets/manage-monitors-delete-monitor-content/ui.asciidoc +++ b/docs/en/serverless/transclusion/synthetics/tab-widgets/manage-monitors-delete-monitor-content/ui.asciidoc @@ -1,4 +1,4 @@ -If you <<synthetics-get-started-ui,set up the monitor using the Synthetics UI>>, +If you <<observability-synthetics-get-started-ui,set up the monitor using the Synthetics UI>>, you can delete a lightweight or browser monitor in the UI: . In your Observability project, go to **Synthetics** → **Management**. diff --git a/docs/en/serverless/transclusion/synthetics/tab-widgets/manage-monitors-update-monitor-content/project.asciidoc b/docs/en/serverless/transclusion/synthetics/tab-widgets/manage-monitors-update-monitor-content/project.asciidoc index 21c52dc2be..45b1f8d3aa 100644 --- a/docs/en/serverless/transclusion/synthetics/tab-widgets/manage-monitors-update-monitor-content/project.asciidoc +++ b/docs/en/serverless/transclusion/synthetics/tab-widgets/manage-monitors-update-monitor-content/project.asciidoc @@ -1,4 +1,4 @@ -If you <<synthetics-get-started-project,set up the monitor using a Synthetics project>>, +If you <<observability-synthetics-get-started-project,set up the monitor using a Synthetics project>>, you'll update the monitor in the Synthetics project and then `push` changes to your Observability project. For lightweight monitors, make changes to the YAML file. diff --git a/docs/en/serverless/transclusion/synthetics/tab-widgets/manage-monitors-update-monitor-content/ui.asciidoc b/docs/en/serverless/transclusion/synthetics/tab-widgets/manage-monitors-update-monitor-content/ui.asciidoc index 4be0498cbd..a984bbd89a 100644 --- a/docs/en/serverless/transclusion/synthetics/tab-widgets/manage-monitors-update-monitor-content/ui.asciidoc +++ b/docs/en/serverless/transclusion/synthetics/tab-widgets/manage-monitors-update-monitor-content/ui.asciidoc @@ -1,4 +1,4 @@ -If you <<synthetics-get-started-ui,set up the monitor using the UI>>, +If you <<observability-synthetics-get-started-ui,set up the monitor using the UI>>, you can update the monitor configuration of both lightweight and browser monitors in the UI: diff --git a/docs/en/serverless/what-is-observability-serverless.asciidoc b/docs/en/serverless/what-is-observability-serverless.asciidoc index acdfe13be8..74efe1046a 100644 --- a/docs/en/serverless/what-is-observability-serverless.asciidoc +++ b/docs/en/serverless/what-is-observability-serverless.asciidoc @@ -13,19 +13,19 @@ While in technical preview, Elastic Observability serverless projects should not [discrete] == Get started -* <<quickstarts-overview,*Quickstarts*>>: Learn how to ingest your observability data and get immediate value. -* <<get-started-with-logs,*Get started with Logs*>>: Add your log data to Elastic Observability and start exploring your logs. -* <<apm-get-started,*Get started with traces and APM*>>: Collect Application Performance Monitoring (APM) data and visualize it in real time. -* <<get-started-with-metrics,*Get started with metrics*>>: Add your metrics data to Elastic Observability and visualize it in real time. +* <<observability-quickstarts-overview,*Quickstarts*>>: Learn how to ingest your observability data and get immediate value. +* <<observability-get-started-with-logs,*Get started with Logs*>>: Add your log data to Elastic Observability and start exploring your logs. +* <<observability-apm-get-started,*Get started with traces and APM*>>: Collect Application Performance Monitoring (APM) data and visualize it in real time. +* <<observability-get-started-with-metrics,*Get started with metrics*>>: Add your metrics data to Elastic Observability and visualize it in real time. [discrete] == How to -* <<discover-and-explore-logs,*Explore log data*>>: Use Discover to explore your log data. -* <<create-manage-rules,*Trigger alerts and triage problems*>>: Create rules to detect complex conditions and trigger alerts. -* <<slos,*Track and deliver on your SLOs*>>: Measure key metrics important to the business. -* <<aiops-detect-anomalies,*Detect anomalies and spikes*>>: Find unusual behavior in time series data. -* <<apm,*Monitor application performance*>>: Monitor your software services and applications in real time. -* <<apm-agents-opentelemetry,*Integrate with OpenTelemetry*>>: Reuse existing APM instrumentation to capture logs, traces, and metrics. -* <<analyze-hosts,*Monitor your hosts and services*>>: Get a metrics-driven view of your hosts backed by an interface called Lens. +* <<observability-discover-and-explore-logs,*Explore log data*>>: Use Discover to explore your log data. +* <<observability-create-manage-rules,*Trigger alerts and triage problems*>>: Create rules to detect complex conditions and trigger alerts. +* <<observability-slos,*Track and deliver on your SLOs*>>: Measure key metrics important to the business. +* <<observability-aiops-detect-anomalies,*Detect anomalies and spikes*>>: Find unusual behavior in time series data. +* <<observability-apm,*Monitor application performance*>>: Monitor your software services and applications in real time. +* <<observability-apm-agents-opentelemetry,*Integrate with OpenTelemetry*>>: Reuse existing APM instrumentation to capture logs, traces, and metrics. +* <<observability-analyze-hosts,*Monitor your hosts and services*>>: Get a metrics-driven view of your hosts backed by an interface called Lens. From cd7a2c5f6ed9a701514fc8ae8d6c84275a291935 Mon Sep 17 00:00:00 2001 From: Colleen McGinnis <colleen.mcginnis@elastic.co> Date: Wed, 30 Oct 2024 08:27:24 -0500 Subject: [PATCH 05/13] fix attributes in parentheses --- docs/en/serverless/apm/apm-filter-your-data.asciidoc | 2 +- .../configure-head-based-sampling.asciidoc | 4 ++-- docs/en/serverless/cases/create-manage-cases.asciidoc | 2 +- .../synthetics/synthetics-private-location.asciidoc | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/en/serverless/apm/apm-filter-your-data.asciidoc b/docs/en/serverless/apm/apm-filter-your-data.asciidoc index ffaf059759..399860e7d0 100644 --- a/docs/en/serverless/apm/apm-filter-your-data.asciidoc +++ b/docs/en/serverless/apm/apm-filter-your-data.asciidoc @@ -46,4 +46,4 @@ To learn how to configure service environments, see the specific APM agent docum // * **iOS agent:** _Not yet supported_ -// * **Real User Monitoring:** [`environment`]{(apm-rum-ref}/configuration.html#environment) +// * **Real User Monitoring:** [`environment`]({apm-rum-ref}/configuration.html#environment) diff --git a/docs/en/serverless/apm/apm-transaction-sampling/configure-head-based-sampling.asciidoc b/docs/en/serverless/apm/apm-transaction-sampling/configure-head-based-sampling.asciidoc index e006432123..f17504f616 100644 --- a/docs/en/serverless/apm/apm-transaction-sampling/configure-head-based-sampling.asciidoc +++ b/docs/en/serverless/apm/apm-transaction-sampling/configure-head-based-sampling.asciidoc @@ -4,7 +4,7 @@ ### Dynamic configuration The transaction sample rate can be changed dynamically (no redeployment necessary) on a per-service and per-environment -basis with [{apm-agent} Configuration]{(kibana-ref}/agent-configuration.html) in {kib}. */ +basis with [{apm-agent} Configuration]({kibana-ref}/agent-configuration.html) in {kib}. */ //// //// @@ -12,7 +12,7 @@ basis with [{apm-agent} Configuration]{(kibana-ref}/agent-configuration.html) in {apm-agent} configuration exposes an API that can be used to programmatically change your agents' sampling rate. -An example is provided in the [Agent configuration API reference]{(kibana-ref}/agent-config-api.html). */ +An example is provided in the [Agent configuration API reference]({kibana-ref}/agent-config-api.html). */ //// Each APM agent provides a configuration value used to set the transaction sample rate. diff --git a/docs/en/serverless/cases/create-manage-cases.asciidoc b/docs/en/serverless/cases/create-manage-cases.asciidoc index bf1ca28d22..74cbbb1231 100644 --- a/docs/en/serverless/cases/create-manage-cases.asciidoc +++ b/docs/en/serverless/cases/create-manage-cases.asciidoc @@ -88,7 +88,7 @@ You can configure email notifications that occur when users are assigned to cases. To do this, add the email addresses to the monitoring email allowlist. -Follow the steps in [Send alerts by email]{(cloud}/ec-watcher.html#ec-watcher-allowlist). +Follow the steps in [Send alerts by email]({cloud}/ec-watcher.html#ec-watcher-allowlist). You do not need to configure an email connector or update user settings, since the preconfigured Elastic-Cloud-SMTP connector is diff --git a/docs/en/serverless/synthetics/synthetics-private-location.asciidoc b/docs/en/serverless/synthetics/synthetics-private-location.asciidoc index 67fce05aa6..253c0c840b 100644 --- a/docs/en/serverless/synthetics/synthetics-private-location.asciidoc +++ b/docs/en/serverless/synthetics/synthetics-private-location.asciidoc @@ -49,7 +49,7 @@ Start by setting up {agent} and creating an agent policy**. For more information [IMPORTANT] ==== A {private-location} should be set up against an agent policy that runs on a single {agent}. -The {agent} must be **enrolled in Fleet** {(private-location}s cannot be set up using **standalone** {agents}). +The {agent} must be **enrolled in Fleet** ({private-location}s cannot be set up using **standalone** {agents}). Do _not_ run the same agent policy on multiple agents being used for {private-location}s, as you may end up with duplicate or missing tests. {private-location}s do not currently load balance tests across multiple {agents}. See <<synthetics-private-location-scaling,Scaling {private-location}s>> for information on increasing the capacity From c4cdc6381e1fe62f7901d0a99e7597daecb3b645 Mon Sep 17 00:00:00 2001 From: Colleen McGinnis <colleen.mcginnis@elastic.co> Date: Thu, 31 Oct 2024 09:33:49 -0500 Subject: [PATCH 06/13] qa observability --- .../aiops/aiops-analyze-spikes.asciidoc | 2 +- .../serverless/aiops/aiops-analyze-spikes.mdx | 2 +- .../aiops/aiops-detect-anomalies.asciidoc | 18 +- .../aiops/aiops-detect-anomalies.mdx | 8 +- .../aiops/aiops-detect-change-points.asciidoc | 4 +- .../aiops/aiops-detect-change-points.mdx | 4 +- docs/en/serverless/aiops/aiops.asciidoc | 2 +- docs/en/serverless/aiops/aiops.mdx | 2 +- .../aiops-generate-anomaly-alerts.asciidoc | 2 +- docs/en/serverless/alerting/alerting.asciidoc | 2 +- .../create-anomaly-alert-rule.asciidoc | 2 +- ...reate-custom-threshold-alert-rule.asciidoc | 2 +- ...te-elasticsearch-query-alert-rule.asciidoc | 10 +- .../create-elasticsearch-query-alert-rule.mdx | 9 +- ...-error-count-threshold-alert-rule.asciidoc | 2 +- ...saction-rate-threshold-alert-rule.asciidoc | 2 +- ...te-inventory-threshold-alert-rule.asciidoc | 2 +- ...eate-latency-threshold-alert-rule.asciidoc | 4 +- .../create-latency-threshold-alert-rule.mdx | 2 +- .../alerting/create-manage-rules.asciidoc | 4 +- .../create-slo-burn-rate-alert-rule.asciidoc | 2 +- .../synthetic-monitor-status-alert.mdx | 64 +- .../serverless/alerting/view-alerts.asciidoc | 2 +- ...etry-opentelemetry-native-support.asciidoc | 4 +- ...telemetry-opentelemetry-native-support.mdx | 4 +- .../apm-agents-opentelemetry.asciidoc | 4 +- .../apm-agents/apm-agents-opentelemetry.mdx | 4 +- .../apm/apm-server-api/api-error.asciidoc | 5 +- .../apm/apm-server-api/api-info.asciidoc | 2 +- .../apm/apm-server-api/api-metadata.asciidoc | 5 +- .../apm/apm-server-api/api-metricset.asciidoc | 5 +- .../apm/apm-server-api/api-span.asciidoc | 5 +- .../apm-server-api/api-transaction.asciidoc | 5 +- docs/en/serverless/index.asciidoc | 153 ++ .../get-started-with-metrics.asciidoc | 2 +- .../get-started-with-metrics.mdx | 2 +- .../infra-monitoring/host-metrics.mdx | 4 +- .../infra-monitoring.asciidoc | 2 +- .../infra-monitoring/infra-monitoring.mdx | 2 +- .../plaintext-application-logs.asciidoc | 1 + .../logging/troubleshoot-logs.asciidoc | 2 +- .../observability-overview.asciidoc | 4 +- docs/en/serverless/observability-overview.mdx | 8 +- docs/en/serverless/partials/roles.asciidoc | 2 +- docs/en/serverless/projects/billing.asciidoc | 2 +- .../create-an-observability-project.asciidoc | 10 +- .../create-an-observability-project.mdx | 6 +- .../quickstarts/k8s-logs-metrics.asciidoc | 2 +- .../monitor-hosts-with-elastic-agent.asciidoc | 4 +- .../monitor-hosts-with-elastic-agent.mdx | 2 +- .../synthetics/synthetics-analyze.mdx | 2 +- .../synthetics-command-reference.asciidoc | 2 +- .../synthetics-command-reference.mdx | 2 +- .../synthetics-feature-roles.asciidoc | 8 +- .../synthetics-private-location.asciidoc | 2 +- .../apm/guide/spec/v2/error.asciidoc | 3 - .../transclusion/apm/guide/spec/v2/error.json | 1293 +++++++++++++++++ .../apm/guide/spec/v2/metadata.asciidoc | 3 - .../apm/guide/spec/v2/metadata.json | 567 ++++++++ .../apm/guide/spec/v2/metricset.asciidoc | 3 - .../apm/guide/spec/v2/metricset.json | 301 ++++ .../apm/guide/spec/v2/span.asciidoc | 3 - .../transclusion/apm/guide/spec/v2/span.json | 903 ++++++++++++ .../apm/guide/spec/v2/transaction.asciidoc | 3 - .../apm/guide/spec/v2/transaction.json | 1131 ++++++++++++++ .../fleet/tab-widgets/download/deb.asciidoc | 2 +- .../fleet/tab-widgets/download/linux.asciidoc | 2 +- .../fleet/tab-widgets/download/mac.asciidoc | 2 +- .../fleet/tab-widgets/download/rpm.asciidoc | 2 +- .../fleet/tab-widgets/download/win.asciidoc | 2 +- .../filebeat-install/content/deb.asciidoc | 2 +- .../filebeat-install/content/linux.asciidoc | 2 +- .../filebeat-install/content/macos.asciidoc | 2 +- .../filebeat-install/content/rpm.asciidoc | 2 +- .../filebeat-install/content/windows.asciidoc | 2 +- .../lightweight-config/http.asciidoc | 4 +- 76 files changed, 4518 insertions(+), 136 deletions(-) create mode 100644 docs/en/serverless/index.asciidoc delete mode 100644 docs/en/serverless/transclusion/apm/guide/spec/v2/error.asciidoc create mode 100644 docs/en/serverless/transclusion/apm/guide/spec/v2/error.json delete mode 100644 docs/en/serverless/transclusion/apm/guide/spec/v2/metadata.asciidoc create mode 100644 docs/en/serverless/transclusion/apm/guide/spec/v2/metadata.json delete mode 100644 docs/en/serverless/transclusion/apm/guide/spec/v2/metricset.asciidoc create mode 100644 docs/en/serverless/transclusion/apm/guide/spec/v2/metricset.json delete mode 100644 docs/en/serverless/transclusion/apm/guide/spec/v2/span.asciidoc create mode 100644 docs/en/serverless/transclusion/apm/guide/spec/v2/span.json delete mode 100644 docs/en/serverless/transclusion/apm/guide/spec/v2/transaction.asciidoc create mode 100644 docs/en/serverless/transclusion/apm/guide/spec/v2/transaction.json diff --git a/docs/en/serverless/aiops/aiops-analyze-spikes.asciidoc b/docs/en/serverless/aiops/aiops-analyze-spikes.asciidoc index c9525f730b..0dbc8f9a13 100644 --- a/docs/en/serverless/aiops/aiops-analyze-spikes.asciidoc +++ b/docs/en/serverless/aiops/aiops-analyze-spikes.asciidoc @@ -8,7 +8,7 @@ preview:[] // <DocCallOut template="technical preview" /> -Elastic {observability} provides built-in log rate analysis capabilities, +{observability} provides built-in log rate analysis capabilities, based on advanced statistical methods, to help you find and investigate the causes of unusual spikes or drops in log rates. diff --git a/docs/en/serverless/aiops/aiops-analyze-spikes.mdx b/docs/en/serverless/aiops/aiops-analyze-spikes.mdx index 984e30d3fd..7cd105ec1d 100644 --- a/docs/en/serverless/aiops/aiops-analyze-spikes.mdx +++ b/docs/en/serverless/aiops/aiops-analyze-spikes.mdx @@ -11,7 +11,7 @@ tags: [ 'serverless', 'observability', 'how-to' ] {/* <DocCallOut template="technical preview" /> */} -Elastic ((observability)) provides built-in log rate analysis capabilities, +((observability)) provides built-in log rate analysis capabilities, based on advanced statistical methods, to help you find and investigate the causes of unusual spikes or drops in log rates. diff --git a/docs/en/serverless/aiops/aiops-detect-anomalies.asciidoc b/docs/en/serverless/aiops/aiops-detect-anomalies.asciidoc index ea7f9ff294..417d1d65f3 100644 --- a/docs/en/serverless/aiops/aiops-detect-anomalies.asciidoc +++ b/docs/en/serverless/aiops/aiops-detect-anomalies.asciidoc @@ -13,7 +13,7 @@ include::../partials/roles.asciidoc[] :goal!: -The anomaly detection feature in Elastic {observability} automatically models the normal behavior of your time series data — learning trends, +The anomaly detection feature in {observability} automatically models the normal behavior of your time series data — learning trends, periodicity, and more — in real time to identify anomalies, streamline root cause analysis, and reduce false positives. To set up anomaly detection, you create and run anomaly detection jobs. @@ -49,7 +49,7 @@ To learn more about anomaly detection, refer to the {ml-docs}/ml-ad-overview.htm [discrete] [[create-anomaly-detection-job]] -= Create and run an anomaly detection job +== Create and run an anomaly detection job . In your {observability} project, go to **AIOps** → **Anomaly detection**. . Click **Create anomaly detection job** (or **Create job** if other jobs exist). @@ -57,14 +57,15 @@ To learn more about anomaly detection, refer to the {ml-docs}/ml-ad-overview.htm . Select the wizard for the type of job you want to create. The following wizards are available. You might also see specialized wizards based on the type of data you are analyzing. - ++ [TIP] ==== In general, it is a good idea to start with single metric anomaly detection jobs for your key performance indicators. After you examine these simple analysis results, you will have a better idea of what the influencers might be. Then you can create multi-metric jobs and split the data or create more complex analysis functions as necessary. ==== - ++ +-- Single metric:: Creates simple jobs that have a single detector. A _detector_ applies an analytical function to specific fields in your data. In addition to limiting the number of detectors, the single metric wizard omits many of the more advanced configuration options. @@ -87,7 +88,8 @@ Geo:: Creates jobs that detect unusual occurrences in the geographic locations of your data. Your data set must contain geo data. For more information about job types, refer to the {ml-docs}/ml-anomaly-detection-job-types.html[{ml}] documentation. - +-- ++ .Not sure what type of job to create? [NOTE] ==== @@ -99,7 +101,7 @@ or click **Use full data** to view the full time range of data. Expand the fields to see details about the range and distribution of values. When you're done, go back to the first step and create your job. ==== - ++ . Step through the instructions in the job creation wizard to configure your job. You can accept the default settings for most settings now and <<observability-aiops-tune-anomaly-detection-job,tune the job>> later. . If you want the job to start immediately when the job is created, make sure that option is selected on the summary page. @@ -110,10 +112,10 @@ When an event occurs outside of the baselines of normal behavior, that event is [discrete] [[observability-aiops-detect-anomalies-view-the-results]] -= View the results +== View the results After the anomaly detection job has processed some data, -you can view the results in Elastic {observability}. +you can view the results in {observability}. [TIP] ==== diff --git a/docs/en/serverless/aiops/aiops-detect-anomalies.mdx b/docs/en/serverless/aiops/aiops-detect-anomalies.mdx index 88c91c0bc3..33aa9cddad 100644 --- a/docs/en/serverless/aiops/aiops-detect-anomalies.mdx +++ b/docs/en/serverless/aiops/aiops-detect-anomalies.mdx @@ -11,7 +11,7 @@ import Roles from '../partials/roles.mdx' <Roles role="Editor" goal="create, run, and view ((anomaly-job))s" /> -The anomaly detection feature in Elastic ((observability)) automatically models the normal behavior of your time series data — learning trends, +The anomaly detection feature in ((observability)) automatically models the normal behavior of your time series data — learning trends, periodicity, and more — in real time to identify anomalies, streamline root cause analysis, and reduce false positives. To set up anomaly detection, you create and run anomaly detection jobs. @@ -47,7 +47,7 @@ To learn more about anomaly detection, refer to the [((ml))](((ml-docs))/ml-ad-o <div id="create-anomaly-detection-job"></div> -# Create and run an anomaly detection job +## Create and run an anomaly detection job 1. In your ((observability)) project, go to **AIOps** → **Anomaly detection**. 1. Click **Create anomaly detection job** (or **Create job** if other jobs exist). @@ -112,10 +112,10 @@ When the job runs, the ((ml)) features analyze the input stream of data, model i When an event occurs outside of the baselines of normal behavior, that event is identified as an anomaly. 1. After the job is started, click **View results**. -# View the results +## View the results After the anomaly detection job has processed some data, -you can view the results in Elastic ((observability)). +you can view the results in ((observability)). <DocCallOut title="Tip"> Depending on the capacity of your machine, diff --git a/docs/en/serverless/aiops/aiops-detect-change-points.asciidoc b/docs/en/serverless/aiops/aiops-detect-change-points.asciidoc index 38e64ea91f..80946307db 100644 --- a/docs/en/serverless/aiops/aiops-detect-change-points.asciidoc +++ b/docs/en/serverless/aiops/aiops-detect-change-points.asciidoc @@ -8,12 +8,12 @@ preview:[] // <DocCallOut template="technical preview" /> -The change point detection feature in Elastic {observability} detects distribution changes, +The change point detection feature in {observability} detects distribution changes, trend changes, and other statistically significant change points in time series data. Unlike anomaly detection, change point detection does not require you to configure a job or generate a model. Instead you select a metric and immediately see a visual representation that splits the time series into two parts, before and after the change point. -Elastic {observability} uses a {ref}/search-aggregations-change-point-aggregation.html[change point aggregation] +{observability} uses a {ref}/search-aggregations-change-point-aggregation.html[change point aggregation] to detect change points. This aggregation can detect change points when: * a significant dip or spike occurs diff --git a/docs/en/serverless/aiops/aiops-detect-change-points.mdx b/docs/en/serverless/aiops/aiops-detect-change-points.mdx index df74d82f8d..af5f54923b 100644 --- a/docs/en/serverless/aiops/aiops-detect-change-points.mdx +++ b/docs/en/serverless/aiops/aiops-detect-change-points.mdx @@ -9,12 +9,12 @@ tags: [ 'serverless', 'observability', 'how-to' ] {/* <DocCallOut template="technical preview" /> */} -The change point detection feature in Elastic ((observability)) detects distribution changes, +The change point detection feature in ((observability)) detects distribution changes, trend changes, and other statistically significant change points in time series data. Unlike anomaly detection, change point detection does not require you to configure a job or generate a model. Instead you select a metric and immediately see a visual representation that splits the time series into two parts, before and after the change point. -Elastic ((observability)) uses a [change point aggregation](((ref))/search-aggregations-change-point-aggregation.html) +((observability)) uses a [change point aggregation](((ref))/search-aggregations-change-point-aggregation.html) to detect change points. This aggregation can detect change points when: * a significant dip or spike occurs diff --git a/docs/en/serverless/aiops/aiops.asciidoc b/docs/en/serverless/aiops/aiops.asciidoc index aa98be9246..7e7eb451c5 100644 --- a/docs/en/serverless/aiops/aiops.asciidoc +++ b/docs/en/serverless/aiops/aiops.asciidoc @@ -6,7 +6,7 @@ preview:[] -The AIOps capabilities available in Elastic {observability} enable you to consume and process large observability data sets at scale, reducing the time and effort required to detect, understand, investigate, and resolve incidents. +The AIOps capabilities available in {observability} enable you to consume and process large observability data sets at scale, reducing the time and effort required to detect, understand, investigate, and resolve incidents. Built on predictive analytics and {ml}, our AIOps capabilities require no prior experience with {ml}. DevOps engineers, SREs, and security analysts can get started right away using these AIOps features with little or no advanced configuration: diff --git a/docs/en/serverless/aiops/aiops.mdx b/docs/en/serverless/aiops/aiops.mdx index 246c6847f3..dc278a718a 100644 --- a/docs/en/serverless/aiops/aiops.mdx +++ b/docs/en/serverless/aiops/aiops.mdx @@ -7,7 +7,7 @@ tags: [ 'serverless', 'observability', 'overview' ] <p><DocBadge template="technical preview" /></p> -The AIOps capabilities available in Elastic ((observability)) enable you to consume and process large observability data sets at scale, reducing the time and effort required to detect, understand, investigate, and resolve incidents. +The AIOps capabilities available in ((observability)) enable you to consume and process large observability data sets at scale, reducing the time and effort required to detect, understand, investigate, and resolve incidents. Built on predictive analytics and ((ml)), our AIOps capabilities require no prior experience with ((ml)). DevOps engineers, SREs, and security analysts can get started right away using these AIOps features with little or no advanced configuration: diff --git a/docs/en/serverless/alerting/aiops-generate-anomaly-alerts.asciidoc b/docs/en/serverless/alerting/aiops-generate-anomaly-alerts.asciidoc index 1fa1d6e439..88e03e06f3 100644 --- a/docs/en/serverless/alerting/aiops-generate-anomaly-alerts.asciidoc +++ b/docs/en/serverless/alerting/aiops-generate-anomaly-alerts.asciidoc @@ -95,7 +95,7 @@ The following connectors are available when defining actions for alerting rules: include::./alerting-connectors.asciidoc[] -For more information on creating connectors, refer to https://www.elastic.co/docs/current/serverless/action-connectors[Connectors]. +For more information on creating connectors, refer to <<action-connectors,Connectors>>. ===== .Action frequency diff --git a/docs/en/serverless/alerting/alerting.asciidoc b/docs/en/serverless/alerting/alerting.asciidoc index 14fd27b4f4..a957f336e9 100644 --- a/docs/en/serverless/alerting/alerting.asciidoc +++ b/docs/en/serverless/alerting/alerting.asciidoc @@ -14,7 +14,7 @@ Alerting enables you to define _rules_, which detect complex conditions within d Alerting works by running checks on a schedule to detect conditions defined by a rule. You can define rules at different levels (service, environment, transaction) or use custom KQL queries. When a condition is met, the rule tracks it as an _alert_ and responds by triggering one or more _actions_. -Actions typically involve interaction with Elastic services or third-party integrations. https://www.elastic.co/docs/current/serverless/action-connectors[Connectors] enable actions to talk to these services and integrations. +Actions typically involve interaction with Elastic services or third-party integrations. <<action-connectors,Connectors>> enable actions to talk to these services and integrations. Once you've defined your rules, you can monitor any alerts triggered by these rules in real time, with detailed dashboards that help you quickly identify and troubleshoot any issues that may arise. You can also extend your alerts with notifications via services or third-party incident management systems. diff --git a/docs/en/serverless/alerting/create-anomaly-alert-rule.asciidoc b/docs/en/serverless/alerting/create-anomaly-alert-rule.asciidoc index 2d2a8b7ae6..b639c46710 100644 --- a/docs/en/serverless/alerting/create-anomaly-alert-rule.asciidoc +++ b/docs/en/serverless/alerting/create-anomaly-alert-rule.asciidoc @@ -56,7 +56,7 @@ The following connectors are available when defining actions for alerting rules: include::./alerting-connectors.asciidoc[] -For more information on creating connectors, refer to https://www.elastic.co/docs/current/serverless/action-connectors[Connectors]. +For more information on creating connectors, refer to <<action-connectors,Connectors>>. ===== .Action frequency diff --git a/docs/en/serverless/alerting/create-custom-threshold-alert-rule.asciidoc b/docs/en/serverless/alerting/create-custom-threshold-alert-rule.asciidoc index 63129e950c..168abcb6db 100644 --- a/docs/en/serverless/alerting/create-custom-threshold-alert-rule.asciidoc +++ b/docs/en/serverless/alerting/create-custom-threshold-alert-rule.asciidoc @@ -135,7 +135,7 @@ The following connectors are available when defining actions for alerting rules: include::./alerting-connectors.asciidoc[] -For more information on creating connectors, refer to https://www.elastic.co/docs/current/serverless/action-connectors[Connectors]. +For more information on creating connectors, refer to <<action-connectors,Connectors>>. ===== .Action frequency diff --git a/docs/en/serverless/alerting/create-elasticsearch-query-alert-rule.asciidoc b/docs/en/serverless/alerting/create-elasticsearch-query-alert-rule.asciidoc index 56416feb94..25fa77a97e 100644 --- a/docs/en/serverless/alerting/create-elasticsearch-query-alert-rule.asciidoc +++ b/docs/en/serverless/alerting/create-elasticsearch-query-alert-rule.asciidoc @@ -57,7 +57,7 @@ For example: If you use {kibana-ref}/kuery-query.html[KQL] or {kibana-ref}/lucene-query.html[Lucene], you must specify a data view then define a text-based query. For example, `http.request.referrer: "https://example.com"`. + -preview:[]If you use {ref}/esql.html[ES|QL], you must provide a source command followed by an optional series of processing commands, separated by pipe characters (|). +preview:[] If you use {ref}/esql.html[ES|QL], you must provide a source command followed by an optional series of processing commands, separated by pipe characters (|). For example: + [source,sh] @@ -136,7 +136,7 @@ The following connectors are available when defining actions for alerting rules: include::./alerting-connectors.asciidoc[] -For more information on creating connectors, refer to https://www.elastic.co/docs/current/serverless/action-connectors[Connectors]. +For more information on creating connectors, refer to <<action-connectors,Connectors>>. ===== .Action frequency @@ -191,7 +191,7 @@ over these hits to get values from the {es} documents into your actions. + For example, the message in an email connector action might contain: + -[source] +[source,txt] ---- Elasticsearch query rule '{{rule.name}}' is active: @@ -208,7 +208,7 @@ For example: + // NOTCONSOLE + -[source] +[source,txt] ---- {{#context.hits}} timestamp: {{_source.@timestamp}} @@ -220,7 +220,7 @@ As the {ref}/search-fields.html#search-fields-response[`fields`] response always the https://mustache.github.io/[Mustache] template array syntax is used to iterate over these values in your actions. For example: + -[source] +[source,txt] ---- {{#context.hits}} Labels: diff --git a/docs/en/serverless/alerting/create-elasticsearch-query-alert-rule.mdx b/docs/en/serverless/alerting/create-elasticsearch-query-alert-rule.mdx index 1819458c01..1b12b6461d 100644 --- a/docs/en/serverless/alerting/create-elasticsearch-query-alert-rule.mdx +++ b/docs/en/serverless/alerting/create-elasticsearch-query-alert-rule.mdx @@ -50,8 +50,7 @@ For example: If you use [KQL](((kibana-ref))/kuery-query.html) or [Lucene](((kibana-ref))/lucene-query.html), you must specify a data view then define a text-based query. For example, `http.request.referrer: "https://example.com"`. - <DocBadge template="technical preview" /> - If you use [ES|QL](((ref))/esql.html), you must provide a source command followed by an optional series of processing commands, separated by pipe characters (|). + <DocBadge template="technical preview" /> If you use [ES|QL](((ref))/esql.html), you must provide a source command followed by an optional series of processing commands, separated by pipe characters (|). For example: ```sh @@ -177,7 +176,7 @@ You can also specify [variables common to all rules](((kibana-ref))/rule-action- For example, the message in an email connector action might contain: - ``` + ```txt Elasticsearch query rule '{{rule.name}}' is active: {{#context.hits}} @@ -192,7 +191,7 @@ You can also specify [variables common to all rules](((kibana-ref))/rule-action- For example: {/* NOTCONSOLE */} - ``` + ```txt {{#context.hits}} timestamp: {{_source.@timestamp}} day of the week: {{fields.day_of_week}} @@ -203,7 +202,7 @@ You can also specify [variables common to all rules](((kibana-ref))/rule-action- the [Mustache](https://mustache.github.io/) template array syntax is used to iterate over these values in your actions. For example: - ``` + ```txt {{#context.hits}} Labels: {{#fields.labels}} diff --git a/docs/en/serverless/alerting/create-error-count-threshold-alert-rule.asciidoc b/docs/en/serverless/alerting/create-error-count-threshold-alert-rule.asciidoc index 932f53107e..1baa9c69fc 100644 --- a/docs/en/serverless/alerting/create-error-count-threshold-alert-rule.asciidoc +++ b/docs/en/serverless/alerting/create-error-count-threshold-alert-rule.asciidoc @@ -58,7 +58,7 @@ The following connectors are available when defining actions for alerting rules: include::./alerting-connectors.asciidoc[] -For more information on creating connectors, refer to https://www.elastic.co/docs/current/serverless/action-connectors[Connectors]. +For more information on creating connectors, refer to <<action-connectors,Connectors>>. ===== .Action frequency diff --git a/docs/en/serverless/alerting/create-failed-transaction-rate-threshold-alert-rule.asciidoc b/docs/en/serverless/alerting/create-failed-transaction-rate-threshold-alert-rule.asciidoc index 8cca435f81..6eecfc173e 100644 --- a/docs/en/serverless/alerting/create-failed-transaction-rate-threshold-alert-rule.asciidoc +++ b/docs/en/serverless/alerting/create-failed-transaction-rate-threshold-alert-rule.asciidoc @@ -58,7 +58,7 @@ The following connectors are available when defining actions for alerting rules: include::./alerting-connectors.asciidoc[] -For more information on creating connectors, refer to https://www.elastic.co/docs/current/serverless/action-connectors[Connectors]. +For more information on creating connectors, refer to <<action-connectors,Connectors>>. ===== .Action frequency diff --git a/docs/en/serverless/alerting/create-inventory-threshold-alert-rule.asciidoc b/docs/en/serverless/alerting/create-inventory-threshold-alert-rule.asciidoc index 6edf4d0e95..bb90d99d83 100644 --- a/docs/en/serverless/alerting/create-inventory-threshold-alert-rule.asciidoc +++ b/docs/en/serverless/alerting/create-inventory-threshold-alert-rule.asciidoc @@ -69,7 +69,7 @@ The following connectors are available when defining actions for alerting rules: include::./alerting-connectors.asciidoc[] -For more information on creating connectors, refer to https://www.elastic.co/docs/current/serverless/action-connectors[Connectors]. +For more information on creating connectors, refer to <<action-connectors,Connectors>>. ===== .Action frequency diff --git a/docs/en/serverless/alerting/create-latency-threshold-alert-rule.asciidoc b/docs/en/serverless/alerting/create-latency-threshold-alert-rule.asciidoc index 2457907a60..4da412fec3 100644 --- a/docs/en/serverless/alerting/create-latency-threshold-alert-rule.asciidoc +++ b/docs/en/serverless/alerting/create-latency-threshold-alert-rule.asciidoc @@ -28,7 +28,7 @@ These steps show how to use the **Alerts** UI. You can also create a latency threshold rule directly from any page within **Applications**. Click the **Alerts and rules** button, and select **Create threshold rule** and then **Latency**. When you create a rule this way, the **Name** and **Tags** fields will be prepopulated but you can still change these. ==== -To create your latency threshold rule:: +To create your latency threshold rule: . In your {observability} project, go to **Alerts**. . Select **Manage Rules** from the **Alerts** page, and select **Create rule**. @@ -61,7 +61,7 @@ The following connectors are available when defining actions for alerting rules: include::./alerting-connectors.asciidoc[] -For more information on creating connectors, refer to https://www.elastic.co/docs/current/serverless/action-connectors[Connectors]. +For more information on creating connectors, refer to <<action-connectors,Connectors>>. ===== .Action frequency diff --git a/docs/en/serverless/alerting/create-latency-threshold-alert-rule.mdx b/docs/en/serverless/alerting/create-latency-threshold-alert-rule.mdx index 43dd1036a5..4c464e6866 100644 --- a/docs/en/serverless/alerting/create-latency-threshold-alert-rule.mdx +++ b/docs/en/serverless/alerting/create-latency-threshold-alert-rule.mdx @@ -22,7 +22,7 @@ These steps show how to use the **Alerts** UI. You can also create a latency threshold rule directly from any page within **Applications**. Click the **Alerts and rules** button, and select **Create threshold rule** and then **Latency**. When you create a rule this way, the **Name** and **Tags** fields will be prepopulated but you can still change these. </DocCallOut> -To create your latency threshold rule:: +To create your latency threshold rule: 1. In your ((observability)) project, go to **Alerts**. 1. Select **Manage Rules** from the **Alerts** page, and select **Create rule**. diff --git a/docs/en/serverless/alerting/create-manage-rules.asciidoc b/docs/en/serverless/alerting/create-manage-rules.asciidoc index 1a287a4edc..3ab113d99c 100644 --- a/docs/en/serverless/alerting/create-manage-rules.asciidoc +++ b/docs/en/serverless/alerting/create-manage-rules.asciidoc @@ -126,7 +126,7 @@ time, indefinitely, or schedule single or recurring downtimes. When a rule is in a snoozed state, you can cancel or change the duration of this state. -preview:[] To temporarily suppress notifications for _all_ rules, create a https://www.elastic.co/docs/current/serverless/maintenance-windows[maintenance window]. +preview:[] To temporarily suppress notifications for _all_ rules, create a <<maintenance-windows,maintenance window>>. // Remove tech preview? @@ -134,7 +134,7 @@ preview:[] To temporarily suppress notifications for _all_ rules, create a https [[observability-create-manage-rules-import-and-export-rules]] == Import and export rules -To import and export rules, use https://www.elastic.co/docs/current/serverless/saved-objects[{saved-objects-app}]. +To import and export rules, use <<saved-objects,{saved-objects-app}>>. Rules are disabled on export. You are prompted to re-enable the rule on successful import. diff --git a/docs/en/serverless/alerting/create-slo-burn-rate-alert-rule.asciidoc b/docs/en/serverless/alerting/create-slo-burn-rate-alert-rule.asciidoc index 68be476479..8f144c8f9f 100644 --- a/docs/en/serverless/alerting/create-slo-burn-rate-alert-rule.asciidoc +++ b/docs/en/serverless/alerting/create-slo-burn-rate-alert-rule.asciidoc @@ -66,7 +66,7 @@ The following connectors are available when defining actions for alerting rules: include::./alerting-connectors.asciidoc[] -For more information on creating connectors, refer to https://www.elastic.co/docs/current/serverless/action-connectors[Connectors]. +For more information on creating connectors, refer to <<action-connectors,Connectors>>. ===== .Action frequency diff --git a/docs/en/serverless/alerting/synthetic-monitor-status-alert.mdx b/docs/en/serverless/alerting/synthetic-monitor-status-alert.mdx index 38dc6de731..1dc8829e2d 100644 --- a/docs/en/serverless/alerting/synthetic-monitor-status-alert.mdx +++ b/docs/en/serverless/alerting/synthetic-monitor-status-alert.mdx @@ -86,35 +86,67 @@ You an also specify [variables common to all rules](((kibana-ref))/rule-action-v <DocDefList> <DocDefTerm>`context.checkedAt`</DocDefTerm> - <DocDefDescription>Timestamp of the monitor run.</DocDefDescription> + <DocDefDescription> + Timestamp of the monitor run. + </DocDefDescription> <DocDefTerm>`context.hostName`</DocDefTerm> - <DocDefDescription>Hostname of the location from which the check is performed.</DocDefDescription> + <DocDefDescription> + Hostname of the location from which the check is performed. + </DocDefDescription> <DocDefTerm>`context.lastErrorMessage`</DocDefTerm> - <DocDefDescription>Monitor last error message.</DocDefDescription> + <DocDefDescription> + Monitor last error message. + </DocDefDescription> <DocDefTerm>`context.locationId`</DocDefTerm> - <DocDefDescription>Location id from which the check is performed.</DocDefDescription> + <DocDefDescription> + Location id from which the check is performed. + </DocDefDescription> <DocDefTerm>`context.locationName`</DocDefTerm> - <DocDefDescription>Location name from which the check is performed.</DocDefDescription> + <DocDefDescription> + Location name from which the check is performed. + </DocDefDescription> <DocDefTerm>`context.locationNames`</DocDefTerm> - <DocDefDescription>Location names from which the checks are performed.</DocDefDescription> + <DocDefDescription> + Location names from which the checks are performed. + </DocDefDescription> <DocDefTerm>`context.message`</DocDefTerm> - <DocDefDescription>A generated message summarizing the status of monitors currently down.</DocDefDescription> + <DocDefDescription> + A generated message summarizing the status of monitors currently down. + </DocDefDescription> <DocDefTerm>`context.monitorId`</DocDefTerm> - <DocDefDescription>ID of the monitor.</DocDefDescription> + <DocDefDescription> + ID of the monitor. + </DocDefDescription> <DocDefTerm>`context.monitorName`</DocDefTerm> - <DocDefDescription>Name of the monitor.</DocDefDescription> + <DocDefDescription> + Name of the monitor. + </DocDefDescription> <DocDefTerm>`context.monitorTags`</DocDefTerm> - <DocDefDescription>Tags associated with the monitor.</DocDefDescription> + <DocDefDescription> + Tags associated with the monitor. + </DocDefDescription> <DocDefTerm>`context.monitorType`</DocDefTerm> - <DocDefDescription>Type (for example, HTTP/TCP) of the monitor.</DocDefDescription> + <DocDefDescription> + Type (for example, HTTP/TCP) of the monitor. + </DocDefDescription> <DocDefTerm>`context.monitorUrl`</DocDefTerm> - <DocDefDescription>URL of the monitor.</DocDefDescription> + <DocDefDescription> + URL of the monitor. + </DocDefDescription> <DocDefTerm>`context.reason`</DocDefTerm> - <DocDefDescription>A concise description of the reason for the alert.</DocDefDescription> + <DocDefDescription> + A concise description of the reason for the alert. + </DocDefDescription> <DocDefTerm>`context.recoveryReason`</DocDefTerm> - <DocDefDescription>A concise description of the reason for the recovery.</DocDefDescription> + <DocDefDescription> + A concise description of the reason for the recovery. + </DocDefDescription> <DocDefTerm>`context.status`</DocDefTerm> - <DocDefDescription>Monitor status (for example, "down").</DocDefDescription> + <DocDefDescription> + Monitor status (for example, "down"). + </DocDefDescription> <DocDefTerm>`context.viewInAppUrl`</DocDefTerm> - <DocDefDescription>Open alert details and context in Synthetics app.</DocDefDescription> + <DocDefDescription> + Open alert details and context in Synthetics app. + </DocDefDescription> </DocDefList> \ No newline at end of file diff --git a/docs/en/serverless/alerting/view-alerts.asciidoc b/docs/en/serverless/alerting/view-alerts.asciidoc index bf1e7b794c..acca3c039f 100644 --- a/docs/en/serverless/alerting/view-alerts.asciidoc +++ b/docs/en/serverless/alerting/view-alerts.asciidoc @@ -102,7 +102,7 @@ Use the toolbar buttons in the upper-left of the alerts table to customize the c For example, click **Fields** and choose the `Maintenance Windows` field. If an alert was affected by a maintenance window, its identifier appears in the new column. -For more information about their impact on alert notifications, refer to https://www.elastic.co/docs/current/serverless/maintenance-windows[Maintenance windows]. +For more information about their impact on alert notifications, refer to <<maintenance-windows,Maintenance windows>>. // ![Alerts table with toolbar buttons highlighted](images/view-observability-alerts/-observability-alert-table-toolbar-buttons.png) diff --git a/docs/en/serverless/apm-agents/apm-agents-opentelemetry-opentelemetry-native-support.asciidoc b/docs/en/serverless/apm-agents/apm-agents-opentelemetry-opentelemetry-native-support.asciidoc index dd529a31d0..49eb35265e 100644 --- a/docs/en/serverless/apm-agents/apm-agents-opentelemetry-opentelemetry-native-support.asciidoc +++ b/docs/en/serverless/apm-agents/apm-agents-opentelemetry-opentelemetry-native-support.asciidoc @@ -22,7 +22,7 @@ be sent directly to Elastic. [[observability-apm-agents-opentelemetry-opentelemetry-native-support-send-data-from-an-upstream-opentelemetry-collector]] == Send data from an upstream OpenTelemetry Collector -Connect your OpenTelemetry Collector instances to Elastic {observability} using the OTLP exporter: +Connect your OpenTelemetry Collector instances to {observability} using the OTLP exporter: [source,yaml] ---- @@ -70,7 +70,7 @@ https://github.com/open-telemetry/opentelemetry-collector/tree/main/receiver/otl <3> The https://github.com/open-telemetry/opentelemetry-collector/tree/main/exporter/loggingexporter[logging exporter] is helpful for troubleshooting and supports various logging levels, like `debug`, `info`, `warn`, and `error`. -<4> Elastic {observability} endpoint configuration. +<4> {observability} endpoint configuration. Elastic supports a ProtoBuf payload via both the OTLP protocol over gRPC transport https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/otlp.md#otlpgrpc[(OTLP/gRPC)] and the OTLP protocol over HTTP transport https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/otlp.md#otlphttp[(OTLP/HTTP)]. To learn more about these exporters, see the OpenTelemetry Collector documentation: diff --git a/docs/en/serverless/apm-agents/apm-agents-opentelemetry-opentelemetry-native-support.mdx b/docs/en/serverless/apm-agents/apm-agents-opentelemetry-opentelemetry-native-support.mdx index d009cfeb62..ab639a4e1b 100644 --- a/docs/en/serverless/apm-agents/apm-agents-opentelemetry-opentelemetry-native-support.mdx +++ b/docs/en/serverless/apm-agents/apm-agents-opentelemetry-opentelemetry-native-support.mdx @@ -21,7 +21,7 @@ be sent directly to Elastic. ## Send data from an upstream OpenTelemetry Collector -Connect your OpenTelemetry Collector instances to Elastic ((observability)) using the OTLP exporter: +Connect your OpenTelemetry Collector instances to ((observability)) using the OTLP exporter: ```yaml receivers: [^1] @@ -64,7 +64,7 @@ service: [OTLP receiver](https://github.com/open-telemetry/opentelemetry-collector/tree/main/receiver/otlpreceiver), that forward data emitted by APM agents, or the [host metrics receiver](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/hostmetricsreceiver). [^2]: We recommend using the [Batch processor](https://github.com/open-telemetry/opentelemetry-collector/blob/main/processor/batchprocessor/README.md) and the [memory limiter processor](https://github.com/open-telemetry/opentelemetry-collector/blob/main/processor/memorylimiterprocessor/README.md). For more information, see [recommended processors](https://github.com/open-telemetry/opentelemetry-collector/blob/main/processor/README.md#recommended-processors). [^3]: The [logging exporter](https://github.com/open-telemetry/opentelemetry-collector/tree/main/exporter/loggingexporter) is helpful for troubleshooting and supports various logging levels, like `debug`, `info`, `warn`, and `error`. -[^4]: Elastic ((observability)) endpoint configuration. +[^4]: ((observability)) endpoint configuration. Elastic supports a ProtoBuf payload via both the OTLP protocol over gRPC transport [(OTLP/gRPC)](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/otlp.md#otlpgrpc) and the OTLP protocol over HTTP transport [(OTLP/HTTP)](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/otlp.md#otlphttp). To learn more about these exporters, see the OpenTelemetry Collector documentation: diff --git a/docs/en/serverless/apm-agents/apm-agents-opentelemetry.asciidoc b/docs/en/serverless/apm-agents/apm-agents-opentelemetry.asciidoc index 69363826e9..c554cf23c4 100644 --- a/docs/en/serverless/apm-agents/apm-agents-opentelemetry.asciidoc +++ b/docs/en/serverless/apm-agents/apm-agents-opentelemetry.asciidoc @@ -98,13 +98,13 @@ It's also possible to send data directly to APM Server from an upstream OpenTele // Why you _would_ choose this approach -This approach works well when you need to instrument a technology that Elastic doesn't provide a solution for. For example, if you want to instrument C or C++ you could use the https://github.com/open-telemetry/opentelemetry-cpp[OpenTelemetry C++ client]. +This approach works well when you need to instrument a technology that Elastic doesn't provide a solution for. For example, if you want to instrument C or C{plus}{plus} you could use the https://github.com/open-telemetry/opentelemetry-cpp[OpenTelemetry C{plus}{plus} client]. // Other languages include erlang, lua, perl. // Why you would _not_ choose this approach -However, there are some limitations when using collectors and language SDKs built and maintainedby OpenTelemetry, including: +However, there are some limitations when using collectors and language SDKs built and maintained by OpenTelemetry, including: * Elastic can't provide implementation support on how to use upstream OpenTelemetry tools. * You won't have access to Elastic enterprise APM features. diff --git a/docs/en/serverless/apm-agents/apm-agents-opentelemetry.mdx b/docs/en/serverless/apm-agents/apm-agents-opentelemetry.mdx index d336b63fc1..ed5b4c6670 100644 --- a/docs/en/serverless/apm-agents/apm-agents-opentelemetry.mdx +++ b/docs/en/serverless/apm-agents/apm-agents-opentelemetry.mdx @@ -82,11 +82,11 @@ You can set up an [OpenTelemetry Collector](https://opentelemetry.io/docs/collec </DocCallOut> {/* Why you _would_ choose this approach */} -This approach works well when you need to instrument a technology that Elastic doesn't provide a solution for. For example, if you want to instrument C or C++ you could use the [OpenTelemetry C++ client](https://github.com/open-telemetry/opentelemetry-cpp). +This approach works well when you need to instrument a technology that Elastic doesn't provide a solution for. For example, if you want to instrument C or C((plus))((plus)) you could use the [OpenTelemetry C((plus))((plus)) client](https://github.com/open-telemetry/opentelemetry-cpp). {/* Other languages include erlang, lua, perl. */} {/* Why you would _not_ choose this approach */} -However, there are some limitations when using collectors and language SDKs built and maintainedby OpenTelemetry, including: +However, there are some limitations when using collectors and language SDKs built and maintained by OpenTelemetry, including: * Elastic can't provide implementation support on how to use upstream OpenTelemetry tools. * You won't have access to Elastic enterprise APM features. diff --git a/docs/en/serverless/apm/apm-server-api/api-error.asciidoc b/docs/en/serverless/apm/apm-server-api/api-error.asciidoc index e1cff0d070..166cb5028c 100644 --- a/docs/en/serverless/apm/apm-server-api/api-error.asciidoc +++ b/docs/en/serverless/apm/apm-server-api/api-error.asciidoc @@ -12,5 +12,8 @@ https://github.com/elastic/apm-server/blob/main/docs/spec/v2/error.json[GitHub] .Click to expand the schema [%collapsible] ===== -include::../../transclusion/apm/guide/spec/v2/error.asciidoc[] +[source,json] +---- +include::../../transclusion/apm/guide/spec/v2/error.json[] +---- ===== diff --git a/docs/en/serverless/apm/apm-server-api/api-info.asciidoc b/docs/en/serverless/apm/apm-server-api/api-info.asciidoc index e8cc9df45d..c02e6989e2 100644 --- a/docs/en/serverless/apm/apm-server-api/api-info.asciidoc +++ b/docs/en/serverless/apm/apm-server-api/api-info.asciidoc @@ -24,7 +24,7 @@ Requests to this endpoint must be authenticated. Example managed intake service information request: -[source,sh] +[source,sh,subs="attributes+"] ---- curl -X POST http://127.0.0.1:8200/ \ -H "Authorization: ApiKey api_key" diff --git a/docs/en/serverless/apm/apm-server-api/api-metadata.asciidoc b/docs/en/serverless/apm/apm-server-api/api-metadata.asciidoc index a393cc714f..01c331a4a7 100644 --- a/docs/en/serverless/apm/apm-server-api/api-metadata.asciidoc +++ b/docs/en/serverless/apm/apm-server-api/api-metadata.asciidoc @@ -21,7 +21,10 @@ https://github.com/elastic/apm-server/blob/main/docs/spec/v2/metadata.json[GitHu .Click to expand the schema [%collapsible] ===== -include::../../transclusion/apm/guide/spec/v2/metadata.asciidoc[] +[source,json] +---- +include::../../transclusion/apm/guide/spec/v2/metadata.json[] +---- ===== [discrete] diff --git a/docs/en/serverless/apm/apm-server-api/api-metricset.asciidoc b/docs/en/serverless/apm/apm-server-api/api-metricset.asciidoc index 902605f04a..13458d4d41 100644 --- a/docs/en/serverless/apm/apm-server-api/api-metricset.asciidoc +++ b/docs/en/serverless/apm/apm-server-api/api-metricset.asciidoc @@ -12,5 +12,8 @@ https://github.com/elastic/apm-server/blob/main/docs/spec/v2/metricset.json[GitH .Click to expand the schema [%collapsible] ===== -include::../../transclusion/apm/guide/spec/v2/metricset.asciidoc[] +[source,json] +---- +include::../../transclusion/apm/guide/spec/v2/metricset.json[] +---- ===== diff --git a/docs/en/serverless/apm/apm-server-api/api-span.asciidoc b/docs/en/serverless/apm/apm-server-api/api-span.asciidoc index 1256625a47..b24aba4984 100644 --- a/docs/en/serverless/apm/apm-server-api/api-span.asciidoc +++ b/docs/en/serverless/apm/apm-server-api/api-span.asciidoc @@ -12,5 +12,8 @@ https://github.com/elastic/apm-server/blob/main/docs/spec/v2/span.json[GitHub] a .Click to expand the schema [%collapsible] ===== -include::../../transclusion/apm/guide/spec/v2/span.asciidoc[] +[source,json] +---- +include::../../transclusion/apm/guide/spec/v2/span.json[] +---- ===== diff --git a/docs/en/serverless/apm/apm-server-api/api-transaction.asciidoc b/docs/en/serverless/apm/apm-server-api/api-transaction.asciidoc index 5336056770..de8598d890 100644 --- a/docs/en/serverless/apm/apm-server-api/api-transaction.asciidoc +++ b/docs/en/serverless/apm/apm-server-api/api-transaction.asciidoc @@ -12,5 +12,8 @@ https://github.com/elastic/apm-server/blob/main/docs/spec/v2/transaction.json[Gi .Click to expand the schema [%collapsible] ===== -include::../../transclusion/apm/guide/spec/v2/transaction.asciidoc[] +[source,json] +---- +include::../../transclusion/apm/guide/spec/v2/transaction.json[] +---- ===== diff --git a/docs/en/serverless/index.asciidoc b/docs/en/serverless/index.asciidoc new file mode 100644 index 0000000000..df5cba60a0 --- /dev/null +++ b/docs/en/serverless/index.asciidoc @@ -0,0 +1,153 @@ +:doctype: book + +include::{docs-root}/shared/versions/stack/{source_branch}.asciidoc[] +include::{docs-root}/shared/attributes.asciidoc[] + += Elastic Observability + +include::./observability-overview.asciidoc[leveloffset=+1] + +include::./quickstarts/overview.asciidoc[leveloffset=+1] +include::./quickstarts/monitor-hosts-with-elastic-agent.asciidoc[leveloffset=+2] +include::./quickstarts/k8s-logs-metrics.asciidoc[leveloffset=+2] + +include::./projects/billing.asciidoc[leveloffset=+1] + +include::./projects/create-an-observability-project.asciidoc[leveloffset=+1] + +include::./logging/log-monitoring.asciidoc[leveloffset=+1] +include::./logging/get-started-with-logs.asciidoc[leveloffset=+2] +include::./logging/stream-log-files.asciidoc[leveloffset=+2] +include::./logging/correlate-application-logs.asciidoc[leveloffset=+2] +include::./logging/plaintext-application-logs.asciidoc[leveloffset=+3] +include::./logging/ecs-application-logs.asciidoc[leveloffset=+3] +include::./logging/send-application-logs.asciidoc[leveloffset=+3] +include::./logging/parse-log-data.asciidoc[leveloffset=+2] +include::./logging/filter-and-aggregate-logs.asciidoc[leveloffset=+2] +include::./logging/view-and-monitor-logs.asciidoc[leveloffset=+2] +include::./logging/add-logs-service-name.asciidoc[leveloffset=+2] +include::./logging/run-log-pattern-analysis.asciidoc[leveloffset=+2] +include::./logging/troubleshoot-logs.asciidoc[leveloffset=+2] + +include::./inventory.asciidoc[leveloffset=+1] + +include::./apm/apm.asciidoc[leveloffset=+1] +include::./apm/apm-get-started.asciidoc[leveloffset=+2] +include::./apm/apm-send-traces-to-elastic.asciidoc[leveloffset=+2] +include::./apm-agents/apm-agents-elastic-apm-agents.asciidoc[leveloffset=+3] +include::./apm-agents/apm-agents-opentelemetry.asciidoc[leveloffset=+3] +include::./apm-agents/apm-agents-opentelemetry-opentelemetry-native-support.asciidoc[leveloffset=+4] +include::./apm-agents/apm-agents-opentelemetry-collect-metrics.asciidoc[leveloffset=+4] +include::./apm-agents/apm-agents-opentelemetry-limitations.asciidoc[leveloffset=+4] +include::./apm-agents/apm-agents-opentelemetry-resource-attributes.asciidoc[leveloffset=+4] +include::./apm-agents/apm-agents-aws-lambda-functions.asciidoc[leveloffset=+3] +include::./apm/apm-view-and-analyze-traces.asciidoc[leveloffset=+2] +include::./apm/apm-find-transaction-latency-and-failure-correlations.asciidoc[leveloffset=+3] +include::./apm/apm-integrate-with-machine-learning.asciidoc[leveloffset=+3] +include::./apm/apm-create-custom-links.asciidoc[leveloffset=+3] +include::./apm/apm-track-deployments-with-annotations.asciidoc[leveloffset=+3] +include::./apm/apm-query-your-data.asciidoc[leveloffset=+3] +include::./apm/apm-filter-your-data.asciidoc[leveloffset=+3] +include::./apm/apm-observe-lambda-functions.asciidoc[leveloffset=+3] +include::./apm/apm-ui-overview.asciidoc[leveloffset=+3] +include::./apm/apm-ui-services.asciidoc[leveloffset=+4] +include::./apm/apm-ui-traces.asciidoc[leveloffset=+4] +include::./apm/apm-ui-dependencies.asciidoc[leveloffset=+4] +include::./apm/apm-ui-service-map.asciidoc[leveloffset=+4] +include::./apm/apm-ui-service-overview.asciidoc[leveloffset=+4] +include::./apm/apm-ui-transactions.asciidoc[leveloffset=+4] +include::./apm/apm-ui-trace-sample-timeline.asciidoc[leveloffset=+4] +include::./apm/apm-ui-errors.asciidoc[leveloffset=+4] +include::./apm/apm-ui-metrics.asciidoc[leveloffset=+4] +include::./apm/apm-ui-infrastructure.asciidoc[leveloffset=+4] +include::./apm/apm-ui-logs.asciidoc[leveloffset=+4] +include::./apm/apm-data-types.asciidoc[leveloffset=+2] +include::./apm/apm-distributed-tracing.asciidoc[leveloffset=+2] +include::./apm/apm-reduce-your-data-usage.asciidoc[leveloffset=+2] +include::./apm/apm-transaction-sampling.asciidoc[leveloffset=+3] +include::./apm/apm-compress-spans.asciidoc[leveloffset=+3] +include::./apm/apm-stacktrace-collection.asciidoc[leveloffset=+3] +include::./apm/apm-keep-data-secure.asciidoc[leveloffset=+2] +include::./apm/apm-troubleshooting.asciidoc[leveloffset=+2] +include::./apm/apm-reference.asciidoc[leveloffset=+2] +include::./apm/apm-kibana-settings.asciidoc[leveloffset=+3] +include::./apm/apm-server-api.asciidoc[leveloffset=+3] + +include::./infra-monitoring/infra-monitoring.asciidoc[leveloffset=+1] +include::./infra-monitoring/get-started-with-metrics.asciidoc[leveloffset=+2] +include::./infra-monitoring/view-infrastructure-metrics.asciidoc[leveloffset=+2] +include::./infra-monitoring/analyze-hosts.asciidoc[leveloffset=+2] +include::./infra-monitoring/detect-metric-anomalies.asciidoc[leveloffset=+2] +include::./infra-monitoring/configure-infra-settings.asciidoc[leveloffset=+2] +include::./infra-monitoring/troubleshooting-infra.asciidoc[leveloffset=+2] +include::./infra-monitoring/handle-no-results-found-message.asciidoc[leveloffset=+3] +include::./infra-monitoring/metrics-reference.asciidoc[leveloffset=+2] +include::./infra-monitoring/host-metrics.asciidoc[leveloffset=+3] +include::./infra-monitoring/container-metrics.asciidoc[leveloffset=+3] +include::./infra-monitoring/kubernetes-pod-metrics.asciidoc[leveloffset=+3] +include::./infra-monitoring/aws-metrics.asciidoc[leveloffset=+3] +include::./infra-monitoring/metrics-app-fields.asciidoc[leveloffset=+2] + +include::./synthetics/synthetics-intro.asciidoc[leveloffset=+1] +include::./synthetics/synthetics-get-started.asciidoc[leveloffset=+2] +include::./synthetics/synthetics-get-started-project.asciidoc[leveloffset=+3] +include::./synthetics/synthetics-get-started-ui.asciidoc[leveloffset=+3] +include::./synthetics/synthetics-journeys.asciidoc[leveloffset=+2] +include::./synthetics/synthetics-create-test.asciidoc[leveloffset=+3] +include::./synthetics/synthetics-monitor-use.asciidoc[leveloffset=+3] +include::./synthetics/synthetics-recorder.asciidoc[leveloffset=+3] +include::./synthetics/synthetics-lightweight.asciidoc[leveloffset=+2] +include::./synthetics/synthetics-manage-monitors.asciidoc[leveloffset=+2] +include::./synthetics/synthetics-params-secrets.asciidoc[leveloffset=+2] +include::./synthetics/synthetics-analyze.asciidoc[leveloffset=+2] +include::./synthetics/synthetics-private-location.asciidoc[leveloffset=+2] +include::./synthetics/synthetics-command-reference.asciidoc[leveloffset=+2] +include::./synthetics/synthetics-configuration.asciidoc[leveloffset=+2] +include::./synthetics/synthetics-settings.asciidoc[leveloffset=+2] +include::./synthetics/synthetics-feature-roles.asciidoc[leveloffset=+2] +include::./synthetics/synthetics-manage-retention.asciidoc[leveloffset=+2] +include::./synthetics/synthetics-scale-and-architect.asciidoc[leveloffset=+2] +include::./synthetics/synthetics-security-encryption.asciidoc[leveloffset=+2] +include::./synthetics/synthetics-troubleshooting.asciidoc[leveloffset=+2] + +include::./dashboards/dashboards-and-visualizations.asciidoc[leveloffset=+1] + +include::./alerting/alerting.asciidoc[leveloffset=+1] +include::./alerting/create-manage-rules.asciidoc[leveloffset=+2] +include::./alerting/aiops-generate-anomaly-alerts.asciidoc[leveloffset=+3] +include::./alerting/create-anomaly-alert-rule.asciidoc[leveloffset=+3] +include::./alerting/create-custom-threshold-alert-rule.asciidoc[leveloffset=+3] +include::./alerting/create-elasticsearch-query-alert-rule.asciidoc[leveloffset=+3] +include::./alerting/create-error-count-threshold-alert-rule.asciidoc[leveloffset=+3] +include::./alerting/create-failed-transaction-rate-threshold-alert-rule.asciidoc[leveloffset=+3] +include::./alerting/create-inventory-threshold-alert-rule.asciidoc[leveloffset=+3] +include::./alerting/create-latency-threshold-alert-rule.asciidoc[leveloffset=+3] +include::./alerting/create-slo-burn-rate-alert-rule.asciidoc[leveloffset=+3] +include::./alerting/synthetic-monitor-status-alert.asciidoc[leveloffset=+3] +include::./alerting/aggregation-options.asciidoc[leveloffset=+2] +include::./alerting/rate-aggregation.asciidoc[leveloffset=+3] +include::./alerting/view-alerts.asciidoc[leveloffset=+2] +include::./alerting/triage-slo-burn-rate-breaches.asciidoc[leveloffset=+3] +include::./alerting/triage-threshold-breaches.asciidoc[leveloffset=+3] + +include::./slos/slos.asciidoc[leveloffset=+1] +include::./slos/create-an-slo.asciidoc[leveloffset=+2] + +include::./cases/cases.asciidoc[leveloffset=+1] +include::./cases/create-manage-cases.asciidoc[leveloffset=+2] +include::./cases/manage-cases-settings.asciidoc[leveloffset=+2] + +include::./aiops/aiops.asciidoc[leveloffset=+1] +include::./aiops/aiops-detect-anomalies.asciidoc[leveloffset=+2] +include::./aiops/aiops-tune-anomaly-detection-job.asciidoc[leveloffset=+3] +include::./aiops/aiops-forecast-anomaly.asciidoc[leveloffset=+3] +include::./aiops/aiops-analyze-spikes.asciidoc[leveloffset=+2] +include::./aiops/aiops-detect-change-points.asciidoc[leveloffset=+2] + +include::./monitor-datasets.asciidoc[leveloffset=+1] + +include::./ai-assistant/ai-assistant.asciidoc[leveloffset=+1] + +include::./elastic-entity-model.asciidoc[leveloffset=+1] + +include::./technical-preview-limitations.asciidoc[leveloffset=+1] diff --git a/docs/en/serverless/infra-monitoring/get-started-with-metrics.asciidoc b/docs/en/serverless/infra-monitoring/get-started-with-metrics.asciidoc index d60b07e485..a9e9f6ef82 100644 --- a/docs/en/serverless/infra-monitoring/get-started-with-metrics.asciidoc +++ b/docs/en/serverless/infra-monitoring/get-started-with-metrics.asciidoc @@ -14,7 +14,7 @@ include::../partials/roles.asciidoc[] :goal!: In this guide you'll learn how to onboard system metrics data from a machine or server, -then observe the data in Elastic {observability}. +then observe the data in {observability}. To onboard system metrics data: diff --git a/docs/en/serverless/infra-monitoring/get-started-with-metrics.mdx b/docs/en/serverless/infra-monitoring/get-started-with-metrics.mdx index 52ece073d9..aefb9438ab 100644 --- a/docs/en/serverless/infra-monitoring/get-started-with-metrics.mdx +++ b/docs/en/serverless/infra-monitoring/get-started-with-metrics.mdx @@ -12,7 +12,7 @@ import Roles from '../partials/roles.mdx' <Roles role="Admin" goal="onboard system metrics data" /> In this guide you'll learn how to onboard system metrics data from a machine or server, -then observe the data in Elastic ((observability)). +then observe the data in ((observability)). To onboard system metrics data: diff --git a/docs/en/serverless/infra-monitoring/host-metrics.mdx b/docs/en/serverless/infra-monitoring/host-metrics.mdx index d5807486fe..db97c8bbd3 100644 --- a/docs/en/serverless/infra-monitoring/host-metrics.mdx +++ b/docs/en/serverless/infra-monitoring/host-metrics.mdx @@ -398,7 +398,7 @@ However, any alerts that use the old definition will refer to the metric as "leg </DocCell> </DocRow> <DocRow> - <DocCell>**Network Inbound (RX) (legacy)** </DocCell> + <DocCell>**Network Inbound (RX) (legacy)**</DocCell> <DocCell> Number of bytes that have been received per second on the public interfaces of the hosts. @@ -406,7 +406,7 @@ However, any alerts that use the old definition will refer to the metric as "leg </DocCell> </DocRow> <DocRow> - <DocCell>**Network Outbound (TX) (legacy)** </DocCell> + <DocCell>**Network Outbound (TX) (legacy)**</DocCell> <DocCell> Number of bytes that have been sent per second on the public interfaces of the hosts. diff --git a/docs/en/serverless/infra-monitoring/infra-monitoring.asciidoc b/docs/en/serverless/infra-monitoring/infra-monitoring.asciidoc index 2df423c42c..359ae9345f 100644 --- a/docs/en/serverless/infra-monitoring/infra-monitoring.asciidoc +++ b/docs/en/serverless/infra-monitoring/infra-monitoring.asciidoc @@ -6,7 +6,7 @@ preview:[] -Elastic {observability} allows you to visualize infrastructure metrics to help diagnose problematic spikes, +{observability} allows you to visualize infrastructure metrics to help diagnose problematic spikes, identify high resource utilization, automatically discover and track pods, and unify your metrics with logs and APM data. diff --git a/docs/en/serverless/infra-monitoring/infra-monitoring.mdx b/docs/en/serverless/infra-monitoring/infra-monitoring.mdx index 260f3620e9..18ae85e5d1 100644 --- a/docs/en/serverless/infra-monitoring/infra-monitoring.mdx +++ b/docs/en/serverless/infra-monitoring/infra-monitoring.mdx @@ -9,7 +9,7 @@ tags: [ 'serverless', 'observability', 'overview' ] <div id="analyze-metrics"></div> -Elastic ((observability)) allows you to visualize infrastructure metrics to help diagnose problematic spikes, +((observability)) allows you to visualize infrastructure metrics to help diagnose problematic spikes, identify high resource utilization, automatically discover and track pods, and unify your metrics with logs and APM data. diff --git a/docs/en/serverless/logging/plaintext-application-logs.asciidoc b/docs/en/serverless/logging/plaintext-application-logs.asciidoc index b61e0df580..a6c4081ee5 100644 --- a/docs/en/serverless/logging/plaintext-application-logs.asciidoc +++ b/docs/en/serverless/logging/plaintext-application-logs.asciidoc @@ -252,6 +252,7 @@ Click **Import processors** and add a similar JSON to the following example: <2> `field`: The field you're extracting data from, `message` in this case. + <3> `pattern`: The pattern of the elements in your log data. The pattern varies depending on your log format. `%{@timestamp}`, `%{log.level}`, `%{host.ip}`, and `%{message}` are common {ecs-ref}/ecs-reference.html[ECS] fields. This pattern would match a log file in this format: `2023-11-07T09:39:01.012Z ERROR 192.168.1.110 Server hardware failure detected.` + . Click **Create pipeline**. . Save and deploy your integration. diff --git a/docs/en/serverless/logging/troubleshoot-logs.asciidoc b/docs/en/serverless/logging/troubleshoot-logs.asciidoc index 3997339fed..44c54a3a30 100644 --- a/docs/en/serverless/logging/troubleshoot-logs.asciidoc +++ b/docs/en/serverless/logging/troubleshoot-logs.asciidoc @@ -26,7 +26,7 @@ You need permission to manage API keys You need to either: -* Ask an administrator to update your user role to at least **Deployment access** → **Admin**. Read more about user roles in https://www.elastic.co/docs/current/serverless/general/assign-user-roles[Assign user roles and privileges]. After your use role is updated, restart the onboarding flow. +* Ask an administrator to update your user role to at least **Deployment access** → **Admin**. Read more about user roles in <<general-assign-user-roles,Assign user roles and privileges>>. After your use role is updated, restart the onboarding flow. * Get an API key from an administrator and manually add the API to the {agent} configuration. See <<observability-stream-log-files-step-3-configure-the-agent,Configure the {agent}>> for more on manually updating the configuration and adding the API key. // Not sure if these are different in serverless... diff --git a/docs/en/serverless/observability-overview.asciidoc b/docs/en/serverless/observability-overview.asciidoc index 0cdfedea47..0ba83bd2cc 100644 --- a/docs/en/serverless/observability-overview.asciidoc +++ b/docs/en/serverless/observability-overview.asciidoc @@ -10,11 +10,11 @@ preview:[] It's an important part of any system that you build and want to monitor. Being able to detect and fix root cause events quickly within an observable system is a minimum requirement for any analyst. -Elastic {observability} provides a single stack to unify your logs, metrics, and application traces. +{observability} provides a single stack to unify your logs, metrics, and application traces. Ingest your data directly to your Observability project, where you can further process and enhance the data, before visualizing it and adding alerts. -image::images/serverless-capabilities.svg[Elastic {observability} overview diagram] +image::images/serverless-capabilities.svg[{observability} overview diagram] [discrete] [[apm-overview]] diff --git a/docs/en/serverless/observability-overview.mdx b/docs/en/serverless/observability-overview.mdx index 6bd2cc0e40..49871d18a3 100644 --- a/docs/en/serverless/observability-overview.mdx +++ b/docs/en/serverless/observability-overview.mdx @@ -5,19 +5,19 @@ description: Learn how to accelerate problem resolution with open, flexible, and tags: [ 'serverless', 'observability', 'overview' ] --- -<p><DocBadge template="technical preview" /></p> +<p><DocBadge template="technical preview" /></p> <div id="observability-introduction"></div> ((observability)) provides granular insights and context into the behavior of applications running in your environments. -It's an important part of any system that you build and want to monitor. +It's an important part of any system that you build and want to monitor. Being able to detect and fix root cause events quickly within an observable system is a minimum requirement for any analyst. -Elastic ((observability)) provides a single stack to unify your logs, metrics, and application traces. +((observability)) provides a single stack to unify your logs, metrics, and application traces. Ingest your data directly to your Observability project, where you can further process and enhance the data, before visualizing it and adding alerts. -<DocImage size="xl" flatImage url="./images/serverless-capabilities.svg" alt="Elastic ((observability)) overview diagram"/> +<DocImage size="xl" flatImage url="./images/serverless-capabilities.svg" alt="((observability)) overview diagram"/> <div id="apm-overview"></div> diff --git a/docs/en/serverless/partials/roles.asciidoc b/docs/en/serverless/partials/roles.asciidoc index 099647d125..58ebd580f6 100644 --- a/docs/en/serverless/partials/roles.asciidoc +++ b/docs/en/serverless/partials/roles.asciidoc @@ -1,5 +1,5 @@ .Required role [NOTE] ==== -The **{role}** role or higher is required to {goal}. To learn more, refer to https://www.elastic.co/docs/current/serverless/general/assign-user-roles[Assign user roles and privileges]. +The **{role}** role or higher is required to {goal}. To learn more, refer to <<general-assign-user-roles,Assign user roles and privileges>>. ==== diff --git a/docs/en/serverless/projects/billing.asciidoc b/docs/en/serverless/projects/billing.asciidoc index 8b578d401e..a371ecdefe 100644 --- a/docs/en/serverless/projects/billing.asciidoc +++ b/docs/en/serverless/projects/billing.asciidoc @@ -18,6 +18,6 @@ When you use Elastic Observability, your bill is calculated based on data volume Browser (journey) based tests are charged on a per-test-run basis, and Ping (lightweight) tests have an all-you-can-use model per location used. -For more information, refer to https://www.elastic.co/docs/current/serverless/general/serverless-billing[Serverless billing dimensions]. +For more information, refer to <<general-serverless-billing,Serverless billing dimensions>>. For detailed Observability serverless project rates, check the https://www.elastic.co/pricing/serverless-observability[Observability Serverless pricing page]. diff --git a/docs/en/serverless/projects/create-an-observability-project.asciidoc b/docs/en/serverless/projects/create-an-observability-project.asciidoc index e644a9489c..66614e7fc0 100644 --- a/docs/en/serverless/projects/create-an-observability-project.asciidoc +++ b/docs/en/serverless/projects/create-an-observability-project.asciidoc @@ -1,11 +1,11 @@ [[observability-create-an-observability-project]] -= Create an Elastic {observability} project += Create an {observability} project -:description: Create a fully-managed Elastic {observability} project to monitor the health of your applications. +:description: Create a fully-managed {observability} project to monitor the health of your applications. :keywords: serverless, observability, how-to ++++ -<titleabbrev>Create an Observability project</titleabbrev> +<titleabbrev>Create an {observability} project</titleabbrev> ++++ :role: Admin @@ -17,7 +17,7 @@ include::../partials/roles.asciidoc[] preview:[] -An {observability} project allows you to run Elastic {observability} in an autoscaled and fully-managed environment, +An {observability} project allows you to run {observability} in an autoscaled and fully-managed environment, where you don't have to manage the underlying {es} cluster or {kib} instances. . Navigate to https://cloud.elastic.co/[cloud.elastic.co] and log in to your account. @@ -27,7 +27,7 @@ where you don't have to manage the underlying {es} cluster or {kib} instances. . (Optional) Click **Edit settings** to change your project settings: + ** **Cloud provider**: The cloud platform where you’ll deploy your project. We currently support Amazon Web Services (AWS). -** **Region**: The https://www.elastic.co/docs/current/serverless/regions[region] where your project will live. +** **Region**: The <<regions,region>> where your project will live. . Click **Create project**. It takes a few minutes to create your project. . When the project is ready, click **Continue**. diff --git a/docs/en/serverless/projects/create-an-observability-project.mdx b/docs/en/serverless/projects/create-an-observability-project.mdx index 77bf3c65f3..dac7e20c1b 100644 --- a/docs/en/serverless/projects/create-an-observability-project.mdx +++ b/docs/en/serverless/projects/create-an-observability-project.mdx @@ -1,7 +1,7 @@ --- slug: /serverless/observability/create-an-observability-project -title: Create an Elastic ((observability)) project -description: Create a fully-managed Elastic ((observability)) project to monitor the health of your applications. +title: Create an ((observability)) project +description: Create a fully-managed ((observability)) project to monitor the health of your applications. tags: [ 'serverless', 'observability', 'how-to' ] --- @@ -11,7 +11,7 @@ import Roles from '../partials/roles.mdx' <p><DocBadge template="technical preview" /></p> -An ((observability)) project allows you to run Elastic ((observability)) in an autoscaled and fully-managed environment, +An ((observability)) project allows you to run ((observability)) in an autoscaled and fully-managed environment, where you don't have to manage the underlying ((es)) cluster or ((kib)) instances. 1. Navigate to [cloud.elastic.co](https://cloud.elastic.co/) and log in to your account. diff --git a/docs/en/serverless/quickstarts/k8s-logs-metrics.asciidoc b/docs/en/serverless/quickstarts/k8s-logs-metrics.asciidoc index 035bc281b4..9e36851e7c 100644 --- a/docs/en/serverless/quickstarts/k8s-logs-metrics.asciidoc +++ b/docs/en/serverless/quickstarts/k8s-logs-metrics.asciidoc @@ -17,7 +17,7 @@ The kubectl command installs the standalone Elastic Agent in your Kubernetes clu == Prerequisites * An {observability} project. To learn more, refer to <<observability-create-an-observability-project>>. -* A user with the **Admin** role or higher—required to onboard system logs and metrics. To learn more, refer to https://www.elastic.co/docs/current/serverless/general/assign-user-roles[Assign user roles and privileges]. +* A user with the **Admin** role or higher—required to onboard system logs and metrics. To learn more, refer to <<general-assign-user-roles,Assign user roles and privileges>>. * A running Kubernetes cluster. * https://kubernetes.io/docs/reference/kubectl/[Kubectl]. diff --git a/docs/en/serverless/quickstarts/monitor-hosts-with-elastic-agent.asciidoc b/docs/en/serverless/quickstarts/monitor-hosts-with-elastic-agent.asciidoc index 42a047e0b8..6bfa21cd36 100644 --- a/docs/en/serverless/quickstarts/monitor-hosts-with-elastic-agent.asciidoc +++ b/docs/en/serverless/quickstarts/monitor-hosts-with-elastic-agent.asciidoc @@ -20,7 +20,7 @@ The script also generates an {agent} configuration file that you can use with yo == Prerequisites * An {observability} project. To learn more, refer to <<observability-create-an-observability-project>>. -* A user with the **Admin** role or higher—required to onboard system logs and metrics. To learn more, refer to https://www.elastic.co/docs/current/serverless/general/assign-user-roles[Assign user roles and privileges]. +* A user with the **Admin** role or higher—required to onboard system logs and metrics. To learn more, refer to <<general-assign-user-roles,Assign user roles and privileges>>. * Root privileges on the host—required to run the auto-detection script used in this quickstart. [discrete] @@ -103,7 +103,7 @@ image::images/quickstart-host-overview.png[Host overview dashboard] == Get value out of your data After using the dashboards to examine your data and confirm you've ingested all the host logs and metrics you want to monitor, -you can use Elastic {observability} to gain deeper insight into your data. +you can use {observability} to gain deeper insight into your data. For host monitoring, the following capabilities and features are recommended: diff --git a/docs/en/serverless/quickstarts/monitor-hosts-with-elastic-agent.mdx b/docs/en/serverless/quickstarts/monitor-hosts-with-elastic-agent.mdx index f6381bb6a0..2fa12a7caf 100644 --- a/docs/en/serverless/quickstarts/monitor-hosts-with-elastic-agent.mdx +++ b/docs/en/serverless/quickstarts/monitor-hosts-with-elastic-agent.mdx @@ -93,7 +93,7 @@ Metrics that indicate a possible problem are highlighted in red. ## Get value out of your data After using the dashboards to examine your data and confirm you've ingested all the host logs and metrics you want to monitor, -you can use Elastic ((observability)) to gain deeper insight into your data. +you can use ((observability)) to gain deeper insight into your data. For host monitoring, the following capabilities and features are recommended: diff --git a/docs/en/serverless/synthetics/synthetics-analyze.mdx b/docs/en/serverless/synthetics/synthetics-analyze.mdx index 8e93a1c0f0..9f0be4eb41 100644 --- a/docs/en/serverless/synthetics/synthetics-analyze.mdx +++ b/docs/en/serverless/synthetics/synthetics-analyze.mdx @@ -107,7 +107,7 @@ included the in <DocLink slug="/serverless/observability/synthetics-analyze" sec If the monitor is configured to <DocLink slug="/serverless/observability/synthetics-configuration" section="monitor">retest on failure</DocLink>, you'll see retests listed in the **Test runs** table. Runs that are retests include a -rerun icon (image:images/icons/refresh.svg[Refresh icon]) next to the result badge. +rerun icon (<DocIcon type="refresh" title="Refresh icon" />) next to the result badge. ![A failed run and a retest in the table of test runs in the Synthetics UI](../images/synthetics-retest.png) diff --git a/docs/en/serverless/synthetics/synthetics-command-reference.asciidoc b/docs/en/serverless/synthetics/synthetics-command-reference.asciidoc index 89b80ab814..2d9269c86e 100644 --- a/docs/en/serverless/synthetics/synthetics-command-reference.asciidoc +++ b/docs/en/serverless/synthetics/synthetics-command-reference.asciidoc @@ -11,7 +11,7 @@ preview:[] [[elastic-synthetics-command]] == `@elastic/synthetics` -Elastic uses the https://www.npmjs.com/package/@elastic/synthetics[@elastic/synthetics[@elastic/synthetics] +Elastic uses the https://www.npmjs.com/package/@elastic/synthetics[@elastic/synthetics] library to run synthetic browser tests and report the test results. The library also provides a CLI to help you scaffold, develop/run tests locally, and push tests to Elastic. diff --git a/docs/en/serverless/synthetics/synthetics-command-reference.mdx b/docs/en/serverless/synthetics/synthetics-command-reference.mdx index 9c248069ae..fb55547acf 100644 --- a/docs/en/serverless/synthetics/synthetics-command-reference.mdx +++ b/docs/en/serverless/synthetics/synthetics-command-reference.mdx @@ -13,7 +13,7 @@ tags: [] ## `@elastic/synthetics` -Elastic uses the [@elastic/synthetics](https://www.npmjs.com/package/@elastic/synthetics[@elastic/synthetics) +Elastic uses the [@elastic/synthetics](https://www.npmjs.com/package/@elastic/synthetics) library to run synthetic browser tests and report the test results. The library also provides a CLI to help you scaffold, develop/run tests locally, and push tests to Elastic. diff --git a/docs/en/serverless/synthetics/synthetics-feature-roles.asciidoc b/docs/en/serverless/synthetics/synthetics-feature-roles.asciidoc index 9402ff7fc3..54d33ec956 100644 --- a/docs/en/serverless/synthetics/synthetics-feature-roles.asciidoc +++ b/docs/en/serverless/synthetics/synthetics-feature-roles.asciidoc @@ -11,16 +11,16 @@ requirements and the minimum privileges required to use specific features. | Role | Synthetics functionality | Viewer -| * View and create visualizations that access Synthetics data. +a| * View and create visualizations that access Synthetics data. | Editor -| * Create, modify, and delete monitors. +a| * Create, modify, and delete monitors. * View and create visualizations that access Synthetics data. | Admin -| * Full access to project management, properties, and security privileges. +a| * Full access to project management, properties, and security privileges. * Create, modify, and delete monitors. * View and create visualizations that access Synthetics data. |=== -Read more about user roles in https://www.elastic.co/docs/current/serverless/general/assign-user-roles[Assign user roles and privileges]. +Read more about user roles in <<general-assign-user-roles,Assign user roles and privileges>>. diff --git a/docs/en/serverless/synthetics/synthetics-private-location.asciidoc b/docs/en/serverless/synthetics/synthetics-private-location.asciidoc index 253c0c840b..79d4e2d78f 100644 --- a/docs/en/serverless/synthetics/synthetics-private-location.asciidoc +++ b/docs/en/serverless/synthetics/synthetics-private-location.asciidoc @@ -102,7 +102,7 @@ Version {version} has not yet been released. endif::[] ifeval::["{release-state}" != "unreleased"] -[source,sh] +[source,sh,subs="attributes+"] ---- docker run \ --env FLEET_ENROLL=1 \ diff --git a/docs/en/serverless/transclusion/apm/guide/spec/v2/error.asciidoc b/docs/en/serverless/transclusion/apm/guide/spec/v2/error.asciidoc deleted file mode 100644 index d531a8e3a7..0000000000 --- a/docs/en/serverless/transclusion/apm/guide/spec/v2/error.asciidoc +++ /dev/null @@ -1,3 +0,0 @@ - - -<DocCode children={snippet} /> diff --git a/docs/en/serverless/transclusion/apm/guide/spec/v2/error.json b/docs/en/serverless/transclusion/apm/guide/spec/v2/error.json new file mode 100644 index 0000000000..10bd68aceb --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/spec/v2/error.json @@ -0,0 +1,1293 @@ +{ + "$id": "docs/spec/v2/error", + "description": "errorEvent represents an error or a logged error message, captured by an APM agent in a monitored service.", + "type": "object", + "properties": { + "context": { + "description": "Context holds arbitrary contextual information for the event.", + "type": [ + "null", + "object" + ], + "properties": { + "cloud": { + "description": "Cloud holds fields related to the cloud or infrastructure the events are coming from.", + "type": [ + "null", + "object" + ], + "properties": { + "origin": { + "description": "Origin contains the self-nested field groups for cloud.", + "type": [ + "null", + "object" + ], + "properties": { + "account": { + "description": "The cloud account or organization id used to identify different entities in a multi-tenant environment.", + "type": [ + "null", + "object" + ], + "properties": { + "id": { + "description": "The cloud account or organization id used to identify different entities in a multi-tenant environment.", + "type": [ + "null", + "string" + ] + } + } + }, + "provider": { + "description": "Name of the cloud provider.", + "type": [ + "null", + "string" + ] + }, + "region": { + "description": "Region in which this host, resource, or service is located.", + "type": [ + "null", + "string" + ] + }, + "service": { + "description": "The cloud service name is intended to distinguish services running on different platforms within a provider.", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "The cloud service name is intended to distinguish services running on different platforms within a provider.", + "type": [ + "null", + "string" + ] + } + } + } + } + } + } + }, + "custom": { + "description": "Custom can contain additional metadata to be stored with the event. The format is unspecified and can be deeply nested objects. The information will not be indexed or searchable in Elasticsearch.", + "type": [ + "null", + "object" + ] + }, + "message": { + "description": "Message holds details related to message receiving and publishing if the captured event integrates with a messaging system", + "type": [ + "null", + "object" + ], + "properties": { + "age": { + "description": "Age of the message. If the monitored messaging framework provides a timestamp for the message, agents may use it. Otherwise, the sending agent can add a timestamp in milliseconds since the Unix epoch to the message's metadata to be retrieved by the receiving agent. If a timestamp is not available, agents should omit this field.", + "type": [ + "null", + "object" + ], + "properties": { + "ms": { + "description": "Age of the message in milliseconds.", + "type": [ + "null", + "integer" + ] + } + } + }, + "body": { + "description": "Body of the received message, similar to an HTTP request body", + "type": [ + "null", + "string" + ] + }, + "headers": { + "description": "Headers received with the message, similar to HTTP request headers.", + "type": [ + "null", + "object" + ], + "additionalProperties": false, + "patternProperties": { + "[.*]*$": { + "type": [ + "null", + "array", + "string" + ], + "items": { + "type": "string" + } + } + } + }, + "queue": { + "description": "Queue holds information about the message queue where the message is received.", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Name holds the name of the message queue where the message is received.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "routing_key": { + "description": "RoutingKey holds the optional routing key of the received message as set on the queuing system, such as in RabbitMQ.", + "type": [ + "null", + "string" + ] + } + } + }, + "page": { + "description": "Page holds information related to the current page and page referers. It is only sent from RUM agents.", + "type": [ + "null", + "object" + ], + "properties": { + "referer": { + "description": "Referer holds the URL of the page that 'linked' to the current page.", + "type": [ + "null", + "string" + ] + }, + "url": { + "description": "URL of the current page", + "type": [ + "null", + "string" + ] + } + } + }, + "request": { + "description": "Request describes the HTTP request information in case the event was created as a result of an HTTP request.", + "type": [ + "null", + "object" + ], + "properties": { + "body": { + "description": "Body only contais the request bod, not the query string information. It can either be a dictionary (for standard HTTP requests) or a raw request body.", + "type": [ + "null", + "string", + "object" + ] + }, + "cookies": { + "description": "Cookies used by the request, parsed as key-value objects.", + "type": [ + "null", + "object" + ] + }, + "env": { + "description": "Env holds environment variable information passed to the monitored service.", + "type": [ + "null", + "object" + ] + }, + "headers": { + "description": "Headers includes any HTTP headers sent by the requester. Cookies will be taken by headers if supplied.", + "type": [ + "null", + "object" + ], + "additionalProperties": false, + "patternProperties": { + "[.*]*$": { + "type": [ + "null", + "array", + "string" + ], + "items": { + "type": "string" + } + } + } + }, + "http_version": { + "description": "HTTPVersion holds information about the used HTTP version.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "method": { + "description": "Method holds information about the method of the HTTP request.", + "type": "string", + "maxLength": 1024 + }, + "socket": { + "description": "Socket holds information related to the recorded request, such as whether or not data were encrypted and the remote address.", + "type": [ + "null", + "object" + ], + "properties": { + "encrypted": { + "description": "Encrypted indicates whether a request was sent as TLS/HTTPS request. DEPRECATED: this field will be removed in a future release.", + "type": [ + "null", + "boolean" + ] + }, + "remote_address": { + "description": "RemoteAddress holds the network address sending the request. It should be obtained through standard APIs and not be parsed from any headers like 'Forwarded'.", + "type": [ + "null", + "string" + ] + } + } + }, + "url": { + "description": "URL holds information sucha as the raw URL, scheme, host and path.", + "type": [ + "null", + "object" + ], + "properties": { + "full": { + "description": "Full, possibly agent-assembled URL of the request, e.g. https://example.com:443/search?q=elasticsearch#top.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "hash": { + "description": "Hash of the request URL, e.g. 'top'", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "hostname": { + "description": "Hostname information of the request, e.g. 'example.com'.\"", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "pathname": { + "description": "Path of the request, e.g. '/search'", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "port": { + "description": "Port of the request, e.g. '443'. Can be sent as string or int.", + "type": [ + "null", + "string", + "integer" + ], + "maxLength": 1024 + }, + "protocol": { + "description": "Protocol information for the recorded request, e.g. 'https:'.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "raw": { + "description": "Raw unparsed URL of the HTTP request line, e.g https://example.com:443/search?q=elasticsearch. This URL may be absolute or relative. For more details, see https://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html#sec5.1.2.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "search": { + "description": "Search contains the query string information of the request. It is expected to have values delimited by ampersands.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + } + }, + "required": [ + "method" + ] + }, + "response": { + "description": "Response describes the HTTP response information in case the event was created as a result of an HTTP request.", + "type": [ + "null", + "object" + ], + "properties": { + "decoded_body_size": { + "description": "DecodedBodySize holds the size of the decoded payload.", + "type": [ + "null", + "integer" + ] + }, + "encoded_body_size": { + "description": "EncodedBodySize holds the size of the encoded payload.", + "type": [ + "null", + "integer" + ] + }, + "finished": { + "description": "Finished indicates whether the response was finished or not.", + "type": [ + "null", + "boolean" + ] + }, + "headers": { + "description": "Headers holds the http headers sent in the http response.", + "type": [ + "null", + "object" + ], + "additionalProperties": false, + "patternProperties": { + "[.*]*$": { + "type": [ + "null", + "array", + "string" + ], + "items": { + "type": "string" + } + } + } + }, + "headers_sent": { + "description": "HeadersSent indicates whether http headers were sent.", + "type": [ + "null", + "boolean" + ] + }, + "status_code": { + "description": "StatusCode sent in the http response.", + "type": [ + "null", + "integer" + ] + }, + "transfer_size": { + "description": "TransferSize holds the total size of the payload.", + "type": [ + "null", + "integer" + ] + } + } + }, + "service": { + "description": "Service related information can be sent per event. Information provided here will override the more generic information retrieved from metadata, missing service fields will be retrieved from the metadata information.", + "type": [ + "null", + "object" + ], + "properties": { + "agent": { + "description": "Agent holds information about the APM agent capturing the event.", + "type": [ + "null", + "object" + ], + "properties": { + "ephemeral_id": { + "description": "EphemeralID is a free format ID used for metrics correlation by agents", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "name": { + "description": "Name of the APM agent capturing information.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "version": { + "description": "Version of the APM agent capturing information.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "environment": { + "description": "Environment in which the monitored service is running, e.g. \`production\` or \`staging\`.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "framework": { + "description": "Framework holds information about the framework used in the monitored service.", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Name of the used framework", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "version": { + "description": "Version of the used framework", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "id": { + "description": "ID holds a unique identifier for the service.", + "type": [ + "null", + "string" + ] + }, + "language": { + "description": "Language holds information about the programming language of the monitored service.", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Name of the used programming language", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "version": { + "description": "Version of the used programming language", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "name": { + "description": "Name of the monitored service.", + "type": [ + "null", + "string" + ], + "maxLength": 1024, + "pattern": "^[a-zA-Z0-9 _-]+$" + }, + "node": { + "description": "Node must be a unique meaningful name of the service node.", + "type": [ + "null", + "object" + ], + "properties": { + "configured_name": { + "description": "Name of the service node", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "origin": { + "description": "Origin contains the self-nested field groups for service.", + "type": [ + "null", + "object" + ], + "properties": { + "id": { + "description": "Immutable id of the service emitting this event.", + "type": [ + "null", + "string" + ] + }, + "name": { + "description": "Immutable name of the service emitting this event.", + "type": [ + "null", + "string" + ] + }, + "version": { + "description": "The version of the service the data was collected from.", + "type": [ + "null", + "string" + ] + } + } + }, + "runtime": { + "description": "Runtime holds information about the language runtime running the monitored service", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Name of the language runtime", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "version": { + "description": "Version of the language runtime", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "target": { + "description": "Target holds information about the outgoing service in case of an outgoing event", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Immutable name of the target service for the event", + "type": [ + "null", + "string" + ] + }, + "type": { + "description": "Immutable type of the target service for the event", + "type": [ + "null", + "string" + ] + } + }, + "anyOf": [ + { + "properties": { + "type": { + "type": "string" + } + }, + "required": [ + "type" + ] + }, + { + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ] + } + ] + }, + "version": { + "description": "Version of the monitored service.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "tags": { + "description": "Tags are a flat mapping of user-defined tags. On the agent side, tags are called labels. Allowed value types are string, boolean and number values. Tags are indexed and searchable.", + "type": [ + "null", + "object" + ], + "additionalProperties": { + "type": [ + "null", + "string", + "boolean", + "number" + ], + "maxLength": 1024 + } + }, + "user": { + "description": "User holds information about the correlated user for this event. If user data are provided here, all user related information from metadata is ignored, otherwise the metadata's user information will be stored with the event.", + "type": [ + "null", + "object" + ], + "properties": { + "domain": { + "description": "Domain of the logged in user", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "email": { + "description": "Email of the user.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "id": { + "description": "ID identifies the logged in user, e.g. can be the primary key of the user", + "type": [ + "null", + "string", + "integer" + ], + "maxLength": 1024 + }, + "username": { + "description": "Name of the user.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + } + } + }, + "culprit": { + "description": "Culprit identifies the function call which was the primary perpetrator of this event.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "exception": { + "description": "Exception holds information about the original error. The information is language specific.", + "type": [ + "null", + "object" + ], + "properties": { + "attributes": { + "description": "Attributes of the exception.", + "type": [ + "null", + "object" + ] + }, + "cause": { + "description": "Cause can hold a collection of error exceptions representing chained exceptions. The chain starts with the outermost exception, followed by its cause, and so on.", + "type": [ + "null", + "array" + ], + "items": { + "type": "object" + }, + "minItems": 0 + }, + "code": { + "description": "Code that is set when the error happened, e.g. database error code.", + "type": [ + "null", + "string", + "integer" + ], + "maxLength": 1024 + }, + "handled": { + "description": "Handled indicates whether the error was caught in the code or not.", + "type": [ + "null", + "boolean" + ] + }, + "message": { + "description": "Message contains the originally captured error message.", + "type": [ + "null", + "string" + ] + }, + "module": { + "description": "Module describes the exception type's module namespace.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "stacktrace": { + "description": "Stacktrace information of the captured exception.", + "type": [ + "null", + "array" + ], + "items": { + "type": "object", + "properties": { + "abs_path": { + "description": "AbsPath is the absolute path of the frame's file.", + "type": [ + "null", + "string" + ] + }, + "classname": { + "description": "Classname of the frame.", + "type": [ + "null", + "string" + ] + }, + "colno": { + "description": "ColumnNumber of the frame.", + "type": [ + "null", + "integer" + ] + }, + "context_line": { + "description": "ContextLine is the line from the frame's file.", + "type": [ + "null", + "string" + ] + }, + "filename": { + "description": "Filename is the relative name of the frame's file.", + "type": [ + "null", + "string" + ] + }, + "function": { + "description": "Function represented by the frame.", + "type": [ + "null", + "string" + ] + }, + "library_frame": { + "description": "LibraryFrame indicates whether the frame is from a third party library.", + "type": [ + "null", + "boolean" + ] + }, + "lineno": { + "description": "LineNumber of the frame.", + "type": [ + "null", + "integer" + ] + }, + "module": { + "description": "Module to which the frame belongs to.", + "type": [ + "null", + "string" + ] + }, + "post_context": { + "description": "PostContext is a slice of code lines immediately before the line from the frame's file.", + "type": [ + "null", + "array" + ], + "items": { + "type": "string" + }, + "minItems": 0 + }, + "pre_context": { + "description": "PreContext is a slice of code lines immediately after the line from the frame's file.", + "type": [ + "null", + "array" + ], + "items": { + "type": "string" + }, + "minItems": 0 + }, + "vars": { + "description": "Vars is a flat mapping of local variables of the frame.", + "type": [ + "null", + "object" + ] + } + }, + "anyOf": [ + { + "properties": { + "classname": { + "type": "string" + } + }, + "required": [ + "classname" + ] + }, + { + "properties": { + "filename": { + "type": "string" + } + }, + "required": [ + "filename" + ] + } + ] + }, + "minItems": 0 + }, + "type": { + "description": "Type of the exception.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + }, + "anyOf": [ + { + "properties": { + "message": { + "type": "string" + } + }, + "required": [ + "message" + ] + }, + { + "properties": { + "type": { + "type": "string" + } + }, + "required": [ + "type" + ] + } + ] + }, + "id": { + "description": "ID holds the hex encoded 128 random bits ID of the event.", + "type": "string", + "maxLength": 1024 + }, + "log": { + "description": "Log holds additional information added when the error is logged.", + "type": [ + "null", + "object" + ], + "properties": { + "level": { + "description": "Level represents the severity of the recorded log.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "logger_name": { + "description": "LoggerName holds the name of the used logger instance.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "message": { + "description": "Message of the logged error. In case a parameterized message is captured, Message should contain the same information, but with any placeholders being replaced.", + "type": "string" + }, + "param_message": { + "description": "ParamMessage should contain the same information as Message, but with placeholders where parameters were logged, e.g. 'error connecting to %s'. The string is not interpreted, allowing differnt placeholders per client languange. The information might be used to group errors together.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "stacktrace": { + "description": "Stacktrace information of the captured error.", + "type": [ + "null", + "array" + ], + "items": { + "type": "object", + "properties": { + "abs_path": { + "description": "AbsPath is the absolute path of the frame's file.", + "type": [ + "null", + "string" + ] + }, + "classname": { + "description": "Classname of the frame.", + "type": [ + "null", + "string" + ] + }, + "colno": { + "description": "ColumnNumber of the frame.", + "type": [ + "null", + "integer" + ] + }, + "context_line": { + "description": "ContextLine is the line from the frame's file.", + "type": [ + "null", + "string" + ] + }, + "filename": { + "description": "Filename is the relative name of the frame's file.", + "type": [ + "null", + "string" + ] + }, + "function": { + "description": "Function represented by the frame.", + "type": [ + "null", + "string" + ] + }, + "library_frame": { + "description": "LibraryFrame indicates whether the frame is from a third party library.", + "type": [ + "null", + "boolean" + ] + }, + "lineno": { + "description": "LineNumber of the frame.", + "type": [ + "null", + "integer" + ] + }, + "module": { + "description": "Module to which the frame belongs to.", + "type": [ + "null", + "string" + ] + }, + "post_context": { + "description": "PostContext is a slice of code lines immediately before the line from the frame's file.", + "type": [ + "null", + "array" + ], + "items": { + "type": "string" + }, + "minItems": 0 + }, + "pre_context": { + "description": "PreContext is a slice of code lines immediately after the line from the frame's file.", + "type": [ + "null", + "array" + ], + "items": { + "type": "string" + }, + "minItems": 0 + }, + "vars": { + "description": "Vars is a flat mapping of local variables of the frame.", + "type": [ + "null", + "object" + ] + } + }, + "anyOf": [ + { + "properties": { + "classname": { + "type": "string" + } + }, + "required": [ + "classname" + ] + }, + { + "properties": { + "filename": { + "type": "string" + } + }, + "required": [ + "filename" + ] + } + ] + }, + "minItems": 0 + } + }, + "required": [ + "message" + ] + }, + "parent_id": { + "description": "ParentID holds the hex encoded 64 random bits ID of the parent transaction or span.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "timestamp": { + "description": "Timestamp holds the recorded time of the event, UTC based and formatted as microseconds since Unix epoch.", + "type": [ + "null", + "integer" + ] + }, + "trace_id": { + "description": "TraceID holds the hex encoded 128 random bits ID of the correlated trace.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "transaction": { + "description": "Transaction holds information about the correlated transaction.", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Name is the generic designation of a transaction in the scope of a single service, eg: 'GET /users/:id'.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "sampled": { + "description": "Sampled indicates whether or not the full information for a transaction is captured. If a transaction is unsampled no spans and less context information will be reported.", + "type": [ + "null", + "boolean" + ] + }, + "type": { + "description": "Type expresses the correlated transaction's type as keyword that has specific relevance within the service's domain, eg: 'request', 'backgroundjob'.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "transaction_id": { + "description": "TransactionID holds the hex encoded 64 random bits ID of the correlated transaction.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + }, + "required": [ + "id" + ], + "allOf": [ + { + "if": { + "properties": { + "transaction_id": { + "type": "string" + } + }, + "required": [ + "transaction_id" + ] + }, + "then": { + "properties": { + "parent_id": { + "type": "string" + } + }, + "required": [ + "parent_id" + ] + } + }, + { + "if": { + "properties": { + "trace_id": { + "type": "string" + } + }, + "required": [ + "trace_id" + ] + }, + "then": { + "properties": { + "parent_id": { + "type": "string" + } + }, + "required": [ + "parent_id" + ] + } + }, + { + "if": { + "properties": { + "transaction_id": { + "type": "string" + } + }, + "required": [ + "transaction_id" + ] + }, + "then": { + "properties": { + "trace_id": { + "type": "string" + } + }, + "required": [ + "trace_id" + ] + } + }, + { + "if": { + "properties": { + "parent_id": { + "type": "string" + } + }, + "required": [ + "parent_id" + ] + }, + "then": { + "properties": { + "trace_id": { + "type": "string" + } + }, + "required": [ + "trace_id" + ] + } + } + ], + "anyOf": [ + { + "properties": { + "exception": { + "type": "object" + } + }, + "required": [ + "exception" + ] + }, + { + "properties": { + "log": { + "type": "object" + } + }, + "required": [ + "log" + ] + } + ] +} \ No newline at end of file diff --git a/docs/en/serverless/transclusion/apm/guide/spec/v2/metadata.asciidoc b/docs/en/serverless/transclusion/apm/guide/spec/v2/metadata.asciidoc deleted file mode 100644 index d531a8e3a7..0000000000 --- a/docs/en/serverless/transclusion/apm/guide/spec/v2/metadata.asciidoc +++ /dev/null @@ -1,3 +0,0 @@ - - -<DocCode children={snippet} /> diff --git a/docs/en/serverless/transclusion/apm/guide/spec/v2/metadata.json b/docs/en/serverless/transclusion/apm/guide/spec/v2/metadata.json new file mode 100644 index 0000000000..8417a17c66 --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/spec/v2/metadata.json @@ -0,0 +1,567 @@ +{ + "$id": "docs/spec/v2/metadata", + "type": "object", + "properties": { + "cloud": { + "description": "Cloud metadata about where the monitored service is running.", + "type": [ + "null", + "object" + ], + "properties": { + "account": { + "description": "Account where the monitored service is running.", + "type": [ + "null", + "object" + ], + "properties": { + "id": { + "description": "ID of the cloud account.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "name": { + "description": "Name of the cloud account.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "availability_zone": { + "description": "AvailabilityZone where the monitored service is running, e.g. us-east-1a", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "instance": { + "description": "Instance on which the monitored service is running.", + "type": [ + "null", + "object" + ], + "properties": { + "id": { + "description": "ID of the cloud instance.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "name": { + "description": "Name of the cloud instance.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "machine": { + "description": "Machine on which the monitored service is running.", + "type": [ + "null", + "object" + ], + "properties": { + "type": { + "description": "ID of the cloud machine.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "project": { + "description": "Project in which the monitored service is running.", + "type": [ + "null", + "object" + ], + "properties": { + "id": { + "description": "ID of the cloud project.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "name": { + "description": "Name of the cloud project.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "provider": { + "description": "Provider that is used, e.g. aws, azure, gcp, digitalocean.", + "type": "string", + "maxLength": 1024 + }, + "region": { + "description": "Region where the monitored service is running, e.g. us-east-1", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "service": { + "description": "Service that is monitored on cloud", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Name of the cloud service, intended to distinguish services running on different platforms within a provider, eg AWS EC2 vs Lambda, GCP GCE vs App Engine, Azure VM vs App Server.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + } + }, + "required": [ + "provider" + ] + }, + "labels": { + "description": "Labels are a flat mapping of user-defined tags. Allowed value types are string, boolean and number values. Labels are indexed and searchable.", + "type": [ + "null", + "object" + ], + "additionalProperties": { + "type": [ + "null", + "string", + "boolean", + "number" + ], + "maxLength": 1024 + } + }, + "network": { + "description": "Network holds information about the network over which the monitored service is communicating.", + "type": [ + "null", + "object" + ], + "properties": { + "connection": { + "type": [ + "null", + "object" + ], + "properties": { + "type": { + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + } + } + }, + "process": { + "description": "Process metadata about the monitored service.", + "type": [ + "null", + "object" + ], + "properties": { + "argv": { + "description": "Argv holds the command line arguments used to start this process.", + "type": [ + "null", + "array" + ], + "items": { + "type": "string" + }, + "minItems": 0 + }, + "pid": { + "description": "PID holds the process ID of the service.", + "type": "integer" + }, + "ppid": { + "description": "Ppid holds the parent process ID of the service.", + "type": [ + "null", + "integer" + ] + }, + "title": { + "description": "Title is the process title. It can be the same as process name.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + }, + "required": [ + "pid" + ] + }, + "service": { + "description": "Service metadata about the monitored service.", + "type": "object", + "properties": { + "agent": { + "description": "Agent holds information about the APM agent capturing the event.", + "type": "object", + "properties": { + "activation_method": { + "description": "ActivationMethod of the APM agent capturing information.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "ephemeral_id": { + "description": "EphemeralID is a free format ID used for metrics correlation by agents", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "name": { + "description": "Name of the APM agent capturing information.", + "type": "string", + "maxLength": 1024, + "minLength": 1 + }, + "version": { + "description": "Version of the APM agent capturing information.", + "type": "string", + "maxLength": 1024 + } + }, + "required": [ + "name", + "version" + ] + }, + "environment": { + "description": "Environment in which the monitored service is running, e.g. \`production\` or \`staging\`.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "framework": { + "description": "Framework holds information about the framework used in the monitored service.", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Name of the used framework", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "version": { + "description": "Version of the used framework", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "id": { + "description": "ID holds a unique identifier for the running service.", + "type": [ + "null", + "string" + ] + }, + "language": { + "description": "Language holds information about the programming language of the monitored service.", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Name of the used programming language", + "type": "string", + "maxLength": 1024 + }, + "version": { + "description": "Version of the used programming language", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + }, + "required": [ + "name" + ] + }, + "name": { + "description": "Name of the monitored service.", + "type": "string", + "maxLength": 1024, + "minLength": 1, + "pattern": "^[a-zA-Z0-9 _-]+$" + }, + "node": { + "description": "Node must be a unique meaningful name of the service node.", + "type": [ + "null", + "object" + ], + "properties": { + "configured_name": { + "description": "Name of the service node", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "runtime": { + "description": "Runtime holds information about the language runtime running the monitored service", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Name of the language runtime", + "type": "string", + "maxLength": 1024 + }, + "version": { + "description": "Name of the language runtime", + "type": "string", + "maxLength": 1024 + } + }, + "required": [ + "name", + "version" + ] + }, + "version": { + "description": "Version of the monitored service.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + }, + "required": [ + "agent", + "name" + ] + }, + "system": { + "description": "System metadata", + "type": [ + "null", + "object" + ], + "properties": { + "architecture": { + "description": "Architecture of the system the monitored service is running on.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "configured_hostname": { + "description": "ConfiguredHostname is the configured name of the host the monitored service is running on. It should only be sent when configured by the user. If given, it is used as the event's hostname.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "container": { + "description": "Container holds the system's container ID if available.", + "type": [ + "null", + "object" + ], + "properties": { + "id": { + "description": "ID of the container the monitored service is running in.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "detected_hostname": { + "description": "DetectedHostname is the hostname detected by the APM agent. It usually contains what the hostname command returns on the host machine. It will be used as the event's hostname if ConfiguredHostname is not present.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "hostname": { + "description": "Deprecated: Use ConfiguredHostname and DetectedHostname instead. DeprecatedHostname is the host name of the system the service is running on. It does not distinguish between configured and detected hostname and therefore is deprecated and only used if no other hostname information is available.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "kubernetes": { + "description": "Kubernetes system information if the monitored service runs on Kubernetes.", + "type": [ + "null", + "object" + ], + "properties": { + "namespace": { + "description": "Namespace of the Kubernetes resource the monitored service is run on.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "node": { + "description": "Node related information", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Name of the Kubernetes Node", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "pod": { + "description": "Pod related information", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Name of the Kubernetes Pod", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "uid": { + "description": "UID is the system-generated string uniquely identifying the Pod.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + } + } + }, + "platform": { + "description": "Platform name of the system platform the monitored service is running on.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "user": { + "description": "User metadata, which can be overwritten on a per event basis.", + "type": [ + "null", + "object" + ], + "properties": { + "domain": { + "description": "Domain of the logged in user", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "email": { + "description": "Email of the user.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "id": { + "description": "ID identifies the logged in user, e.g. can be the primary key of the user", + "type": [ + "null", + "string", + "integer" + ], + "maxLength": 1024 + }, + "username": { + "description": "Name of the user.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + } + }, + "required": [ + "service" + ] +} \ No newline at end of file diff --git a/docs/en/serverless/transclusion/apm/guide/spec/v2/metricset.asciidoc b/docs/en/serverless/transclusion/apm/guide/spec/v2/metricset.asciidoc deleted file mode 100644 index d531a8e3a7..0000000000 --- a/docs/en/serverless/transclusion/apm/guide/spec/v2/metricset.asciidoc +++ /dev/null @@ -1,3 +0,0 @@ - - -<DocCode children={snippet} /> diff --git a/docs/en/serverless/transclusion/apm/guide/spec/v2/metricset.json b/docs/en/serverless/transclusion/apm/guide/spec/v2/metricset.json new file mode 100644 index 0000000000..01760a1f6d --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/spec/v2/metricset.json @@ -0,0 +1,301 @@ +{ + "$id": "docs/spec/v2/metricset", + "type": "object", + "properties": { + "faas": { + "description": "FAAS holds fields related to Function as a Service events.", + "type": [ + "null", + "object" + ], + "properties": { + "coldstart": { + "description": "Indicates whether a function invocation was a cold start or not.", + "type": [ + "null", + "boolean" + ] + }, + "execution": { + "description": "The request id of the function invocation.", + "type": [ + "null", + "string" + ] + }, + "id": { + "description": "A unique identifier of the invoked serverless function.", + "type": [ + "null", + "string" + ] + }, + "name": { + "description": "The lambda function name.", + "type": [ + "null", + "string" + ] + }, + "trigger": { + "description": "Trigger attributes.", + "type": [ + "null", + "object" + ], + "properties": { + "request_id": { + "description": "The id of the origin trigger request.", + "type": [ + "null", + "string" + ] + }, + "type": { + "description": "The trigger type.", + "type": [ + "null", + "string" + ] + } + } + }, + "version": { + "description": "The lambda function version.", + "type": [ + "null", + "string" + ] + } + } + }, + "samples": { + "description": "Samples hold application metrics collected from the agent.", + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^[^*\"]*$": { + "type": [ + "null", + "object" + ], + "properties": { + "counts": { + "description": "Counts holds the bucket counts for histogram metrics. These numbers must be positive or zero. If Counts is specified, then Values is expected to be specified with the same number of elements, and with the same order.", + "type": [ + "null", + "array" + ], + "items": { + "type": "integer", + "minimum": 0 + }, + "minItems": 0 + }, + "type": { + "description": "Type holds an optional metric type: gauge, counter, or histogram. If Type is unknown, it will be ignored.", + "type": [ + "null", + "string" + ] + }, + "unit": { + "description": "Unit holds an optional unit for the metric. - \"percent\" (value is in the range [0,1]) - \"byte\" - a time unit: \"nanos\", \"micros\", \"ms\", \"s\", \"m\", \"h\", \"d\" If Unit is unknown, it will be ignored.", + "type": [ + "null", + "string" + ] + }, + "value": { + "description": "Value holds the value of a single metric sample.", + "type": [ + "null", + "number" + ] + }, + "values": { + "description": "Values holds the bucket values for histogram metrics. Values must be provided in ascending order; failure to do so will result in the metric being discarded.", + "type": [ + "null", + "array" + ], + "items": { + "type": "number" + }, + "minItems": 0 + } + }, + "allOf": [ + { + "if": { + "properties": { + "counts": { + "type": "array" + } + }, + "required": [ + "counts" + ] + }, + "then": { + "properties": { + "values": { + "type": "array" + } + }, + "required": [ + "values" + ] + } + }, + { + "if": { + "properties": { + "values": { + "type": "array" + } + }, + "required": [ + "values" + ] + }, + "then": { + "properties": { + "counts": { + "type": "array" + } + }, + "required": [ + "counts" + ] + } + } + ], + "anyOf": [ + { + "properties": { + "value": { + "type": "number" + } + }, + "required": [ + "value" + ] + }, + { + "properties": { + "values": { + "type": "array" + } + }, + "required": [ + "values" + ] + } + ] + } + } + }, + "service": { + "description": "Service holds selected information about the correlated service.", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Name of the correlated service.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "version": { + "description": "Version of the correlated service.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "span": { + "description": "Span holds selected information about the correlated transaction.", + "type": [ + "null", + "object" + ], + "properties": { + "subtype": { + "description": "Subtype is a further sub-division of the type (e.g. postgresql, elasticsearch)", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "type": { + "description": "Type expresses the correlated span's type as keyword that has specific relevance within the service's domain, eg: 'request', 'backgroundjob'.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "tags": { + "description": "Tags are a flat mapping of user-defined tags. On the agent side, tags are called labels. Allowed value types are string, boolean and number values. Tags are indexed and searchable.", + "type": [ + "null", + "object" + ], + "additionalProperties": { + "type": [ + "null", + "string", + "boolean", + "number" + ], + "maxLength": 1024 + } + }, + "timestamp": { + "description": "Timestamp holds the recorded time of the event, UTC based and formatted as microseconds since Unix epoch", + "type": [ + "null", + "integer" + ] + }, + "transaction": { + "description": "Transaction holds selected information about the correlated transaction.", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Name of the correlated transaction.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "type": { + "description": "Type expresses the correlated transaction's type as keyword that has specific relevance within the service's domain, eg: 'request', 'backgroundjob'.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + } + }, + "required": [ + "samples" + ] +} \ No newline at end of file diff --git a/docs/en/serverless/transclusion/apm/guide/spec/v2/span.asciidoc b/docs/en/serverless/transclusion/apm/guide/spec/v2/span.asciidoc deleted file mode 100644 index d531a8e3a7..0000000000 --- a/docs/en/serverless/transclusion/apm/guide/spec/v2/span.asciidoc +++ /dev/null @@ -1,3 +0,0 @@ - - -<DocCode children={snippet} /> diff --git a/docs/en/serverless/transclusion/apm/guide/spec/v2/span.json b/docs/en/serverless/transclusion/apm/guide/spec/v2/span.json new file mode 100644 index 0000000000..01320bf77d --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/spec/v2/span.json @@ -0,0 +1,903 @@ +{ + "$id": "docs/spec/v2/span", + "type": "object", + "properties": { + "action": { + "description": "Action holds the specific kind of event within the sub-type represented by the span (e.g. query, connect)", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "child_ids": { + "description": "ChildIDs holds a list of successor transactions and/or spans.", + "type": [ + "null", + "array" + ], + "items": { + "type": "string", + "maxLength": 1024 + }, + "minItems": 0 + }, + "composite": { + "description": "Composite holds details on a group of spans represented by a single one.", + "type": [ + "null", + "object" + ], + "properties": { + "compression_strategy": { + "description": "A string value indicating which compression strategy was used. The valid values are \`exact_match\` and \`same_kind\`.", + "type": "string" + }, + "count": { + "description": "Count is the number of compressed spans the composite span represents. The minimum count is 2, as a composite span represents at least two spans.", + "type": "integer", + "minimum": 2 + }, + "sum": { + "description": "Sum is the durations of all compressed spans this composite span represents in milliseconds.", + "type": "number", + "minimum": 0 + } + }, + "required": [ + "compression_strategy", + "count", + "sum" + ] + }, + "context": { + "description": "Context holds arbitrary contextual information for the event.", + "type": [ + "null", + "object" + ], + "properties": { + "db": { + "description": "Database contains contextual data for database spans", + "type": [ + "null", + "object" + ], + "properties": { + "instance": { + "description": "Instance name of the database.", + "type": [ + "null", + "string" + ] + }, + "link": { + "description": "Link to the database server.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "rows_affected": { + "description": "RowsAffected shows the number of rows affected by the statement.", + "type": [ + "null", + "integer" + ] + }, + "statement": { + "description": "Statement of the recorded database event, e.g. query.", + "type": [ + "null", + "string" + ] + }, + "type": { + "description": "Type of the recorded database event., e.g. sql, cassandra, hbase, redis.", + "type": [ + "null", + "string" + ] + }, + "user": { + "description": "User is the username with which the database is accessed.", + "type": [ + "null", + "string" + ] + } + } + }, + "destination": { + "description": "Destination contains contextual data about the destination of spans", + "type": [ + "null", + "object" + ], + "properties": { + "address": { + "description": "Address is the destination network address: hostname (e.g. 'localhost'), FQDN (e.g. 'elastic.co'), IPv4 (e.g. '127.0.0.1') IPv6 (e.g. '::1')", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "port": { + "description": "Port is the destination network port (e.g. 443)", + "type": [ + "null", + "integer" + ] + }, + "service": { + "description": "Service describes the destination service", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Name is the identifier for the destination service, e.g. 'http://elastic.co', 'elasticsearch', 'rabbitmq' ( DEPRECATED: this field will be removed in a future release", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "resource": { + "description": "Resource identifies the destination service resource being operated on e.g. 'http://elastic.co:80', 'elasticsearch', 'rabbitmq/queue_name' DEPRECATED: this field will be removed in a future release", + "type": "string", + "maxLength": 1024 + }, + "type": { + "description": "Type of the destination service, e.g. db, elasticsearch. Should typically be the same as span.type. DEPRECATED: this field will be removed in a future release", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + }, + "required": [ + "resource" + ] + } + } + }, + "http": { + "description": "HTTP contains contextual information when the span concerns an HTTP request.", + "type": [ + "null", + "object" + ], + "properties": { + "method": { + "description": "Method holds information about the method of the HTTP request.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "request": { + "description": "Request describes the HTTP request information.", + "type": [ + "null", + "object" + ], + "properties": { + "id": { + "description": "ID holds the unique identifier for the http request.", + "type": [ + "null", + "string" + ] + } + } + }, + "response": { + "description": "Response describes the HTTP response information in case the event was created as a result of an HTTP request.", + "type": [ + "null", + "object" + ], + "properties": { + "decoded_body_size": { + "description": "DecodedBodySize holds the size of the decoded payload.", + "type": [ + "null", + "integer" + ] + }, + "encoded_body_size": { + "description": "EncodedBodySize holds the size of the encoded payload.", + "type": [ + "null", + "integer" + ] + }, + "headers": { + "description": "Headers holds the http headers sent in the http response.", + "type": [ + "null", + "object" + ], + "additionalProperties": false, + "patternProperties": { + "[.*]*$": { + "type": [ + "null", + "array", + "string" + ], + "items": { + "type": "string" + } + } + } + }, + "status_code": { + "description": "StatusCode sent in the http response.", + "type": [ + "null", + "integer" + ] + }, + "transfer_size": { + "description": "TransferSize holds the total size of the payload.", + "type": [ + "null", + "integer" + ] + } + } + }, + "status_code": { + "description": "Deprecated: Use Response.StatusCode instead. StatusCode sent in the http response.", + "type": [ + "null", + "integer" + ] + }, + "url": { + "description": "URL is the raw url of the correlating HTTP request.", + "type": [ + "null", + "string" + ] + } + } + }, + "message": { + "description": "Message holds details related to message receiving and publishing if the captured event integrates with a messaging system", + "type": [ + "null", + "object" + ], + "properties": { + "age": { + "description": "Age of the message. If the monitored messaging framework provides a timestamp for the message, agents may use it. Otherwise, the sending agent can add a timestamp in milliseconds since the Unix epoch to the message's metadata to be retrieved by the receiving agent. If a timestamp is not available, agents should omit this field.", + "type": [ + "null", + "object" + ], + "properties": { + "ms": { + "description": "Age of the message in milliseconds.", + "type": [ + "null", + "integer" + ] + } + } + }, + "body": { + "description": "Body of the received message, similar to an HTTP request body", + "type": [ + "null", + "string" + ] + }, + "headers": { + "description": "Headers received with the message, similar to HTTP request headers.", + "type": [ + "null", + "object" + ], + "additionalProperties": false, + "patternProperties": { + "[.*]*$": { + "type": [ + "null", + "array", + "string" + ], + "items": { + "type": "string" + } + } + } + }, + "queue": { + "description": "Queue holds information about the message queue where the message is received.", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Name holds the name of the message queue where the message is received.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "routing_key": { + "description": "RoutingKey holds the optional routing key of the received message as set on the queuing system, such as in RabbitMQ.", + "type": [ + "null", + "string" + ] + } + } + }, + "service": { + "description": "Service related information can be sent per span. Information provided here will override the more generic information retrieved from metadata, missing service fields will be retrieved from the metadata information.", + "type": [ + "null", + "object" + ], + "properties": { + "agent": { + "description": "Agent holds information about the APM agent capturing the event.", + "type": [ + "null", + "object" + ], + "properties": { + "ephemeral_id": { + "description": "EphemeralID is a free format ID used for metrics correlation by agents", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "name": { + "description": "Name of the APM agent capturing information.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "version": { + "description": "Version of the APM agent capturing information.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "environment": { + "description": "Environment in which the monitored service is running, e.g. \`production\` or \`staging\`.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "framework": { + "description": "Framework holds information about the framework used in the monitored service.", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Name of the used framework", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "version": { + "description": "Version of the used framework", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "id": { + "description": "ID holds a unique identifier for the service.", + "type": [ + "null", + "string" + ] + }, + "language": { + "description": "Language holds information about the programming language of the monitored service.", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Name of the used programming language", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "version": { + "description": "Version of the used programming language", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "name": { + "description": "Name of the monitored service.", + "type": [ + "null", + "string" + ], + "maxLength": 1024, + "pattern": "^[a-zA-Z0-9 _-]+$" + }, + "node": { + "description": "Node must be a unique meaningful name of the service node.", + "type": [ + "null", + "object" + ], + "properties": { + "configured_name": { + "description": "Name of the service node", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "origin": { + "description": "Origin contains the self-nested field groups for service.", + "type": [ + "null", + "object" + ], + "properties": { + "id": { + "description": "Immutable id of the service emitting this event.", + "type": [ + "null", + "string" + ] + }, + "name": { + "description": "Immutable name of the service emitting this event.", + "type": [ + "null", + "string" + ] + }, + "version": { + "description": "The version of the service the data was collected from.", + "type": [ + "null", + "string" + ] + } + } + }, + "runtime": { + "description": "Runtime holds information about the language runtime running the monitored service", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Name of the language runtime", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "version": { + "description": "Version of the language runtime", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "target": { + "description": "Target holds information about the outgoing service in case of an outgoing event", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Immutable name of the target service for the event", + "type": [ + "null", + "string" + ] + }, + "type": { + "description": "Immutable type of the target service for the event", + "type": [ + "null", + "string" + ] + } + }, + "anyOf": [ + { + "properties": { + "type": { + "type": "string" + } + }, + "required": [ + "type" + ] + }, + { + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ] + } + ] + }, + "version": { + "description": "Version of the monitored service.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "tags": { + "description": "Tags are a flat mapping of user-defined tags. On the agent side, tags are called labels. Allowed value types are string, boolean and number values. Tags are indexed and searchable.", + "type": [ + "null", + "object" + ], + "additionalProperties": { + "type": [ + "null", + "string", + "boolean", + "number" + ], + "maxLength": 1024 + } + } + } + }, + "duration": { + "description": "Duration of the span in milliseconds. When the span is a composite one, duration is the gross duration, including \"whitespace\" in between spans.", + "type": "number", + "minimum": 0 + }, + "id": { + "description": "ID holds the hex encoded 64 random bits ID of the event.", + "type": "string", + "maxLength": 1024 + }, + "links": { + "description": "Links holds links to other spans, potentially in other traces.", + "type": [ + "null", + "array" + ], + "items": { + "type": "object", + "properties": { + "span_id": { + "description": "SpanID holds the ID of the linked span.", + "type": "string", + "maxLength": 1024 + }, + "trace_id": { + "description": "TraceID holds the ID of the linked span's trace.", + "type": "string", + "maxLength": 1024 + } + }, + "required": [ + "span_id", + "trace_id" + ] + }, + "minItems": 0 + }, + "name": { + "description": "Name is the generic designation of a span in the scope of a transaction.", + "type": "string", + "maxLength": 1024 + }, + "otel": { + "description": "OTel contains unmapped OpenTelemetry attributes.", + "type": [ + "null", + "object" + ], + "properties": { + "attributes": { + "description": "Attributes hold the unmapped OpenTelemetry attributes.", + "type": [ + "null", + "object" + ] + }, + "span_kind": { + "description": "SpanKind holds the incoming OpenTelemetry span kind.", + "type": [ + "null", + "string" + ] + } + } + }, + "outcome": { + "description": "Outcome of the span: success, failure, or unknown. Outcome may be one of a limited set of permitted values describing the success or failure of the span. It can be used for calculating error rates for outgoing requests.", + "type": [ + "null", + "string" + ], + "enum": [ + "success", + "failure", + "unknown", + null + ] + }, + "parent_id": { + "description": "ParentID holds the hex encoded 64 random bits ID of the parent transaction or span.", + "type": "string", + "maxLength": 1024 + }, + "sample_rate": { + "description": "SampleRate applied to the monitored service at the time where this span was recorded.", + "type": [ + "null", + "number" + ] + }, + "stacktrace": { + "description": "Stacktrace connected to this span event.", + "type": [ + "null", + "array" + ], + "items": { + "type": "object", + "properties": { + "abs_path": { + "description": "AbsPath is the absolute path of the frame's file.", + "type": [ + "null", + "string" + ] + }, + "classname": { + "description": "Classname of the frame.", + "type": [ + "null", + "string" + ] + }, + "colno": { + "description": "ColumnNumber of the frame.", + "type": [ + "null", + "integer" + ] + }, + "context_line": { + "description": "ContextLine is the line from the frame's file.", + "type": [ + "null", + "string" + ] + }, + "filename": { + "description": "Filename is the relative name of the frame's file.", + "type": [ + "null", + "string" + ] + }, + "function": { + "description": "Function represented by the frame.", + "type": [ + "null", + "string" + ] + }, + "library_frame": { + "description": "LibraryFrame indicates whether the frame is from a third party library.", + "type": [ + "null", + "boolean" + ] + }, + "lineno": { + "description": "LineNumber of the frame.", + "type": [ + "null", + "integer" + ] + }, + "module": { + "description": "Module to which the frame belongs to.", + "type": [ + "null", + "string" + ] + }, + "post_context": { + "description": "PostContext is a slice of code lines immediately before the line from the frame's file.", + "type": [ + "null", + "array" + ], + "items": { + "type": "string" + }, + "minItems": 0 + }, + "pre_context": { + "description": "PreContext is a slice of code lines immediately after the line from the frame's file.", + "type": [ + "null", + "array" + ], + "items": { + "type": "string" + }, + "minItems": 0 + }, + "vars": { + "description": "Vars is a flat mapping of local variables of the frame.", + "type": [ + "null", + "object" + ] + } + }, + "anyOf": [ + { + "properties": { + "classname": { + "type": "string" + } + }, + "required": [ + "classname" + ] + }, + { + "properties": { + "filename": { + "type": "string" + } + }, + "required": [ + "filename" + ] + } + ] + }, + "minItems": 0 + }, + "start": { + "description": "Start is the offset relative to the transaction's timestamp identifying the start of the span, in milliseconds.", + "type": [ + "null", + "number" + ] + }, + "subtype": { + "description": "Subtype is a further sub-division of the type (e.g. postgresql, elasticsearch)", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "sync": { + "description": "Sync indicates whether the span was executed synchronously or asynchronously.", + "type": [ + "null", + "boolean" + ] + }, + "timestamp": { + "description": "Timestamp holds the recorded time of the event, UTC based and formatted as microseconds since Unix epoch", + "type": [ + "null", + "integer" + ] + }, + "trace_id": { + "description": "TraceID holds the hex encoded 128 random bits ID of the correlated trace.", + "type": "string", + "maxLength": 1024 + }, + "transaction_id": { + "description": "TransactionID holds the hex encoded 64 random bits ID of the correlated transaction.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "type": { + "description": "Type holds the span's type, and can have specific keywords within the service's domain (eg: 'request', 'backgroundjob', etc)", + "type": "string", + "maxLength": 1024 + } + }, + "required": [ + "id", + "trace_id", + "name", + "parent_id", + "type", + "duration" + ], + "anyOf": [ + { + "properties": { + "start": { + "type": "number" + } + }, + "required": [ + "start" + ] + }, + { + "properties": { + "timestamp": { + "type": "integer" + } + }, + "required": [ + "timestamp" + ] + } + ] +} \ No newline at end of file diff --git a/docs/en/serverless/transclusion/apm/guide/spec/v2/transaction.asciidoc b/docs/en/serverless/transclusion/apm/guide/spec/v2/transaction.asciidoc deleted file mode 100644 index d531a8e3a7..0000000000 --- a/docs/en/serverless/transclusion/apm/guide/spec/v2/transaction.asciidoc +++ /dev/null @@ -1,3 +0,0 @@ - - -<DocCode children={snippet} /> diff --git a/docs/en/serverless/transclusion/apm/guide/spec/v2/transaction.json b/docs/en/serverless/transclusion/apm/guide/spec/v2/transaction.json new file mode 100644 index 0000000000..419adb8fe7 --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/spec/v2/transaction.json @@ -0,0 +1,1131 @@ +{ + "$id": "docs/spec/v2/transaction", + "type": "object", + "properties": { + "context": { + "description": "Context holds arbitrary contextual information for the event.", + "type": [ + "null", + "object" + ], + "properties": { + "cloud": { + "description": "Cloud holds fields related to the cloud or infrastructure the events are coming from.", + "type": [ + "null", + "object" + ], + "properties": { + "origin": { + "description": "Origin contains the self-nested field groups for cloud.", + "type": [ + "null", + "object" + ], + "properties": { + "account": { + "description": "The cloud account or organization id used to identify different entities in a multi-tenant environment.", + "type": [ + "null", + "object" + ], + "properties": { + "id": { + "description": "The cloud account or organization id used to identify different entities in a multi-tenant environment.", + "type": [ + "null", + "string" + ] + } + } + }, + "provider": { + "description": "Name of the cloud provider.", + "type": [ + "null", + "string" + ] + }, + "region": { + "description": "Region in which this host, resource, or service is located.", + "type": [ + "null", + "string" + ] + }, + "service": { + "description": "The cloud service name is intended to distinguish services running on different platforms within a provider.", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "The cloud service name is intended to distinguish services running on different platforms within a provider.", + "type": [ + "null", + "string" + ] + } + } + } + } + } + } + }, + "custom": { + "description": "Custom can contain additional metadata to be stored with the event. The format is unspecified and can be deeply nested objects. The information will not be indexed or searchable in Elasticsearch.", + "type": [ + "null", + "object" + ] + }, + "message": { + "description": "Message holds details related to message receiving and publishing if the captured event integrates with a messaging system", + "type": [ + "null", + "object" + ], + "properties": { + "age": { + "description": "Age of the message. If the monitored messaging framework provides a timestamp for the message, agents may use it. Otherwise, the sending agent can add a timestamp in milliseconds since the Unix epoch to the message's metadata to be retrieved by the receiving agent. If a timestamp is not available, agents should omit this field.", + "type": [ + "null", + "object" + ], + "properties": { + "ms": { + "description": "Age of the message in milliseconds.", + "type": [ + "null", + "integer" + ] + } + } + }, + "body": { + "description": "Body of the received message, similar to an HTTP request body", + "type": [ + "null", + "string" + ] + }, + "headers": { + "description": "Headers received with the message, similar to HTTP request headers.", + "type": [ + "null", + "object" + ], + "additionalProperties": false, + "patternProperties": { + "[.*]*$": { + "type": [ + "null", + "array", + "string" + ], + "items": { + "type": "string" + } + } + } + }, + "queue": { + "description": "Queue holds information about the message queue where the message is received.", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Name holds the name of the message queue where the message is received.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "routing_key": { + "description": "RoutingKey holds the optional routing key of the received message as set on the queuing system, such as in RabbitMQ.", + "type": [ + "null", + "string" + ] + } + } + }, + "page": { + "description": "Page holds information related to the current page and page referers. It is only sent from RUM agents.", + "type": [ + "null", + "object" + ], + "properties": { + "referer": { + "description": "Referer holds the URL of the page that 'linked' to the current page.", + "type": [ + "null", + "string" + ] + }, + "url": { + "description": "URL of the current page", + "type": [ + "null", + "string" + ] + } + } + }, + "request": { + "description": "Request describes the HTTP request information in case the event was created as a result of an HTTP request.", + "type": [ + "null", + "object" + ], + "properties": { + "body": { + "description": "Body only contais the request bod, not the query string information. It can either be a dictionary (for standard HTTP requests) or a raw request body.", + "type": [ + "null", + "string", + "object" + ] + }, + "cookies": { + "description": "Cookies used by the request, parsed as key-value objects.", + "type": [ + "null", + "object" + ] + }, + "env": { + "description": "Env holds environment variable information passed to the monitored service.", + "type": [ + "null", + "object" + ] + }, + "headers": { + "description": "Headers includes any HTTP headers sent by the requester. Cookies will be taken by headers if supplied.", + "type": [ + "null", + "object" + ], + "additionalProperties": false, + "patternProperties": { + "[.*]*$": { + "type": [ + "null", + "array", + "string" + ], + "items": { + "type": "string" + } + } + } + }, + "http_version": { + "description": "HTTPVersion holds information about the used HTTP version.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "method": { + "description": "Method holds information about the method of the HTTP request.", + "type": "string", + "maxLength": 1024 + }, + "socket": { + "description": "Socket holds information related to the recorded request, such as whether or not data were encrypted and the remote address.", + "type": [ + "null", + "object" + ], + "properties": { + "encrypted": { + "description": "Encrypted indicates whether a request was sent as TLS/HTTPS request. DEPRECATED: this field will be removed in a future release.", + "type": [ + "null", + "boolean" + ] + }, + "remote_address": { + "description": "RemoteAddress holds the network address sending the request. It should be obtained through standard APIs and not be parsed from any headers like 'Forwarded'.", + "type": [ + "null", + "string" + ] + } + } + }, + "url": { + "description": "URL holds information sucha as the raw URL, scheme, host and path.", + "type": [ + "null", + "object" + ], + "properties": { + "full": { + "description": "Full, possibly agent-assembled URL of the request, e.g. https://example.com:443/search?q=elasticsearch#top.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "hash": { + "description": "Hash of the request URL, e.g. 'top'", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "hostname": { + "description": "Hostname information of the request, e.g. 'example.com'.\"", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "pathname": { + "description": "Path of the request, e.g. '/search'", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "port": { + "description": "Port of the request, e.g. '443'. Can be sent as string or int.", + "type": [ + "null", + "string", + "integer" + ], + "maxLength": 1024 + }, + "protocol": { + "description": "Protocol information for the recorded request, e.g. 'https:'.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "raw": { + "description": "Raw unparsed URL of the HTTP request line, e.g https://example.com:443/search?q=elasticsearch. This URL may be absolute or relative. For more details, see https://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html#sec5.1.2.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "search": { + "description": "Search contains the query string information of the request. It is expected to have values delimited by ampersands.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + } + }, + "required": [ + "method" + ] + }, + "response": { + "description": "Response describes the HTTP response information in case the event was created as a result of an HTTP request.", + "type": [ + "null", + "object" + ], + "properties": { + "decoded_body_size": { + "description": "DecodedBodySize holds the size of the decoded payload.", + "type": [ + "null", + "integer" + ] + }, + "encoded_body_size": { + "description": "EncodedBodySize holds the size of the encoded payload.", + "type": [ + "null", + "integer" + ] + }, + "finished": { + "description": "Finished indicates whether the response was finished or not.", + "type": [ + "null", + "boolean" + ] + }, + "headers": { + "description": "Headers holds the http headers sent in the http response.", + "type": [ + "null", + "object" + ], + "additionalProperties": false, + "patternProperties": { + "[.*]*$": { + "type": [ + "null", + "array", + "string" + ], + "items": { + "type": "string" + } + } + } + }, + "headers_sent": { + "description": "HeadersSent indicates whether http headers were sent.", + "type": [ + "null", + "boolean" + ] + }, + "status_code": { + "description": "StatusCode sent in the http response.", + "type": [ + "null", + "integer" + ] + }, + "transfer_size": { + "description": "TransferSize holds the total size of the payload.", + "type": [ + "null", + "integer" + ] + } + } + }, + "service": { + "description": "Service related information can be sent per event. Information provided here will override the more generic information retrieved from metadata, missing service fields will be retrieved from the metadata information.", + "type": [ + "null", + "object" + ], + "properties": { + "agent": { + "description": "Agent holds information about the APM agent capturing the event.", + "type": [ + "null", + "object" + ], + "properties": { + "ephemeral_id": { + "description": "EphemeralID is a free format ID used for metrics correlation by agents", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "name": { + "description": "Name of the APM agent capturing information.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "version": { + "description": "Version of the APM agent capturing information.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "environment": { + "description": "Environment in which the monitored service is running, e.g. \`production\` or \`staging\`.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "framework": { + "description": "Framework holds information about the framework used in the monitored service.", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Name of the used framework", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "version": { + "description": "Version of the used framework", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "id": { + "description": "ID holds a unique identifier for the service.", + "type": [ + "null", + "string" + ] + }, + "language": { + "description": "Language holds information about the programming language of the monitored service.", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Name of the used programming language", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "version": { + "description": "Version of the used programming language", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "name": { + "description": "Name of the monitored service.", + "type": [ + "null", + "string" + ], + "maxLength": 1024, + "pattern": "^[a-zA-Z0-9 _-]+$" + }, + "node": { + "description": "Node must be a unique meaningful name of the service node.", + "type": [ + "null", + "object" + ], + "properties": { + "configured_name": { + "description": "Name of the service node", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "origin": { + "description": "Origin contains the self-nested field groups for service.", + "type": [ + "null", + "object" + ], + "properties": { + "id": { + "description": "Immutable id of the service emitting this event.", + "type": [ + "null", + "string" + ] + }, + "name": { + "description": "Immutable name of the service emitting this event.", + "type": [ + "null", + "string" + ] + }, + "version": { + "description": "The version of the service the data was collected from.", + "type": [ + "null", + "string" + ] + } + } + }, + "runtime": { + "description": "Runtime holds information about the language runtime running the monitored service", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Name of the language runtime", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "version": { + "description": "Version of the language runtime", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "target": { + "description": "Target holds information about the outgoing service in case of an outgoing event", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Immutable name of the target service for the event", + "type": [ + "null", + "string" + ] + }, + "type": { + "description": "Immutable type of the target service for the event", + "type": [ + "null", + "string" + ] + } + }, + "anyOf": [ + { + "properties": { + "type": { + "type": "string" + } + }, + "required": [ + "type" + ] + }, + { + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ] + } + ] + }, + "version": { + "description": "Version of the monitored service.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "tags": { + "description": "Tags are a flat mapping of user-defined tags. On the agent side, tags are called labels. Allowed value types are string, boolean and number values. Tags are indexed and searchable.", + "type": [ + "null", + "object" + ], + "additionalProperties": { + "type": [ + "null", + "string", + "boolean", + "number" + ], + "maxLength": 1024 + } + }, + "user": { + "description": "User holds information about the correlated user for this event. If user data are provided here, all user related information from metadata is ignored, otherwise the metadata's user information will be stored with the event.", + "type": [ + "null", + "object" + ], + "properties": { + "domain": { + "description": "Domain of the logged in user", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "email": { + "description": "Email of the user.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "id": { + "description": "ID identifies the logged in user, e.g. can be the primary key of the user", + "type": [ + "null", + "string", + "integer" + ], + "maxLength": 1024 + }, + "username": { + "description": "Name of the user.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + } + } + }, + "dropped_spans_stats": { + "description": "DroppedSpanStats holds information about spans that were dropped (for example due to transaction_max_spans or exit_span_min_duration).", + "type": [ + "null", + "array" + ], + "items": { + "type": "object", + "properties": { + "destination_service_resource": { + "description": "DestinationServiceResource identifies the destination service resource being operated on. e.g. 'http://elastic.co:80', 'elasticsearch', 'rabbitmq/queue_name'.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "duration": { + "description": "Duration holds duration aggregations about the dropped span.", + "type": [ + "null", + "object" + ], + "properties": { + "count": { + "description": "Count holds the number of times the dropped span happened.", + "type": [ + "null", + "integer" + ], + "minimum": 1 + }, + "sum": { + "description": "Sum holds dimensions about the dropped span's duration.", + "type": [ + "null", + "object" + ], + "properties": { + "us": { + "description": "Us represents the summation of the span duration.", + "type": [ + "null", + "integer" + ], + "minimum": 0 + } + } + } + } + }, + "outcome": { + "description": "Outcome of the span: success, failure, or unknown. Outcome may be one of a limited set of permitted values describing the success or failure of the span. It can be used for calculating error rates for outgoing requests.", + "type": [ + "null", + "string" + ], + "enum": [ + "success", + "failure", + "unknown", + null + ] + }, + "service_target_name": { + "description": "ServiceTargetName identifies the instance name of the target service being operated on", + "type": [ + "null", + "string" + ], + "maxLength": 512 + }, + "service_target_type": { + "description": "ServiceTargetType identifies the type of the target service being operated on e.g. 'oracle', 'rabbitmq'", + "type": [ + "null", + "string" + ], + "maxLength": 512 + } + } + }, + "minItems": 0 + }, + "duration": { + "description": "Duration how long the transaction took to complete, in milliseconds with 3 decimal points.", + "type": "number", + "minimum": 0 + }, + "experience": { + "description": "UserExperience holds metrics for measuring real user experience. This information is only sent by RUM agents.", + "type": [ + "null", + "object" + ], + "properties": { + "cls": { + "description": "CumulativeLayoutShift holds the Cumulative Layout Shift (CLS) metric value, or a negative value if CLS is unknown. See https://web.dev/cls/", + "type": [ + "null", + "number" + ], + "minimum": 0 + }, + "fid": { + "description": "FirstInputDelay holds the First Input Delay (FID) metric value, or a negative value if FID is unknown. See https://web.dev/fid/", + "type": [ + "null", + "number" + ], + "minimum": 0 + }, + "longtask": { + "description": "Longtask holds longtask duration/count metrics.", + "type": [ + "null", + "object" + ], + "properties": { + "count": { + "description": "Count is the total number of of longtasks.", + "type": "integer", + "minimum": 0 + }, + "max": { + "description": "Max longtask duration", + "type": "number", + "minimum": 0 + }, + "sum": { + "description": "Sum of longtask durations", + "type": "number", + "minimum": 0 + } + }, + "required": [ + "count", + "max", + "sum" + ] + }, + "tbt": { + "description": "TotalBlockingTime holds the Total Blocking Time (TBT) metric value, or a negative value if TBT is unknown. See https://web.dev/tbt/", + "type": [ + "null", + "number" + ], + "minimum": 0 + } + } + }, + "faas": { + "description": "FAAS holds fields related to Function as a Service events.", + "type": [ + "null", + "object" + ], + "properties": { + "coldstart": { + "description": "Indicates whether a function invocation was a cold start or not.", + "type": [ + "null", + "boolean" + ] + }, + "execution": { + "description": "The request id of the function invocation.", + "type": [ + "null", + "string" + ] + }, + "id": { + "description": "A unique identifier of the invoked serverless function.", + "type": [ + "null", + "string" + ] + }, + "name": { + "description": "The lambda function name.", + "type": [ + "null", + "string" + ] + }, + "trigger": { + "description": "Trigger attributes.", + "type": [ + "null", + "object" + ], + "properties": { + "request_id": { + "description": "The id of the origin trigger request.", + "type": [ + "null", + "string" + ] + }, + "type": { + "description": "The trigger type.", + "type": [ + "null", + "string" + ] + } + } + }, + "version": { + "description": "The lambda function version.", + "type": [ + "null", + "string" + ] + } + } + }, + "id": { + "description": "ID holds the hex encoded 64 random bits ID of the event.", + "type": "string", + "maxLength": 1024 + }, + "links": { + "description": "Links holds links to other spans, potentially in other traces.", + "type": [ + "null", + "array" + ], + "items": { + "type": "object", + "properties": { + "span_id": { + "description": "SpanID holds the ID of the linked span.", + "type": "string", + "maxLength": 1024 + }, + "trace_id": { + "description": "TraceID holds the ID of the linked span's trace.", + "type": "string", + "maxLength": 1024 + } + }, + "required": [ + "span_id", + "trace_id" + ] + }, + "minItems": 0 + }, + "marks": { + "description": "Marks capture the timing of a significant event during the lifetime of a transaction. Marks are organized into groups and can be set by the user or the agent. Marks are only reported by RUM agents.", + "type": [ + "null", + "object" + ], + "additionalProperties": { + "type": [ + "null", + "object" + ], + "additionalProperties": { + "type": [ + "null", + "number" + ] + } + } + }, + "name": { + "description": "Name is the generic designation of a transaction in the scope of a single service, eg: 'GET /users/:id'.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "otel": { + "description": "OTel contains unmapped OpenTelemetry attributes.", + "type": [ + "null", + "object" + ], + "properties": { + "attributes": { + "description": "Attributes hold the unmapped OpenTelemetry attributes.", + "type": [ + "null", + "object" + ] + }, + "span_kind": { + "description": "SpanKind holds the incoming OpenTelemetry span kind.", + "type": [ + "null", + "string" + ] + } + } + }, + "outcome": { + "description": "Outcome of the transaction with a limited set of permitted values, describing the success or failure of the transaction from the service's perspective. It is used for calculating error rates for incoming requests. Permitted values: success, failure, unknown.", + "type": [ + "null", + "string" + ], + "enum": [ + "success", + "failure", + "unknown", + null + ] + }, + "parent_id": { + "description": "ParentID holds the hex encoded 64 random bits ID of the parent transaction or span.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "result": { + "description": "Result of the transaction. For HTTP-related transactions, this should be the status code formatted like 'HTTP 2xx'.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "sample_rate": { + "description": "SampleRate applied to the monitored service at the time where this transaction was recorded. Allowed values are [0..1]. A SampleRate \u003c1 indicates that not all spans are recorded.", + "type": [ + "null", + "number" + ] + }, + "sampled": { + "description": "Sampled indicates whether or not the full information for a transaction is captured. If a transaction is unsampled no spans and less context information will be reported.", + "type": [ + "null", + "boolean" + ] + }, + "session": { + "description": "Session holds optional transaction session information for RUM.", + "type": [ + "null", + "object" + ], + "properties": { + "id": { + "description": "ID holds a session ID for grouping a set of related transactions.", + "type": "string", + "maxLength": 1024 + }, + "sequence": { + "description": "Sequence holds an optional sequence number for a transaction within a session. It is not meaningful to compare sequences across two different sessions.", + "type": [ + "null", + "integer" + ], + "minimum": 1 + } + }, + "required": [ + "id" + ] + }, + "span_count": { + "description": "SpanCount counts correlated spans.", + "type": "object", + "properties": { + "dropped": { + "description": "Dropped is the number of correlated spans that have been dropped by the APM agent recording the transaction.", + "type": [ + "null", + "integer" + ] + }, + "started": { + "description": "Started is the number of correlated spans that are recorded.", + "type": "integer" + } + }, + "required": [ + "started" + ] + }, + "timestamp": { + "description": "Timestamp holds the recorded time of the event, UTC based and formatted as microseconds since Unix epoch", + "type": [ + "null", + "integer" + ] + }, + "trace_id": { + "description": "TraceID holds the hex encoded 128 random bits ID of the correlated trace.", + "type": "string", + "maxLength": 1024 + }, + "type": { + "description": "Type expresses the transaction's type as keyword that has specific relevance within the service's domain, eg: 'request', 'backgroundjob'.", + "type": "string", + "maxLength": 1024 + } + }, + "required": [ + "trace_id", + "id", + "type", + "span_count", + "duration" + ] +} \ No newline at end of file diff --git a/docs/en/serverless/transclusion/fleet/tab-widgets/download/deb.asciidoc b/docs/en/serverless/transclusion/fleet/tab-widgets/download/deb.asciidoc index 85e4e9c438..f3ee330026 100644 --- a/docs/en/serverless/transclusion/fleet/tab-widgets/download/deb.asciidoc +++ b/docs/en/serverless/transclusion/fleet/tab-widgets/download/deb.asciidoc @@ -4,7 +4,7 @@ To simplify upgrading to future versions of {agent}, we recommended that you use the tarball distribution instead of the DEB distribution. ==== -[source,sh] +[source,sh,subs="attributes+"] ---- curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-{version}-amd64.deb sudo dpkg -i elastic-agent-{version}-amd64.deb diff --git a/docs/en/serverless/transclusion/fleet/tab-widgets/download/linux.asciidoc b/docs/en/serverless/transclusion/fleet/tab-widgets/download/linux.asciidoc index ed8aa3235a..91e04b6e50 100644 --- a/docs/en/serverless/transclusion/fleet/tab-widgets/download/linux.asciidoc +++ b/docs/en/serverless/transclusion/fleet/tab-widgets/download/linux.asciidoc @@ -1,4 +1,4 @@ -[source,sh] +[source,sh,subs="attributes+"] ---- curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-{version}-linux-x86_64.tar.gz tar xzvf elastic-agent-{version}-linux-x86_64.tar.gz diff --git a/docs/en/serverless/transclusion/fleet/tab-widgets/download/mac.asciidoc b/docs/en/serverless/transclusion/fleet/tab-widgets/download/mac.asciidoc index 8f5a474e73..9c394c3865 100644 --- a/docs/en/serverless/transclusion/fleet/tab-widgets/download/mac.asciidoc +++ b/docs/en/serverless/transclusion/fleet/tab-widgets/download/mac.asciidoc @@ -1,4 +1,4 @@ -[source,sh] +[source,sh,subs="attributes+"] ---- curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-{version}-darwin-x86_64.tar.gz tar xzvf elastic-agent-{version}-darwin-x86_64.tar.gz diff --git a/docs/en/serverless/transclusion/fleet/tab-widgets/download/rpm.asciidoc b/docs/en/serverless/transclusion/fleet/tab-widgets/download/rpm.asciidoc index a47754e918..ca4be02f40 100644 --- a/docs/en/serverless/transclusion/fleet/tab-widgets/download/rpm.asciidoc +++ b/docs/en/serverless/transclusion/fleet/tab-widgets/download/rpm.asciidoc @@ -4,7 +4,7 @@ To simplify upgrading to future versions of {agent}, we recommended that you use the tarball distribution instead of the RPM distribution. ==== -[source,sh] +[source,sh,subs="attributes+"] ---- curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-{version}-x86_64.rpm sudo rpm -vi elastic-agent-{version}-x86_64.rpm diff --git a/docs/en/serverless/transclusion/fleet/tab-widgets/download/win.asciidoc b/docs/en/serverless/transclusion/fleet/tab-widgets/download/win.asciidoc index aeaa72430c..0d04a864f1 100644 --- a/docs/en/serverless/transclusion/fleet/tab-widgets/download/win.asciidoc +++ b/docs/en/serverless/transclusion/fleet/tab-widgets/download/win.asciidoc @@ -1,4 +1,4 @@ -[source,powershell] +[source,powershell,subs="attributes+"] ---- # PowerShell 5.0+ wget https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-{version}-windows-x86_64.zip -OutFile elastic-agent-{version}-windows-x86_64.zip diff --git a/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/deb.asciidoc b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/deb.asciidoc index 800b7676a2..e6af91eefe 100644 --- a/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/deb.asciidoc +++ b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/deb.asciidoc @@ -1,4 +1,4 @@ -[source,sh] +[source,sh,subs="attributes+"] ---- curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-{version}-amd64.deb sudo dpkg -i filebeat-{version}-amd64.deb diff --git a/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/linux.asciidoc b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/linux.asciidoc index b678409fc7..1199dc6e7a 100644 --- a/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/linux.asciidoc +++ b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/linux.asciidoc @@ -1,4 +1,4 @@ -[source,sh] +[source,sh,subs="attributes+"] ---- curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-{version}-linux-x86_64.tar.gz tar xzvf filebeat-{version}-linux-x86_64.tar.gz diff --git a/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/macos.asciidoc b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/macos.asciidoc index 827f7ba922..f52b3e9d3b 100644 --- a/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/macos.asciidoc +++ b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/macos.asciidoc @@ -1,4 +1,4 @@ -[source,sh] +[source,sh,subs="attributes+"] ---- curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-{version}-darwin-x86_64.tar.gz tar xzvf filebeat-{version}-darwin-x86_64.tar.gz diff --git a/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/rpm.asciidoc b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/rpm.asciidoc index 2ee8725c08..6a895c371a 100644 --- a/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/rpm.asciidoc +++ b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/rpm.asciidoc @@ -1,4 +1,4 @@ -[source,sh] +[source,sh,subs="attributes+"] ---- curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-{version}-x86_64.rpm sudo rpm -vi filebeat-{version}-x86_64.rpm diff --git a/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/windows.asciidoc b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/windows.asciidoc index 7fcef2fe02..5d3e9438ea 100644 --- a/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/windows.asciidoc +++ b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/windows.asciidoc @@ -6,7 +6,7 @@ and select **Run As Administrator**). . From the PowerShell prompt, run the following commands to install {filebeat} as a Windows service: + -[source,powershell] +[source,powershell,subs="attributes+"] ---- PS > cd 'C:\Program Files\{filebeat}' PS C:\Program Files\{filebeat}> .\install-service-filebeat.ps1 diff --git a/docs/en/serverless/transclusion/synthetics/reference/lightweight-config/http.asciidoc b/docs/en/serverless/transclusion/synthetics/reference/lightweight-config/http.asciidoc index bbb3d36569..4127816f39 100644 --- a/docs/en/serverless/transclusion/synthetics/reference/lightweight-config/http.asciidoc +++ b/docs/en/serverless/transclusion/synthetics/reference/lightweight-config/http.asciidoc @@ -82,7 +82,7 @@ Set `response.include_body_max_bytes` to control the maximum size of the stored a| **`request`**:: An optional `request` to send to the remote host. Under `check.request`, specify these options: + ---- +-- **`method`** (`"HEAD"`, `"GET"`, `"POST"`, or `"OPTIONS"`)::: The HTTP method to use. @@ -91,7 +91,7 @@ A dictionary of additional HTTP headers to send. By default Synthetics will set **`body`** (<<synthetics-lightweight-data-string,string>>)::: Optional request body content. ---- +-- + **Example**: This monitor POSTs an `x-www-form-urlencoded` string to the endpoint `/demo/add`. + From 3ac491a2017a87b38198ec2402373eb88cdf17c9 Mon Sep 17 00:00:00 2001 From: Colleen McGinnis <colleen.mcginnis@elastic.co> Date: Fri, 1 Nov 2024 16:42:25 -0500 Subject: [PATCH 07/13] clean post rebase and qa --- .../aiops/aiops-detect-anomalies.asciidoc | 5 +- .../aiops/aiops-detect-anomalies.mdx | 68 +- ...reate-custom-threshold-alert-rule.asciidoc | 31 +- .../create-latency-threshold-alert-rule.mdx | 2 +- .../synthetic-monitor-status-alert.asciidoc | 16 + .../view-infrastructure-metrics.asciidoc | 10 +- .../create-an-observability-project.asciidoc | 2 +- .../synthetics-private-location.asciidoc | 4 +- .../apm/guide/install-agents/python.mdx | 125 +- .../apm/guide/install-agents/ruby.asciidoc | 1 - .../apm/guide/install-agents/ruby.mdx | 84 +- .../transclusion/apm/guide/spec/v2/error.mdx | 1296 ----------------- .../apm/guide/spec/v2/metadata.mdx | 570 -------- .../apm/guide/spec/v2/metricset.mdx | 304 ---- .../transclusion/apm/guide/spec/v2/span.mdx | 906 ------------ .../apm/guide/spec/v2/transaction.mdx | 1134 --------------- .../fleet/tab-widgets/download/deb.asciidoc | 2 +- .../fleet/tab-widgets/download/linux.asciidoc | 2 +- .../fleet/tab-widgets/download/mac.asciidoc | 2 +- .../fleet/tab-widgets/download/rpm.asciidoc | 2 +- .../fleet/tab-widgets/download/win.asciidoc | 2 +- .../transclusion/host-details.asciidoc | 43 +- .../filebeat-install/content/deb.asciidoc | 2 +- .../filebeat-install/content/linux.asciidoc | 2 +- .../filebeat-install/content/macos.asciidoc | 2 +- .../filebeat-install/content/rpm.asciidoc | 2 +- .../filebeat-install/content/windows.asciidoc | 2 +- .../reference/lightweight-config/common.mdx | 4 +- 28 files changed, 246 insertions(+), 4379 deletions(-) delete mode 100644 docs/en/serverless/transclusion/apm/guide/spec/v2/error.mdx delete mode 100644 docs/en/serverless/transclusion/apm/guide/spec/v2/metadata.mdx delete mode 100644 docs/en/serverless/transclusion/apm/guide/spec/v2/metricset.mdx delete mode 100644 docs/en/serverless/transclusion/apm/guide/spec/v2/span.mdx delete mode 100644 docs/en/serverless/transclusion/apm/guide/spec/v2/transaction.mdx diff --git a/docs/en/serverless/aiops/aiops-detect-anomalies.asciidoc b/docs/en/serverless/aiops/aiops-detect-anomalies.asciidoc index 417d1d65f3..56ef927f26 100644 --- a/docs/en/serverless/aiops/aiops-detect-anomalies.asciidoc +++ b/docs/en/serverless/aiops/aiops-detect-anomalies.asciidoc @@ -86,10 +86,10 @@ Creates jobs that detect rare occurrences in time series data. Rare jobs use the Geo:: Creates jobs that detect unusual occurrences in the geographic locations of your data. Your data set must contain geo data. - -For more information about job types, refer to the {ml-docs}/ml-anomaly-detection-job-types.html[{ml}] documentation. -- + +For more information about job types, refer to the {ml-docs}/ml-anomaly-detection-job-types.html[{ml}] documentation. ++ .Not sure what type of job to create? [NOTE] ==== @@ -101,7 +101,6 @@ or click **Use full data** to view the full time range of data. Expand the fields to see details about the range and distribution of values. When you're done, go back to the first step and create your job. ==== -+ . Step through the instructions in the job creation wizard to configure your job. You can accept the default settings for most settings now and <<observability-aiops-tune-anomaly-detection-job,tune the job>> later. . If you want the job to start immediately when the job is created, make sure that option is selected on the summary page. diff --git a/docs/en/serverless/aiops/aiops-detect-anomalies.mdx b/docs/en/serverless/aiops/aiops-detect-anomalies.mdx index 33aa9cddad..99af3b07ea 100644 --- a/docs/en/serverless/aiops/aiops-detect-anomalies.mdx +++ b/docs/en/serverless/aiops/aiops-detect-anomalies.mdx @@ -55,42 +55,42 @@ To learn more about anomaly detection, refer to the [((ml))](((ml-docs))/ml-ad-o 1. Select the wizard for the type of job you want to create. The following wizards are available. You might also see specialized wizards based on the type of data you are analyzing. -<DocCallOut title="Tip"> -In general, it is a good idea to start with single metric anomaly detection jobs for your key performance indicators. -After you examine these simple analysis results, you will have a better idea of what the influencers might be. -Then you can create multi-metric jobs and split the data or create more complex analysis functions as necessary. + <DocCallOut title="Tip"> + In general, it is a good idea to start with single metric anomaly detection jobs for your key performance indicators. + After you examine these simple analysis results, you will have a better idea of what the influencers might be. + Then you can create multi-metric jobs and split the data or create more complex analysis functions as necessary. </DocCallOut> - <DocDefList> - <DocDefTerm>Single metric</DocDefTerm> - <DocDefDescription> - Creates simple jobs that have a single detector. A _detector_ applies an analytical function to specific fields in your data. In addition to limiting the number of detectors, the single metric wizard omits many of the more advanced configuration options. - </DocDefDescription> - <DocDefTerm>Multi-metric</DocDefTerm> - <DocDefDescription> - Creates jobs that can have more than one detector, which is more efficient than running multiple jobs against the same data. - </DocDefDescription> - <DocDefTerm>Population</DocDefTerm> - <DocDefDescription> - Creates jobs that detect activity that is unusual compared to the behavior of the population. - </DocDefDescription> - <DocDefTerm>Advanced</DocDefTerm> - <DocDefDescription> - Creates jobs that can have multiple detectors and enables you to configure all job settings. - </DocDefDescription> - <DocDefTerm>Categorization</DocDefTerm> - <DocDefDescription> - Creates jobs that group log messages into categories and use `count` or `rare` functions to detect anomalies within them. - </DocDefDescription> - <DocDefTerm>Rare</DocDefTerm> - <DocDefDescription> - Creates jobs that detect rare occurrences in time series data. Rare jobs use the `rare` or `freq_rare` functions and also detect rare occurrences in populations. - </DocDefDescription> - <DocDefTerm>Geo</DocDefTerm> - <DocDefDescription> - Creates jobs that detect unusual occurrences in the geographic locations of your data. Your data set must contain geo data. - </DocDefDescription> - </DocDefList> + <DocDefList> + <DocDefTerm>Single metric</DocDefTerm> + <DocDefDescription> + Creates simple jobs that have a single detector. A _detector_ applies an analytical function to specific fields in your data. In addition to limiting the number of detectors, the single metric wizard omits many of the more advanced configuration options. + </DocDefDescription> + <DocDefTerm>Multi-metric</DocDefTerm> + <DocDefDescription> + Creates jobs that can have more than one detector, which is more efficient than running multiple jobs against the same data. + </DocDefDescription> + <DocDefTerm>Population</DocDefTerm> + <DocDefDescription> + Creates jobs that detect activity that is unusual compared to the behavior of the population. + </DocDefDescription> + <DocDefTerm>Advanced</DocDefTerm> + <DocDefDescription> + Creates jobs that can have multiple detectors and enables you to configure all job settings. + </DocDefDescription> + <DocDefTerm>Categorization</DocDefTerm> + <DocDefDescription> + Creates jobs that group log messages into categories and use `count` or `rare` functions to detect anomalies within them. + </DocDefDescription> + <DocDefTerm>Rare</DocDefTerm> + <DocDefDescription> + Creates jobs that detect rare occurrences in time series data. Rare jobs use the `rare` or `freq_rare` functions and also detect rare occurrences in populations. + </DocDefDescription> + <DocDefTerm>Geo</DocDefTerm> + <DocDefDescription> + Creates jobs that detect unusual occurrences in the geographic locations of your data. Your data set must contain geo data. + </DocDefDescription> + </DocDefList> For more information about job types, refer to the [((ml))](((ml-docs))/ml-anomaly-detection-job-types.html) documentation. diff --git a/docs/en/serverless/alerting/create-custom-threshold-alert-rule.asciidoc b/docs/en/serverless/alerting/create-custom-threshold-alert-rule.asciidoc index 168abcb6db..7fea10f097 100644 --- a/docs/en/serverless/alerting/create-custom-threshold-alert-rule.asciidoc +++ b/docs/en/serverless/alerting/create-custom-threshold-alert-rule.asciidoc @@ -117,7 +117,36 @@ If the `Host A, Architecture A` group matches the rule conditions, but the `Host If you select one field—for example, `host.name`—and `Host A` matches the conditions but `Host B` doesn't, one alert is triggered for `Host A`. If both groups match the conditions, alerts are triggered for both groups. -When you select **Alert me if a group stops reporting data**, the rule is triggered if a group that previously reported metrics does not report them again over the expected time period. +[discrete] +[[observability-create-custom-threshold-alert-rule-trigger-no-data-alerts-optional]] +== Trigger "no data" alerts (optional) + +Optionally configure the rule to trigger an alert when: + +* there is no data, or +* a group that was previously detected stops reporting data. + +To do this, select **Alert me if there's no data**. + +The behavior of the alert depends on whether any **group alerts by** fields are specified: + +* **No "group alerts by" fields**: (Default) A "no data" alert is triggered if the condition fails to report data over the expected time period, or the rule fails to query {es}. This alert means that something is wrong and there is not enough data to evaluate the related threshold. +* **Has "group alerts by" fields**: If a previously detected group stops reporting data, a "no data" alert is triggered for the missing group. ++ +For example, consider a scenario where `host.name` is the **group alerts by** field for CPU usage above 80%. The first time the rule runs, two hosts report data: `host-1` and `host-2`. The second time the rule runs, `host-1` does not report any data, so a "no data" alert is triggered for `host-1`. When the rule runs again, if `host-1` starts reporting data again, there are a couple possible scenarios: ++ +** If `host-1` reports data for CPU usage and it is above the threshold of 80%, no new alert is triggered. +Instead the existing alert changes from "no data" to a triggered alert that breaches the threshold. +Keep in mind that no notifications are sent in this case because there is still an ongoing issue. +** If `host-1` reports CPU usage below the threshold of 80%, the alert status is changed to recovered. + +.How to untrack decommissioned hosts +[NOTE] +==== +If a host (for example, `host-1`) is decommissioned, you probably no longer want to see "no data" alerts about it. +To mark an alert as untracked: +Go to the Alerts table, click the image:images/icons/boxesHorizontal.svg[More actions] icon to expand the "More actions" menu, and click _Mark as untracked_. +==== [discrete] [[observability-create-custom-threshold-alert-rule-add-actions]] diff --git a/docs/en/serverless/alerting/create-latency-threshold-alert-rule.mdx b/docs/en/serverless/alerting/create-latency-threshold-alert-rule.mdx index 4c464e6866..87cfcb3a29 100644 --- a/docs/en/serverless/alerting/create-latency-threshold-alert-rule.mdx +++ b/docs/en/serverless/alerting/create-latency-threshold-alert-rule.mdx @@ -121,7 +121,7 @@ You can also specify [variables common to all rules](((kibana-ref))/rule-action- </DocAccordion> -<div id="create-failed-transaction-rate-threshold-example"></div> +<div id="create-latency-transaction-rate-threshold-example"></div> ## Example The latency threshold alert triggers when the latency of a specific transaction type in a service exceeds a defined threshold. diff --git a/docs/en/serverless/alerting/synthetic-monitor-status-alert.asciidoc b/docs/en/serverless/alerting/synthetic-monitor-status-alert.asciidoc index ac02693e09..6acd7a02ad 100644 --- a/docs/en/serverless/alerting/synthetic-monitor-status-alert.asciidoc +++ b/docs/en/serverless/alerting/synthetic-monitor-status-alert.asciidoc @@ -102,33 +102,49 @@ You an also specify {kibana-ref}/rule-action-variables.html[variables common to `context.checkedAt`:: Timestamp of the monitor run. + `context.hostName`:: Hostname of the location from which the check is performed. + `context.lastErrorMessage`:: Monitor last error message. + `context.locationId`:: Location id from which the check is performed. + `context.locationName`:: Location name from which the check is performed. + `context.locationNames`:: Location names from which the checks are performed. + `context.message`:: A generated message summarizing the status of monitors currently down. + `context.monitorId`:: ID of the monitor. + `context.monitorName`:: Name of the monitor. + `context.monitorTags`:: Tags associated with the monitor. + `context.monitorType`:: Type (for example, HTTP/TCP) of the monitor. + `context.monitorUrl`:: URL of the monitor. + `context.reason`:: A concise description of the reason for the alert. + `context.recoveryReason`:: A concise description of the reason for the recovery. + `context.status`:: Monitor status (for example, "down"). + `context.viewInAppUrl`:: Open alert details and context in Synthetics app. + diff --git a/docs/en/serverless/infra-monitoring/view-infrastructure-metrics.asciidoc b/docs/en/serverless/infra-monitoring/view-infrastructure-metrics.asciidoc index 3e640398a3..5095f3b590 100644 --- a/docs/en/serverless/infra-monitoring/view-infrastructure-metrics.asciidoc +++ b/docs/en/serverless/infra-monitoring/view-infrastructure-metrics.asciidoc @@ -6,13 +6,13 @@ preview:[] -The **Inventory** page provides a metrics-driven view of your entire infrastructure grouped by +The **Infrastructure Inventory** page provides a metrics-driven view of your entire infrastructure grouped by the resources you are monitoring. All monitored resources emitting a core set of infrastructure metrics are displayed to give you a quick view of the overall health of your infrastructure. -To access the **Inventory** page, in your {observability} project, -go to **Infrastructure** → **Inventory**. +To access the **Infrastructure Inventory** page, in your {observability} project, +go to **Infrastructure inventory**. [role="screenshot"] image::images/metrics-app.png[Infrastructure UI in {kib}] @@ -59,12 +59,12 @@ To examine the metrics for a specific time, use the time filter to select the da [[analyze-hosts-inventory]] == View host metrics -By default the **Inventory** page displays a waffle map that shows the hosts you +By default the **Infrastructure Inventory** page displays a waffle map that shows the hosts you are monitoring and the current CPU usage for each host. Alternatively, you can click the **Table view** icon image:images/table-view-icon.png[Table view icon] to switch to a table view. -Without leaving the **Inventory** page, you can view enhanced metrics relating to each host +Without leaving the **Infrastructure Inventory** page, you can view enhanced metrics relating to each host running in your infrastructure. On the waffle map, select a host to display the host details overlay. diff --git a/docs/en/serverless/projects/create-an-observability-project.asciidoc b/docs/en/serverless/projects/create-an-observability-project.asciidoc index 66614e7fc0..fb17cc270c 100644 --- a/docs/en/serverless/projects/create-an-observability-project.asciidoc +++ b/docs/en/serverless/projects/create-an-observability-project.asciidoc @@ -5,7 +5,7 @@ :keywords: serverless, observability, how-to ++++ -<titleabbrev>Create an {observability} project</titleabbrev> +<titleabbrev>Create an Observability project</titleabbrev> ++++ :role: Admin diff --git a/docs/en/serverless/synthetics/synthetics-private-location.asciidoc b/docs/en/serverless/synthetics/synthetics-private-location.asciidoc index 79d4e2d78f..38004ee4b3 100644 --- a/docs/en/serverless/synthetics/synthetics-private-location.asciidoc +++ b/docs/en/serverless/synthetics/synthetics-private-location.asciidoc @@ -83,7 +83,7 @@ endif::[] ifeval::["{release-state}" != "unreleased"] To pull the Docker image run: -[source,sh] +[source,sh,subs="attributes"] ---- docker pull docker.elastic.co/elastic-agent/elastic-agent-complete:{version} ---- @@ -102,7 +102,7 @@ Version {version} has not yet been released. endif::[] ifeval::["{release-state}" != "unreleased"] -[source,sh,subs="attributes+"] +[source,sh,subs="attributes"] ---- docker run \ --env FLEET_ENROLL=1 \ diff --git a/docs/en/serverless/transclusion/apm/guide/install-agents/python.mdx b/docs/en/serverless/transclusion/apm/guide/install-agents/python.mdx index 5e48eaa4bc..5b18ace8fc 100644 --- a/docs/en/serverless/transclusion/apm/guide/install-agents/python.mdx +++ b/docs/en/serverless/transclusion/apm/guide/install-agents/python.mdx @@ -4,91 +4,88 @@ Django and Flask are two of several frameworks that the Elastic APM Python Agent supports. For a complete list of supported technologies, refer to the [Elastic APM Python Agent documentation](((apm-py-ref))/supported-technologies.html). -<DocTabs> - <DocTab name="Django"> - ```python - $ pip install elastic-apm - ``` +_Django_ - **1. Install the ((apm-agent))** +```python +$ pip install elastic-apm +``` - Install the ((apm-agent)) for Python as a dependency. +**1. Install the ((apm-agent))** - ```python - $ pip install elastic-apm - ``` +Install the ((apm-agent)) for Python as a dependency. - **2. Configure the ((apm-agent))** +```python +$ pip install elastic-apm +``` - Agents are libraries that run inside of your application process. - APM services are created programmatically based on the `SERVICE_NAME`. +**2. Configure the ((apm-agent))** - ```python - # Add the agent to the installed apps - INSTALLED_APPS = ( - 'elasticapm.contrib.django', - # ... - ) +Agents are libraries that run inside of your application process. +APM services are created programmatically based on the `SERVICE_NAME`. - ELASTIC_APM = { - # Set required service name. Allowed characters: - # a-z, A-Z, 0-9, -, _, and space - 'SERVICE_NAME': '', +```python +# Add the agent to the installed apps +INSTALLED_APPS = ( + 'elasticapm.contrib.django', + # ... +) - # Use if APM integration requires a token - 'SECRET_TOKEN': '', +ELASTIC_APM = { + # Set required service name. Allowed characters: + # a-z, A-Z, 0-9, -, _, and space + 'SERVICE_NAME': '', - # Set custom APM integration host and port (default: http://localhost:8200) - 'SERVER_URL': '', - } + # Use if APM integration requires a token + 'SECRET_TOKEN': '', - # To send performance metrics, add our tracing middleware: - MIDDLEWARE = ( - 'elasticapm.contrib.django.middleware.TracingMiddleware', - #... - ) - ``` + # Set custom APM integration host and port (default: http://localhost:8200) + 'SERVER_URL': '', +} - </DocTab> - <DocTab name="Flask"> - **1. Install the ((apm-agent))** +# To send performance metrics, add our tracing middleware: +MIDDLEWARE = ( + 'elasticapm.contrib.django.middleware.TracingMiddleware', + #... +) +``` - Install the ((apm-agent)) for Python as a dependency. +_Flask_ - ```python - $ pip install elastic-apm[flask] - ``` +**1. Install the ((apm-agent))** - **2. Configure the ((apm-agent))** +Install the ((apm-agent)) for Python as a dependency. - Agents are libraries that run inside of your application process. - APM services are created programmatically based on the `SERVICE_NAME`. +```python +$ pip install elastic-apm[flask] +``` - ```python - # initialize using environment variables - from elasticapm.contrib.flask import ElasticAPM - app = Flask(__name__) - apm = ElasticAPM(app) +**2. Configure the ((apm-agent))** - # or configure to use ELASTIC_APM in your application settings - from elasticapm.contrib.flask import ElasticAPM - app.config['ELASTIC_APM'] = { - # Set required service name. Allowed characters: - # a-z, A-Z, 0-9, -, _, and space - 'SERVICE_NAME': '', +Agents are libraries that run inside of your application process. +APM services are created programmatically based on the `SERVICE_NAME`. - # Use if APM integration requires a token - 'SECRET_TOKEN': '', +```python +# initialize using environment variables +from elasticapm.contrib.flask import ElasticAPM +app = Flask(__name__) +apm = ElasticAPM(app) - # Set custom APM integration host and port (default: http://localhost:8200) - 'SERVER_URL': '', - } +# or configure to use ELASTIC_APM in your application settings +from elasticapm.contrib.flask import ElasticAPM +app.config['ELASTIC_APM'] = { + # Set required service name. Allowed characters: + # a-z, A-Z, 0-9, -, _, and space + 'SERVICE_NAME': '', - apm = ElasticAPM(app) - ``` + # Use if APM integration requires a token + 'SECRET_TOKEN': '', - </DocTab> -</DocTabs> + # Set custom APM integration host and port (default: http://localhost:8200) + 'SERVER_URL': '', +} + +apm = ElasticAPM(app) +``` **Learn more in the ((apm-agent)) reference** diff --git a/docs/en/serverless/transclusion/apm/guide/install-agents/ruby.asciidoc b/docs/en/serverless/transclusion/apm/guide/install-agents/ruby.asciidoc index 8b72a6800a..a2c0f30b56 100644 --- a/docs/en/serverless/transclusion/apm/guide/install-agents/ruby.asciidoc +++ b/docs/en/serverless/transclusion/apm/guide/install-agents/ruby.asciidoc @@ -73,7 +73,6 @@ secret_token: '' server_url: 'http://localhost:8200' ---- - **Learn more in the {apm-agent} reference** * {apm-ruby-ref}/supported-technologies.html[Supported technologies] diff --git a/docs/en/serverless/transclusion/apm/guide/install-agents/ruby.mdx b/docs/en/serverless/transclusion/apm/guide/install-agents/ruby.mdx index a2ec22661c..82646b61dc 100644 --- a/docs/en/serverless/transclusion/apm/guide/install-agents/ruby.mdx +++ b/docs/en/serverless/transclusion/apm/guide/install-agents/ruby.mdx @@ -10,68 +10,64 @@ gem 'elastic-apm' **2. Configure the agent** -<DocTabs> - <DocTab name="Ruby on Rails"> - APM is automatically started when your app boots. - Configure the agent by creating the config file `config/elastic_apm.yml`: +_Ruby on Rails_ - ```ruby - # config/elastic_apm.yml: +APM is automatically started when your app boots. +Configure the agent by creating the config file `config/elastic_apm.yml`: - # Set service name - allowed characters: a-z, A-Z, 0-9, -, _ and space - # Defaults to the name of your Rails app - service_name: 'my-service' +```ruby +# config/elastic_apm.yml: - # Use if APM integration requires a token - secret_token: '' +# Set service name - allowed characters: a-z, A-Z, 0-9, -, _ and space +# Defaults to the name of your Rails app +service_name: 'my-service' - # Set custom APM integration host and port (default: http://localhost:8200) - server_url: 'http://localhost:8200' - ``` +# Use if APM integration requires a token +secret_token: '' - </DocTab> - <DocTab name="Rack"> - For Rack or a compatible framework, like Sinatra, include the middleware in your app and start the agent. +# Set custom APM integration host and port (default: http://localhost:8200) +server_url: 'http://localhost:8200' +``` - ```ruby - # config.ru +_Rack_ - app = lambda do |env| - [200, {'Content-Type' => 'text/plain'}, ['ok']] - end +For Rack or a compatible framework, like Sinatra, include the middleware in your app and start the agent. - # Wraps all requests in transactions and reports exceptions - use ElasticAPM::Middleware +```ruby +# config.ru - # Start an instance of the Agent - ElasticAPM.start(service_name: 'NothingButRack') +app = lambda do |env| + [200, {'Content-Type' => 'text/plain'}, ['ok']] +end - run app +# Wraps all requests in transactions and reports exceptions +use ElasticAPM::Middleware - # Gracefully stop the agent when process exits. - # Makes sure any pending transactions are sent. - at_exit { ElasticAPM.stop } - ``` +# Start an instance of the Agent +ElasticAPM.start(service_name: 'NothingButRack') - Create a config file `config/elastic_apm.yml`: +run app - ```ruby - # config/elastic_apm.yml: +# Gracefully stop the agent when process exits. +# Makes sure any pending transactions are sent. +at_exit { ElasticAPM.stop } +``` - # Set service name - allowed characters: a-z, A-Z, 0-9, -, _ and space - # Defaults to the name of your Rack app's class. - service_name: 'my-service' +Create a config file `config/elastic_apm.yml`: - # Use if APM integration requires a token - secret_token: '' +```ruby +# config/elastic_apm.yml: - # Set custom APM integration host and port (default: http://localhost:8200) - server_url: 'http://localhost:8200' - ``` +# Set service name - allowed characters: a-z, A-Z, 0-9, -, _ and space +# Defaults to the name of your Rack app's class. +service_name: 'my-service' - </DocTab> -</DocTabs> +# Use if APM integration requires a token +secret_token: '' +# Set custom APM integration host and port (default: http://localhost:8200) +server_url: 'http://localhost:8200' +``` **Learn more in the ((apm-agent)) reference** diff --git a/docs/en/serverless/transclusion/apm/guide/spec/v2/error.mdx b/docs/en/serverless/transclusion/apm/guide/spec/v2/error.mdx deleted file mode 100644 index 23b18ba8b1..0000000000 --- a/docs/en/serverless/transclusion/apm/guide/spec/v2/error.mdx +++ /dev/null @@ -1,1296 +0,0 @@ -export const snippet = ` -{ - "$id": "docs/spec/v2/error", - "description": "errorEvent represents an error or a logged error message, captured by an APM agent in a monitored service.", - "type": "object", - "properties": { - "context": { - "description": "Context holds arbitrary contextual information for the event.", - "type": [ - "null", - "object" - ], - "properties": { - "cloud": { - "description": "Cloud holds fields related to the cloud or infrastructure the events are coming from.", - "type": [ - "null", - "object" - ], - "properties": { - "origin": { - "description": "Origin contains the self-nested field groups for cloud.", - "type": [ - "null", - "object" - ], - "properties": { - "account": { - "description": "The cloud account or organization id used to identify different entities in a multi-tenant environment.", - "type": [ - "null", - "object" - ], - "properties": { - "id": { - "description": "The cloud account or organization id used to identify different entities in a multi-tenant environment.", - "type": [ - "null", - "string" - ] - } - } - }, - "provider": { - "description": "Name of the cloud provider.", - "type": [ - "null", - "string" - ] - }, - "region": { - "description": "Region in which this host, resource, or service is located.", - "type": [ - "null", - "string" - ] - }, - "service": { - "description": "The cloud service name is intended to distinguish services running on different platforms within a provider.", - "type": [ - "null", - "object" - ], - "properties": { - "name": { - "description": "The cloud service name is intended to distinguish services running on different platforms within a provider.", - "type": [ - "null", - "string" - ] - } - } - } - } - } - } - }, - "custom": { - "description": "Custom can contain additional metadata to be stored with the event. The format is unspecified and can be deeply nested objects. The information will not be indexed or searchable in Elasticsearch.", - "type": [ - "null", - "object" - ] - }, - "message": { - "description": "Message holds details related to message receiving and publishing if the captured event integrates with a messaging system", - "type": [ - "null", - "object" - ], - "properties": { - "age": { - "description": "Age of the message. If the monitored messaging framework provides a timestamp for the message, agents may use it. Otherwise, the sending agent can add a timestamp in milliseconds since the Unix epoch to the message's metadata to be retrieved by the receiving agent. If a timestamp is not available, agents should omit this field.", - "type": [ - "null", - "object" - ], - "properties": { - "ms": { - "description": "Age of the message in milliseconds.", - "type": [ - "null", - "integer" - ] - } - } - }, - "body": { - "description": "Body of the received message, similar to an HTTP request body", - "type": [ - "null", - "string" - ] - }, - "headers": { - "description": "Headers received with the message, similar to HTTP request headers.", - "type": [ - "null", - "object" - ], - "additionalProperties": false, - "patternProperties": { - "[.*]*$": { - "type": [ - "null", - "array", - "string" - ], - "items": { - "type": "string" - } - } - } - }, - "queue": { - "description": "Queue holds information about the message queue where the message is received.", - "type": [ - "null", - "object" - ], - "properties": { - "name": { - "description": "Name holds the name of the message queue where the message is received.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - } - }, - "routing_key": { - "description": "RoutingKey holds the optional routing key of the received message as set on the queuing system, such as in RabbitMQ.", - "type": [ - "null", - "string" - ] - } - } - }, - "page": { - "description": "Page holds information related to the current page and page referers. It is only sent from RUM agents.", - "type": [ - "null", - "object" - ], - "properties": { - "referer": { - "description": "Referer holds the URL of the page that 'linked' to the current page.", - "type": [ - "null", - "string" - ] - }, - "url": { - "description": "URL of the current page", - "type": [ - "null", - "string" - ] - } - } - }, - "request": { - "description": "Request describes the HTTP request information in case the event was created as a result of an HTTP request.", - "type": [ - "null", - "object" - ], - "properties": { - "body": { - "description": "Body only contais the request bod, not the query string information. It can either be a dictionary (for standard HTTP requests) or a raw request body.", - "type": [ - "null", - "string", - "object" - ] - }, - "cookies": { - "description": "Cookies used by the request, parsed as key-value objects.", - "type": [ - "null", - "object" - ] - }, - "env": { - "description": "Env holds environment variable information passed to the monitored service.", - "type": [ - "null", - "object" - ] - }, - "headers": { - "description": "Headers includes any HTTP headers sent by the requester. Cookies will be taken by headers if supplied.", - "type": [ - "null", - "object" - ], - "additionalProperties": false, - "patternProperties": { - "[.*]*$": { - "type": [ - "null", - "array", - "string" - ], - "items": { - "type": "string" - } - } - } - }, - "http_version": { - "description": "HTTPVersion holds information about the used HTTP version.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "method": { - "description": "Method holds information about the method of the HTTP request.", - "type": "string", - "maxLength": 1024 - }, - "socket": { - "description": "Socket holds information related to the recorded request, such as whether or not data were encrypted and the remote address.", - "type": [ - "null", - "object" - ], - "properties": { - "encrypted": { - "description": "Encrypted indicates whether a request was sent as TLS/HTTPS request. DEPRECATED: this field will be removed in a future release.", - "type": [ - "null", - "boolean" - ] - }, - "remote_address": { - "description": "RemoteAddress holds the network address sending the request. It should be obtained through standard APIs and not be parsed from any headers like 'Forwarded'.", - "type": [ - "null", - "string" - ] - } - } - }, - "url": { - "description": "URL holds information sucha as the raw URL, scheme, host and path.", - "type": [ - "null", - "object" - ], - "properties": { - "full": { - "description": "Full, possibly agent-assembled URL of the request, e.g. https://example.com:443/search?q=elasticsearch#top.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "hash": { - "description": "Hash of the request URL, e.g. 'top'", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "hostname": { - "description": "Hostname information of the request, e.g. 'example.com'.\"", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "pathname": { - "description": "Path of the request, e.g. '/search'", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "port": { - "description": "Port of the request, e.g. '443'. Can be sent as string or int.", - "type": [ - "null", - "string", - "integer" - ], - "maxLength": 1024 - }, - "protocol": { - "description": "Protocol information for the recorded request, e.g. 'https:'.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "raw": { - "description": "Raw unparsed URL of the HTTP request line, e.g https://example.com:443/search?q=elasticsearch. This URL may be absolute or relative. For more details, see https://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html#sec5.1.2.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "search": { - "description": "Search contains the query string information of the request. It is expected to have values delimited by ampersands.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - } - } - }, - "required": [ - "method" - ] - }, - "response": { - "description": "Response describes the HTTP response information in case the event was created as a result of an HTTP request.", - "type": [ - "null", - "object" - ], - "properties": { - "decoded_body_size": { - "description": "DecodedBodySize holds the size of the decoded payload.", - "type": [ - "null", - "integer" - ] - }, - "encoded_body_size": { - "description": "EncodedBodySize holds the size of the encoded payload.", - "type": [ - "null", - "integer" - ] - }, - "finished": { - "description": "Finished indicates whether the response was finished or not.", - "type": [ - "null", - "boolean" - ] - }, - "headers": { - "description": "Headers holds the http headers sent in the http response.", - "type": [ - "null", - "object" - ], - "additionalProperties": false, - "patternProperties": { - "[.*]*$": { - "type": [ - "null", - "array", - "string" - ], - "items": { - "type": "string" - } - } - } - }, - "headers_sent": { - "description": "HeadersSent indicates whether http headers were sent.", - "type": [ - "null", - "boolean" - ] - }, - "status_code": { - "description": "StatusCode sent in the http response.", - "type": [ - "null", - "integer" - ] - }, - "transfer_size": { - "description": "TransferSize holds the total size of the payload.", - "type": [ - "null", - "integer" - ] - } - } - }, - "service": { - "description": "Service related information can be sent per event. Information provided here will override the more generic information retrieved from metadata, missing service fields will be retrieved from the metadata information.", - "type": [ - "null", - "object" - ], - "properties": { - "agent": { - "description": "Agent holds information about the APM agent capturing the event.", - "type": [ - "null", - "object" - ], - "properties": { - "ephemeral_id": { - "description": "EphemeralID is a free format ID used for metrics correlation by agents", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "name": { - "description": "Name of the APM agent capturing information.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "version": { - "description": "Version of the APM agent capturing information.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - } - }, - "environment": { - "description": "Environment in which the monitored service is running, e.g. \`production\` or \`staging\`.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "framework": { - "description": "Framework holds information about the framework used in the monitored service.", - "type": [ - "null", - "object" - ], - "properties": { - "name": { - "description": "Name of the used framework", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "version": { - "description": "Version of the used framework", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - } - }, - "id": { - "description": "ID holds a unique identifier for the service.", - "type": [ - "null", - "string" - ] - }, - "language": { - "description": "Language holds information about the programming language of the monitored service.", - "type": [ - "null", - "object" - ], - "properties": { - "name": { - "description": "Name of the used programming language", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "version": { - "description": "Version of the used programming language", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - } - }, - "name": { - "description": "Name of the monitored service.", - "type": [ - "null", - "string" - ], - "maxLength": 1024, - "pattern": "^[a-zA-Z0-9 _-]+$" - }, - "node": { - "description": "Node must be a unique meaningful name of the service node.", - "type": [ - "null", - "object" - ], - "properties": { - "configured_name": { - "description": "Name of the service node", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - } - }, - "origin": { - "description": "Origin contains the self-nested field groups for service.", - "type": [ - "null", - "object" - ], - "properties": { - "id": { - "description": "Immutable id of the service emitting this event.", - "type": [ - "null", - "string" - ] - }, - "name": { - "description": "Immutable name of the service emitting this event.", - "type": [ - "null", - "string" - ] - }, - "version": { - "description": "The version of the service the data was collected from.", - "type": [ - "null", - "string" - ] - } - } - }, - "runtime": { - "description": "Runtime holds information about the language runtime running the monitored service", - "type": [ - "null", - "object" - ], - "properties": { - "name": { - "description": "Name of the language runtime", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "version": { - "description": "Version of the language runtime", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - } - }, - "target": { - "description": "Target holds information about the outgoing service in case of an outgoing event", - "type": [ - "null", - "object" - ], - "properties": { - "name": { - "description": "Immutable name of the target service for the event", - "type": [ - "null", - "string" - ] - }, - "type": { - "description": "Immutable type of the target service for the event", - "type": [ - "null", - "string" - ] - } - }, - "anyOf": [ - { - "properties": { - "type": { - "type": "string" - } - }, - "required": [ - "type" - ] - }, - { - "properties": { - "name": { - "type": "string" - } - }, - "required": [ - "name" - ] - } - ] - }, - "version": { - "description": "Version of the monitored service.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - } - }, - "tags": { - "description": "Tags are a flat mapping of user-defined tags. On the agent side, tags are called labels. Allowed value types are string, boolean and number values. Tags are indexed and searchable.", - "type": [ - "null", - "object" - ], - "additionalProperties": { - "type": [ - "null", - "string", - "boolean", - "number" - ], - "maxLength": 1024 - } - }, - "user": { - "description": "User holds information about the correlated user for this event. If user data are provided here, all user related information from metadata is ignored, otherwise the metadata's user information will be stored with the event.", - "type": [ - "null", - "object" - ], - "properties": { - "domain": { - "description": "Domain of the logged in user", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "email": { - "description": "Email of the user.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "id": { - "description": "ID identifies the logged in user, e.g. can be the primary key of the user", - "type": [ - "null", - "string", - "integer" - ], - "maxLength": 1024 - }, - "username": { - "description": "Name of the user.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - } - } - } - }, - "culprit": { - "description": "Culprit identifies the function call which was the primary perpetrator of this event.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "exception": { - "description": "Exception holds information about the original error. The information is language specific.", - "type": [ - "null", - "object" - ], - "properties": { - "attributes": { - "description": "Attributes of the exception.", - "type": [ - "null", - "object" - ] - }, - "cause": { - "description": "Cause can hold a collection of error exceptions representing chained exceptions. The chain starts with the outermost exception, followed by its cause, and so on.", - "type": [ - "null", - "array" - ], - "items": { - "type": "object" - }, - "minItems": 0 - }, - "code": { - "description": "Code that is set when the error happened, e.g. database error code.", - "type": [ - "null", - "string", - "integer" - ], - "maxLength": 1024 - }, - "handled": { - "description": "Handled indicates whether the error was caught in the code or not.", - "type": [ - "null", - "boolean" - ] - }, - "message": { - "description": "Message contains the originally captured error message.", - "type": [ - "null", - "string" - ] - }, - "module": { - "description": "Module describes the exception type's module namespace.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "stacktrace": { - "description": "Stacktrace information of the captured exception.", - "type": [ - "null", - "array" - ], - "items": { - "type": "object", - "properties": { - "abs_path": { - "description": "AbsPath is the absolute path of the frame's file.", - "type": [ - "null", - "string" - ] - }, - "classname": { - "description": "Classname of the frame.", - "type": [ - "null", - "string" - ] - }, - "colno": { - "description": "ColumnNumber of the frame.", - "type": [ - "null", - "integer" - ] - }, - "context_line": { - "description": "ContextLine is the line from the frame's file.", - "type": [ - "null", - "string" - ] - }, - "filename": { - "description": "Filename is the relative name of the frame's file.", - "type": [ - "null", - "string" - ] - }, - "function": { - "description": "Function represented by the frame.", - "type": [ - "null", - "string" - ] - }, - "library_frame": { - "description": "LibraryFrame indicates whether the frame is from a third party library.", - "type": [ - "null", - "boolean" - ] - }, - "lineno": { - "description": "LineNumber of the frame.", - "type": [ - "null", - "integer" - ] - }, - "module": { - "description": "Module to which the frame belongs to.", - "type": [ - "null", - "string" - ] - }, - "post_context": { - "description": "PostContext is a slice of code lines immediately before the line from the frame's file.", - "type": [ - "null", - "array" - ], - "items": { - "type": "string" - }, - "minItems": 0 - }, - "pre_context": { - "description": "PreContext is a slice of code lines immediately after the line from the frame's file.", - "type": [ - "null", - "array" - ], - "items": { - "type": "string" - }, - "minItems": 0 - }, - "vars": { - "description": "Vars is a flat mapping of local variables of the frame.", - "type": [ - "null", - "object" - ] - } - }, - "anyOf": [ - { - "properties": { - "classname": { - "type": "string" - } - }, - "required": [ - "classname" - ] - }, - { - "properties": { - "filename": { - "type": "string" - } - }, - "required": [ - "filename" - ] - } - ] - }, - "minItems": 0 - }, - "type": { - "description": "Type of the exception.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - }, - "anyOf": [ - { - "properties": { - "message": { - "type": "string" - } - }, - "required": [ - "message" - ] - }, - { - "properties": { - "type": { - "type": "string" - } - }, - "required": [ - "type" - ] - } - ] - }, - "id": { - "description": "ID holds the hex encoded 128 random bits ID of the event.", - "type": "string", - "maxLength": 1024 - }, - "log": { - "description": "Log holds additional information added when the error is logged.", - "type": [ - "null", - "object" - ], - "properties": { - "level": { - "description": "Level represents the severity of the recorded log.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "logger_name": { - "description": "LoggerName holds the name of the used logger instance.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "message": { - "description": "Message of the logged error. In case a parameterized message is captured, Message should contain the same information, but with any placeholders being replaced.", - "type": "string" - }, - "param_message": { - "description": "ParamMessage should contain the same information as Message, but with placeholders where parameters were logged, e.g. 'error connecting to %s'. The string is not interpreted, allowing differnt placeholders per client languange. The information might be used to group errors together.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "stacktrace": { - "description": "Stacktrace information of the captured error.", - "type": [ - "null", - "array" - ], - "items": { - "type": "object", - "properties": { - "abs_path": { - "description": "AbsPath is the absolute path of the frame's file.", - "type": [ - "null", - "string" - ] - }, - "classname": { - "description": "Classname of the frame.", - "type": [ - "null", - "string" - ] - }, - "colno": { - "description": "ColumnNumber of the frame.", - "type": [ - "null", - "integer" - ] - }, - "context_line": { - "description": "ContextLine is the line from the frame's file.", - "type": [ - "null", - "string" - ] - }, - "filename": { - "description": "Filename is the relative name of the frame's file.", - "type": [ - "null", - "string" - ] - }, - "function": { - "description": "Function represented by the frame.", - "type": [ - "null", - "string" - ] - }, - "library_frame": { - "description": "LibraryFrame indicates whether the frame is from a third party library.", - "type": [ - "null", - "boolean" - ] - }, - "lineno": { - "description": "LineNumber of the frame.", - "type": [ - "null", - "integer" - ] - }, - "module": { - "description": "Module to which the frame belongs to.", - "type": [ - "null", - "string" - ] - }, - "post_context": { - "description": "PostContext is a slice of code lines immediately before the line from the frame's file.", - "type": [ - "null", - "array" - ], - "items": { - "type": "string" - }, - "minItems": 0 - }, - "pre_context": { - "description": "PreContext is a slice of code lines immediately after the line from the frame's file.", - "type": [ - "null", - "array" - ], - "items": { - "type": "string" - }, - "minItems": 0 - }, - "vars": { - "description": "Vars is a flat mapping of local variables of the frame.", - "type": [ - "null", - "object" - ] - } - }, - "anyOf": [ - { - "properties": { - "classname": { - "type": "string" - } - }, - "required": [ - "classname" - ] - }, - { - "properties": { - "filename": { - "type": "string" - } - }, - "required": [ - "filename" - ] - } - ] - }, - "minItems": 0 - } - }, - "required": [ - "message" - ] - }, - "parent_id": { - "description": "ParentID holds the hex encoded 64 random bits ID of the parent transaction or span.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "timestamp": { - "description": "Timestamp holds the recorded time of the event, UTC based and formatted as microseconds since Unix epoch.", - "type": [ - "null", - "integer" - ] - }, - "trace_id": { - "description": "TraceID holds the hex encoded 128 random bits ID of the correlated trace.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "transaction": { - "description": "Transaction holds information about the correlated transaction.", - "type": [ - "null", - "object" - ], - "properties": { - "name": { - "description": "Name is the generic designation of a transaction in the scope of a single service, eg: 'GET /users/:id'.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "sampled": { - "description": "Sampled indicates whether or not the full information for a transaction is captured. If a transaction is unsampled no spans and less context information will be reported.", - "type": [ - "null", - "boolean" - ] - }, - "type": { - "description": "Type expresses the correlated transaction's type as keyword that has specific relevance within the service's domain, eg: 'request', 'backgroundjob'.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - } - }, - "transaction_id": { - "description": "TransactionID holds the hex encoded 64 random bits ID of the correlated transaction.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - }, - "required": [ - "id" - ], - "allOf": [ - { - "if": { - "properties": { - "transaction_id": { - "type": "string" - } - }, - "required": [ - "transaction_id" - ] - }, - "then": { - "properties": { - "parent_id": { - "type": "string" - } - }, - "required": [ - "parent_id" - ] - } - }, - { - "if": { - "properties": { - "trace_id": { - "type": "string" - } - }, - "required": [ - "trace_id" - ] - }, - "then": { - "properties": { - "parent_id": { - "type": "string" - } - }, - "required": [ - "parent_id" - ] - } - }, - { - "if": { - "properties": { - "transaction_id": { - "type": "string" - } - }, - "required": [ - "transaction_id" - ] - }, - "then": { - "properties": { - "trace_id": { - "type": "string" - } - }, - "required": [ - "trace_id" - ] - } - }, - { - "if": { - "properties": { - "parent_id": { - "type": "string" - } - }, - "required": [ - "parent_id" - ] - }, - "then": { - "properties": { - "trace_id": { - "type": "string" - } - }, - "required": [ - "trace_id" - ] - } - } - ], - "anyOf": [ - { - "properties": { - "exception": { - "type": "object" - } - }, - "required": [ - "exception" - ] - }, - { - "properties": { - "log": { - "type": "object" - } - }, - "required": [ - "log" - ] - } - ] -}` - -<DocCode children={snippet} /> \ No newline at end of file diff --git a/docs/en/serverless/transclusion/apm/guide/spec/v2/metadata.mdx b/docs/en/serverless/transclusion/apm/guide/spec/v2/metadata.mdx deleted file mode 100644 index a4cfb12600..0000000000 --- a/docs/en/serverless/transclusion/apm/guide/spec/v2/metadata.mdx +++ /dev/null @@ -1,570 +0,0 @@ -export const snippet = ` -{ - "$id": "docs/spec/v2/metadata", - "type": "object", - "properties": { - "cloud": { - "description": "Cloud metadata about where the monitored service is running.", - "type": [ - "null", - "object" - ], - "properties": { - "account": { - "description": "Account where the monitored service is running.", - "type": [ - "null", - "object" - ], - "properties": { - "id": { - "description": "ID of the cloud account.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "name": { - "description": "Name of the cloud account.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - } - }, - "availability_zone": { - "description": "AvailabilityZone where the monitored service is running, e.g. us-east-1a", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "instance": { - "description": "Instance on which the monitored service is running.", - "type": [ - "null", - "object" - ], - "properties": { - "id": { - "description": "ID of the cloud instance.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "name": { - "description": "Name of the cloud instance.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - } - }, - "machine": { - "description": "Machine on which the monitored service is running.", - "type": [ - "null", - "object" - ], - "properties": { - "type": { - "description": "ID of the cloud machine.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - } - }, - "project": { - "description": "Project in which the monitored service is running.", - "type": [ - "null", - "object" - ], - "properties": { - "id": { - "description": "ID of the cloud project.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "name": { - "description": "Name of the cloud project.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - } - }, - "provider": { - "description": "Provider that is used, e.g. aws, azure, gcp, digitalocean.", - "type": "string", - "maxLength": 1024 - }, - "region": { - "description": "Region where the monitored service is running, e.g. us-east-1", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "service": { - "description": "Service that is monitored on cloud", - "type": [ - "null", - "object" - ], - "properties": { - "name": { - "description": "Name of the cloud service, intended to distinguish services running on different platforms within a provider, eg AWS EC2 vs Lambda, GCP GCE vs App Engine, Azure VM vs App Server.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - } - } - }, - "required": [ - "provider" - ] - }, - "labels": { - "description": "Labels are a flat mapping of user-defined tags. Allowed value types are string, boolean and number values. Labels are indexed and searchable.", - "type": [ - "null", - "object" - ], - "additionalProperties": { - "type": [ - "null", - "string", - "boolean", - "number" - ], - "maxLength": 1024 - } - }, - "network": { - "description": "Network holds information about the network over which the monitored service is communicating.", - "type": [ - "null", - "object" - ], - "properties": { - "connection": { - "type": [ - "null", - "object" - ], - "properties": { - "type": { - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - } - } - } - }, - "process": { - "description": "Process metadata about the monitored service.", - "type": [ - "null", - "object" - ], - "properties": { - "argv": { - "description": "Argv holds the command line arguments used to start this process.", - "type": [ - "null", - "array" - ], - "items": { - "type": "string" - }, - "minItems": 0 - }, - "pid": { - "description": "PID holds the process ID of the service.", - "type": "integer" - }, - "ppid": { - "description": "Ppid holds the parent process ID of the service.", - "type": [ - "null", - "integer" - ] - }, - "title": { - "description": "Title is the process title. It can be the same as process name.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - }, - "required": [ - "pid" - ] - }, - "service": { - "description": "Service metadata about the monitored service.", - "type": "object", - "properties": { - "agent": { - "description": "Agent holds information about the APM agent capturing the event.", - "type": "object", - "properties": { - "activation_method": { - "description": "ActivationMethod of the APM agent capturing information.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "ephemeral_id": { - "description": "EphemeralID is a free format ID used for metrics correlation by agents", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "name": { - "description": "Name of the APM agent capturing information.", - "type": "string", - "maxLength": 1024, - "minLength": 1 - }, - "version": { - "description": "Version of the APM agent capturing information.", - "type": "string", - "maxLength": 1024 - } - }, - "required": [ - "name", - "version" - ] - }, - "environment": { - "description": "Environment in which the monitored service is running, e.g. \`production\` or \`staging\`.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "framework": { - "description": "Framework holds information about the framework used in the monitored service.", - "type": [ - "null", - "object" - ], - "properties": { - "name": { - "description": "Name of the used framework", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "version": { - "description": "Version of the used framework", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - } - }, - "id": { - "description": "ID holds a unique identifier for the running service.", - "type": [ - "null", - "string" - ] - }, - "language": { - "description": "Language holds information about the programming language of the monitored service.", - "type": [ - "null", - "object" - ], - "properties": { - "name": { - "description": "Name of the used programming language", - "type": "string", - "maxLength": 1024 - }, - "version": { - "description": "Version of the used programming language", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - }, - "required": [ - "name" - ] - }, - "name": { - "description": "Name of the monitored service.", - "type": "string", - "maxLength": 1024, - "minLength": 1, - "pattern": "^[a-zA-Z0-9 _-]+$" - }, - "node": { - "description": "Node must be a unique meaningful name of the service node.", - "type": [ - "null", - "object" - ], - "properties": { - "configured_name": { - "description": "Name of the service node", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - } - }, - "runtime": { - "description": "Runtime holds information about the language runtime running the monitored service", - "type": [ - "null", - "object" - ], - "properties": { - "name": { - "description": "Name of the language runtime", - "type": "string", - "maxLength": 1024 - }, - "version": { - "description": "Name of the language runtime", - "type": "string", - "maxLength": 1024 - } - }, - "required": [ - "name", - "version" - ] - }, - "version": { - "description": "Version of the monitored service.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - }, - "required": [ - "agent", - "name" - ] - }, - "system": { - "description": "System metadata", - "type": [ - "null", - "object" - ], - "properties": { - "architecture": { - "description": "Architecture of the system the monitored service is running on.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "configured_hostname": { - "description": "ConfiguredHostname is the configured name of the host the monitored service is running on. It should only be sent when configured by the user. If given, it is used as the event's hostname.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "container": { - "description": "Container holds the system's container ID if available.", - "type": [ - "null", - "object" - ], - "properties": { - "id": { - "description": "ID of the container the monitored service is running in.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - } - }, - "detected_hostname": { - "description": "DetectedHostname is the hostname detected by the APM agent. It usually contains what the hostname command returns on the host machine. It will be used as the event's hostname if ConfiguredHostname is not present.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "hostname": { - "description": "Deprecated: Use ConfiguredHostname and DetectedHostname instead. DeprecatedHostname is the host name of the system the service is running on. It does not distinguish between configured and detected hostname and therefore is deprecated and only used if no other hostname information is available.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "kubernetes": { - "description": "Kubernetes system information if the monitored service runs on Kubernetes.", - "type": [ - "null", - "object" - ], - "properties": { - "namespace": { - "description": "Namespace of the Kubernetes resource the monitored service is run on.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "node": { - "description": "Node related information", - "type": [ - "null", - "object" - ], - "properties": { - "name": { - "description": "Name of the Kubernetes Node", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - } - }, - "pod": { - "description": "Pod related information", - "type": [ - "null", - "object" - ], - "properties": { - "name": { - "description": "Name of the Kubernetes Pod", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "uid": { - "description": "UID is the system-generated string uniquely identifying the Pod.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - } - } - } - }, - "platform": { - "description": "Platform name of the system platform the monitored service is running on.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - } - }, - "user": { - "description": "User metadata, which can be overwritten on a per event basis.", - "type": [ - "null", - "object" - ], - "properties": { - "domain": { - "description": "Domain of the logged in user", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "email": { - "description": "Email of the user.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "id": { - "description": "ID identifies the logged in user, e.g. can be the primary key of the user", - "type": [ - "null", - "string", - "integer" - ], - "maxLength": 1024 - }, - "username": { - "description": "Name of the user.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - } - } - }, - "required": [ - "service" - ] -}` - -<DocCode children={snippet} /> \ No newline at end of file diff --git a/docs/en/serverless/transclusion/apm/guide/spec/v2/metricset.mdx b/docs/en/serverless/transclusion/apm/guide/spec/v2/metricset.mdx deleted file mode 100644 index 5e47004d9a..0000000000 --- a/docs/en/serverless/transclusion/apm/guide/spec/v2/metricset.mdx +++ /dev/null @@ -1,304 +0,0 @@ -export const snippet = ` -{ - "$id": "docs/spec/v2/metricset", - "type": "object", - "properties": { - "faas": { - "description": "FAAS holds fields related to Function as a Service events.", - "type": [ - "null", - "object" - ], - "properties": { - "coldstart": { - "description": "Indicates whether a function invocation was a cold start or not.", - "type": [ - "null", - "boolean" - ] - }, - "execution": { - "description": "The request id of the function invocation.", - "type": [ - "null", - "string" - ] - }, - "id": { - "description": "A unique identifier of the invoked serverless function.", - "type": [ - "null", - "string" - ] - }, - "name": { - "description": "The lambda function name.", - "type": [ - "null", - "string" - ] - }, - "trigger": { - "description": "Trigger attributes.", - "type": [ - "null", - "object" - ], - "properties": { - "request_id": { - "description": "The id of the origin trigger request.", - "type": [ - "null", - "string" - ] - }, - "type": { - "description": "The trigger type.", - "type": [ - "null", - "string" - ] - } - } - }, - "version": { - "description": "The lambda function version.", - "type": [ - "null", - "string" - ] - } - } - }, - "samples": { - "description": "Samples hold application metrics collected from the agent.", - "type": "object", - "additionalProperties": false, - "patternProperties": { - "^[^*\"]*$": { - "type": [ - "null", - "object" - ], - "properties": { - "counts": { - "description": "Counts holds the bucket counts for histogram metrics. These numbers must be positive or zero. If Counts is specified, then Values is expected to be specified with the same number of elements, and with the same order.", - "type": [ - "null", - "array" - ], - "items": { - "type": "integer", - "minimum": 0 - }, - "minItems": 0 - }, - "type": { - "description": "Type holds an optional metric type: gauge, counter, or histogram. If Type is unknown, it will be ignored.", - "type": [ - "null", - "string" - ] - }, - "unit": { - "description": "Unit holds an optional unit for the metric. - \"percent\" (value is in the range [0,1]) - \"byte\" - a time unit: \"nanos\", \"micros\", \"ms\", \"s\", \"m\", \"h\", \"d\" If Unit is unknown, it will be ignored.", - "type": [ - "null", - "string" - ] - }, - "value": { - "description": "Value holds the value of a single metric sample.", - "type": [ - "null", - "number" - ] - }, - "values": { - "description": "Values holds the bucket values for histogram metrics. Values must be provided in ascending order; failure to do so will result in the metric being discarded.", - "type": [ - "null", - "array" - ], - "items": { - "type": "number" - }, - "minItems": 0 - } - }, - "allOf": [ - { - "if": { - "properties": { - "counts": { - "type": "array" - } - }, - "required": [ - "counts" - ] - }, - "then": { - "properties": { - "values": { - "type": "array" - } - }, - "required": [ - "values" - ] - } - }, - { - "if": { - "properties": { - "values": { - "type": "array" - } - }, - "required": [ - "values" - ] - }, - "then": { - "properties": { - "counts": { - "type": "array" - } - }, - "required": [ - "counts" - ] - } - } - ], - "anyOf": [ - { - "properties": { - "value": { - "type": "number" - } - }, - "required": [ - "value" - ] - }, - { - "properties": { - "values": { - "type": "array" - } - }, - "required": [ - "values" - ] - } - ] - } - } - }, - "service": { - "description": "Service holds selected information about the correlated service.", - "type": [ - "null", - "object" - ], - "properties": { - "name": { - "description": "Name of the correlated service.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "version": { - "description": "Version of the correlated service.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - } - }, - "span": { - "description": "Span holds selected information about the correlated transaction.", - "type": [ - "null", - "object" - ], - "properties": { - "subtype": { - "description": "Subtype is a further sub-division of the type (e.g. postgresql, elasticsearch)", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "type": { - "description": "Type expresses the correlated span's type as keyword that has specific relevance within the service's domain, eg: 'request', 'backgroundjob'.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - } - }, - "tags": { - "description": "Tags are a flat mapping of user-defined tags. On the agent side, tags are called labels. Allowed value types are string, boolean and number values. Tags are indexed and searchable.", - "type": [ - "null", - "object" - ], - "additionalProperties": { - "type": [ - "null", - "string", - "boolean", - "number" - ], - "maxLength": 1024 - } - }, - "timestamp": { - "description": "Timestamp holds the recorded time of the event, UTC based and formatted as microseconds since Unix epoch", - "type": [ - "null", - "integer" - ] - }, - "transaction": { - "description": "Transaction holds selected information about the correlated transaction.", - "type": [ - "null", - "object" - ], - "properties": { - "name": { - "description": "Name of the correlated transaction.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "type": { - "description": "Type expresses the correlated transaction's type as keyword that has specific relevance within the service's domain, eg: 'request', 'backgroundjob'.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - } - } - }, - "required": [ - "samples" - ] -}` - -<DocCode children={snippet} /> \ No newline at end of file diff --git a/docs/en/serverless/transclusion/apm/guide/spec/v2/span.mdx b/docs/en/serverless/transclusion/apm/guide/spec/v2/span.mdx deleted file mode 100644 index 6ac47163fb..0000000000 --- a/docs/en/serverless/transclusion/apm/guide/spec/v2/span.mdx +++ /dev/null @@ -1,906 +0,0 @@ -export const snippet = ` -{ - "$id": "docs/spec/v2/span", - "type": "object", - "properties": { - "action": { - "description": "Action holds the specific kind of event within the sub-type represented by the span (e.g. query, connect)", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "child_ids": { - "description": "ChildIDs holds a list of successor transactions and/or spans.", - "type": [ - "null", - "array" - ], - "items": { - "type": "string", - "maxLength": 1024 - }, - "minItems": 0 - }, - "composite": { - "description": "Composite holds details on a group of spans represented by a single one.", - "type": [ - "null", - "object" - ], - "properties": { - "compression_strategy": { - "description": "A string value indicating which compression strategy was used. The valid values are \`exact_match\` and \`same_kind\`.", - "type": "string" - }, - "count": { - "description": "Count is the number of compressed spans the composite span represents. The minimum count is 2, as a composite span represents at least two spans.", - "type": "integer", - "minimum": 2 - }, - "sum": { - "description": "Sum is the durations of all compressed spans this composite span represents in milliseconds.", - "type": "number", - "minimum": 0 - } - }, - "required": [ - "compression_strategy", - "count", - "sum" - ] - }, - "context": { - "description": "Context holds arbitrary contextual information for the event.", - "type": [ - "null", - "object" - ], - "properties": { - "db": { - "description": "Database contains contextual data for database spans", - "type": [ - "null", - "object" - ], - "properties": { - "instance": { - "description": "Instance name of the database.", - "type": [ - "null", - "string" - ] - }, - "link": { - "description": "Link to the database server.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "rows_affected": { - "description": "RowsAffected shows the number of rows affected by the statement.", - "type": [ - "null", - "integer" - ] - }, - "statement": { - "description": "Statement of the recorded database event, e.g. query.", - "type": [ - "null", - "string" - ] - }, - "type": { - "description": "Type of the recorded database event., e.g. sql, cassandra, hbase, redis.", - "type": [ - "null", - "string" - ] - }, - "user": { - "description": "User is the username with which the database is accessed.", - "type": [ - "null", - "string" - ] - } - } - }, - "destination": { - "description": "Destination contains contextual data about the destination of spans", - "type": [ - "null", - "object" - ], - "properties": { - "address": { - "description": "Address is the destination network address: hostname (e.g. 'localhost'), FQDN (e.g. 'elastic.co'), IPv4 (e.g. '127.0.0.1') IPv6 (e.g. '::1')", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "port": { - "description": "Port is the destination network port (e.g. 443)", - "type": [ - "null", - "integer" - ] - }, - "service": { - "description": "Service describes the destination service", - "type": [ - "null", - "object" - ], - "properties": { - "name": { - "description": "Name is the identifier for the destination service, e.g. 'http://elastic.co', 'elasticsearch', 'rabbitmq' ( DEPRECATED: this field will be removed in a future release", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "resource": { - "description": "Resource identifies the destination service resource being operated on e.g. 'http://elastic.co:80', 'elasticsearch', 'rabbitmq/queue_name' DEPRECATED: this field will be removed in a future release", - "type": "string", - "maxLength": 1024 - }, - "type": { - "description": "Type of the destination service, e.g. db, elasticsearch. Should typically be the same as span.type. DEPRECATED: this field will be removed in a future release", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - }, - "required": [ - "resource" - ] - } - } - }, - "http": { - "description": "HTTP contains contextual information when the span concerns an HTTP request.", - "type": [ - "null", - "object" - ], - "properties": { - "method": { - "description": "Method holds information about the method of the HTTP request.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "request": { - "description": "Request describes the HTTP request information.", - "type": [ - "null", - "object" - ], - "properties": { - "id": { - "description": "ID holds the unique identifier for the http request.", - "type": [ - "null", - "string" - ] - } - } - }, - "response": { - "description": "Response describes the HTTP response information in case the event was created as a result of an HTTP request.", - "type": [ - "null", - "object" - ], - "properties": { - "decoded_body_size": { - "description": "DecodedBodySize holds the size of the decoded payload.", - "type": [ - "null", - "integer" - ] - }, - "encoded_body_size": { - "description": "EncodedBodySize holds the size of the encoded payload.", - "type": [ - "null", - "integer" - ] - }, - "headers": { - "description": "Headers holds the http headers sent in the http response.", - "type": [ - "null", - "object" - ], - "additionalProperties": false, - "patternProperties": { - "[.*]*$": { - "type": [ - "null", - "array", - "string" - ], - "items": { - "type": "string" - } - } - } - }, - "status_code": { - "description": "StatusCode sent in the http response.", - "type": [ - "null", - "integer" - ] - }, - "transfer_size": { - "description": "TransferSize holds the total size of the payload.", - "type": [ - "null", - "integer" - ] - } - } - }, - "status_code": { - "description": "Deprecated: Use Response.StatusCode instead. StatusCode sent in the http response.", - "type": [ - "null", - "integer" - ] - }, - "url": { - "description": "URL is the raw url of the correlating HTTP request.", - "type": [ - "null", - "string" - ] - } - } - }, - "message": { - "description": "Message holds details related to message receiving and publishing if the captured event integrates with a messaging system", - "type": [ - "null", - "object" - ], - "properties": { - "age": { - "description": "Age of the message. If the monitored messaging framework provides a timestamp for the message, agents may use it. Otherwise, the sending agent can add a timestamp in milliseconds since the Unix epoch to the message's metadata to be retrieved by the receiving agent. If a timestamp is not available, agents should omit this field.", - "type": [ - "null", - "object" - ], - "properties": { - "ms": { - "description": "Age of the message in milliseconds.", - "type": [ - "null", - "integer" - ] - } - } - }, - "body": { - "description": "Body of the received message, similar to an HTTP request body", - "type": [ - "null", - "string" - ] - }, - "headers": { - "description": "Headers received with the message, similar to HTTP request headers.", - "type": [ - "null", - "object" - ], - "additionalProperties": false, - "patternProperties": { - "[.*]*$": { - "type": [ - "null", - "array", - "string" - ], - "items": { - "type": "string" - } - } - } - }, - "queue": { - "description": "Queue holds information about the message queue where the message is received.", - "type": [ - "null", - "object" - ], - "properties": { - "name": { - "description": "Name holds the name of the message queue where the message is received.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - } - }, - "routing_key": { - "description": "RoutingKey holds the optional routing key of the received message as set on the queuing system, such as in RabbitMQ.", - "type": [ - "null", - "string" - ] - } - } - }, - "service": { - "description": "Service related information can be sent per span. Information provided here will override the more generic information retrieved from metadata, missing service fields will be retrieved from the metadata information.", - "type": [ - "null", - "object" - ], - "properties": { - "agent": { - "description": "Agent holds information about the APM agent capturing the event.", - "type": [ - "null", - "object" - ], - "properties": { - "ephemeral_id": { - "description": "EphemeralID is a free format ID used for metrics correlation by agents", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "name": { - "description": "Name of the APM agent capturing information.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "version": { - "description": "Version of the APM agent capturing information.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - } - }, - "environment": { - "description": "Environment in which the monitored service is running, e.g. \`production\` or \`staging\`.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "framework": { - "description": "Framework holds information about the framework used in the monitored service.", - "type": [ - "null", - "object" - ], - "properties": { - "name": { - "description": "Name of the used framework", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "version": { - "description": "Version of the used framework", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - } - }, - "id": { - "description": "ID holds a unique identifier for the service.", - "type": [ - "null", - "string" - ] - }, - "language": { - "description": "Language holds information about the programming language of the monitored service.", - "type": [ - "null", - "object" - ], - "properties": { - "name": { - "description": "Name of the used programming language", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "version": { - "description": "Version of the used programming language", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - } - }, - "name": { - "description": "Name of the monitored service.", - "type": [ - "null", - "string" - ], - "maxLength": 1024, - "pattern": "^[a-zA-Z0-9 _-]+$" - }, - "node": { - "description": "Node must be a unique meaningful name of the service node.", - "type": [ - "null", - "object" - ], - "properties": { - "configured_name": { - "description": "Name of the service node", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - } - }, - "origin": { - "description": "Origin contains the self-nested field groups for service.", - "type": [ - "null", - "object" - ], - "properties": { - "id": { - "description": "Immutable id of the service emitting this event.", - "type": [ - "null", - "string" - ] - }, - "name": { - "description": "Immutable name of the service emitting this event.", - "type": [ - "null", - "string" - ] - }, - "version": { - "description": "The version of the service the data was collected from.", - "type": [ - "null", - "string" - ] - } - } - }, - "runtime": { - "description": "Runtime holds information about the language runtime running the monitored service", - "type": [ - "null", - "object" - ], - "properties": { - "name": { - "description": "Name of the language runtime", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "version": { - "description": "Version of the language runtime", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - } - }, - "target": { - "description": "Target holds information about the outgoing service in case of an outgoing event", - "type": [ - "null", - "object" - ], - "properties": { - "name": { - "description": "Immutable name of the target service for the event", - "type": [ - "null", - "string" - ] - }, - "type": { - "description": "Immutable type of the target service for the event", - "type": [ - "null", - "string" - ] - } - }, - "anyOf": [ - { - "properties": { - "type": { - "type": "string" - } - }, - "required": [ - "type" - ] - }, - { - "properties": { - "name": { - "type": "string" - } - }, - "required": [ - "name" - ] - } - ] - }, - "version": { - "description": "Version of the monitored service.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - } - }, - "tags": { - "description": "Tags are a flat mapping of user-defined tags. On the agent side, tags are called labels. Allowed value types are string, boolean and number values. Tags are indexed and searchable.", - "type": [ - "null", - "object" - ], - "additionalProperties": { - "type": [ - "null", - "string", - "boolean", - "number" - ], - "maxLength": 1024 - } - } - } - }, - "duration": { - "description": "Duration of the span in milliseconds. When the span is a composite one, duration is the gross duration, including \"whitespace\" in between spans.", - "type": "number", - "minimum": 0 - }, - "id": { - "description": "ID holds the hex encoded 64 random bits ID of the event.", - "type": "string", - "maxLength": 1024 - }, - "links": { - "description": "Links holds links to other spans, potentially in other traces.", - "type": [ - "null", - "array" - ], - "items": { - "type": "object", - "properties": { - "span_id": { - "description": "SpanID holds the ID of the linked span.", - "type": "string", - "maxLength": 1024 - }, - "trace_id": { - "description": "TraceID holds the ID of the linked span's trace.", - "type": "string", - "maxLength": 1024 - } - }, - "required": [ - "span_id", - "trace_id" - ] - }, - "minItems": 0 - }, - "name": { - "description": "Name is the generic designation of a span in the scope of a transaction.", - "type": "string", - "maxLength": 1024 - }, - "otel": { - "description": "OTel contains unmapped OpenTelemetry attributes.", - "type": [ - "null", - "object" - ], - "properties": { - "attributes": { - "description": "Attributes hold the unmapped OpenTelemetry attributes.", - "type": [ - "null", - "object" - ] - }, - "span_kind": { - "description": "SpanKind holds the incoming OpenTelemetry span kind.", - "type": [ - "null", - "string" - ] - } - } - }, - "outcome": { - "description": "Outcome of the span: success, failure, or unknown. Outcome may be one of a limited set of permitted values describing the success or failure of the span. It can be used for calculating error rates for outgoing requests.", - "type": [ - "null", - "string" - ], - "enum": [ - "success", - "failure", - "unknown", - null - ] - }, - "parent_id": { - "description": "ParentID holds the hex encoded 64 random bits ID of the parent transaction or span.", - "type": "string", - "maxLength": 1024 - }, - "sample_rate": { - "description": "SampleRate applied to the monitored service at the time where this span was recorded.", - "type": [ - "null", - "number" - ] - }, - "stacktrace": { - "description": "Stacktrace connected to this span event.", - "type": [ - "null", - "array" - ], - "items": { - "type": "object", - "properties": { - "abs_path": { - "description": "AbsPath is the absolute path of the frame's file.", - "type": [ - "null", - "string" - ] - }, - "classname": { - "description": "Classname of the frame.", - "type": [ - "null", - "string" - ] - }, - "colno": { - "description": "ColumnNumber of the frame.", - "type": [ - "null", - "integer" - ] - }, - "context_line": { - "description": "ContextLine is the line from the frame's file.", - "type": [ - "null", - "string" - ] - }, - "filename": { - "description": "Filename is the relative name of the frame's file.", - "type": [ - "null", - "string" - ] - }, - "function": { - "description": "Function represented by the frame.", - "type": [ - "null", - "string" - ] - }, - "library_frame": { - "description": "LibraryFrame indicates whether the frame is from a third party library.", - "type": [ - "null", - "boolean" - ] - }, - "lineno": { - "description": "LineNumber of the frame.", - "type": [ - "null", - "integer" - ] - }, - "module": { - "description": "Module to which the frame belongs to.", - "type": [ - "null", - "string" - ] - }, - "post_context": { - "description": "PostContext is a slice of code lines immediately before the line from the frame's file.", - "type": [ - "null", - "array" - ], - "items": { - "type": "string" - }, - "minItems": 0 - }, - "pre_context": { - "description": "PreContext is a slice of code lines immediately after the line from the frame's file.", - "type": [ - "null", - "array" - ], - "items": { - "type": "string" - }, - "minItems": 0 - }, - "vars": { - "description": "Vars is a flat mapping of local variables of the frame.", - "type": [ - "null", - "object" - ] - } - }, - "anyOf": [ - { - "properties": { - "classname": { - "type": "string" - } - }, - "required": [ - "classname" - ] - }, - { - "properties": { - "filename": { - "type": "string" - } - }, - "required": [ - "filename" - ] - } - ] - }, - "minItems": 0 - }, - "start": { - "description": "Start is the offset relative to the transaction's timestamp identifying the start of the span, in milliseconds.", - "type": [ - "null", - "number" - ] - }, - "subtype": { - "description": "Subtype is a further sub-division of the type (e.g. postgresql, elasticsearch)", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "sync": { - "description": "Sync indicates whether the span was executed synchronously or asynchronously.", - "type": [ - "null", - "boolean" - ] - }, - "timestamp": { - "description": "Timestamp holds the recorded time of the event, UTC based and formatted as microseconds since Unix epoch", - "type": [ - "null", - "integer" - ] - }, - "trace_id": { - "description": "TraceID holds the hex encoded 128 random bits ID of the correlated trace.", - "type": "string", - "maxLength": 1024 - }, - "transaction_id": { - "description": "TransactionID holds the hex encoded 64 random bits ID of the correlated transaction.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "type": { - "description": "Type holds the span's type, and can have specific keywords within the service's domain (eg: 'request', 'backgroundjob', etc)", - "type": "string", - "maxLength": 1024 - } - }, - "required": [ - "id", - "trace_id", - "name", - "parent_id", - "type", - "duration" - ], - "anyOf": [ - { - "properties": { - "start": { - "type": "number" - } - }, - "required": [ - "start" - ] - }, - { - "properties": { - "timestamp": { - "type": "integer" - } - }, - "required": [ - "timestamp" - ] - } - ] -}` - -<DocCode children={snippet} /> \ No newline at end of file diff --git a/docs/en/serverless/transclusion/apm/guide/spec/v2/transaction.mdx b/docs/en/serverless/transclusion/apm/guide/spec/v2/transaction.mdx deleted file mode 100644 index 610c92fa2a..0000000000 --- a/docs/en/serverless/transclusion/apm/guide/spec/v2/transaction.mdx +++ /dev/null @@ -1,1134 +0,0 @@ -export const snippet = ` -{ - "$id": "docs/spec/v2/transaction", - "type": "object", - "properties": { - "context": { - "description": "Context holds arbitrary contextual information for the event.", - "type": [ - "null", - "object" - ], - "properties": { - "cloud": { - "description": "Cloud holds fields related to the cloud or infrastructure the events are coming from.", - "type": [ - "null", - "object" - ], - "properties": { - "origin": { - "description": "Origin contains the self-nested field groups for cloud.", - "type": [ - "null", - "object" - ], - "properties": { - "account": { - "description": "The cloud account or organization id used to identify different entities in a multi-tenant environment.", - "type": [ - "null", - "object" - ], - "properties": { - "id": { - "description": "The cloud account or organization id used to identify different entities in a multi-tenant environment.", - "type": [ - "null", - "string" - ] - } - } - }, - "provider": { - "description": "Name of the cloud provider.", - "type": [ - "null", - "string" - ] - }, - "region": { - "description": "Region in which this host, resource, or service is located.", - "type": [ - "null", - "string" - ] - }, - "service": { - "description": "The cloud service name is intended to distinguish services running on different platforms within a provider.", - "type": [ - "null", - "object" - ], - "properties": { - "name": { - "description": "The cloud service name is intended to distinguish services running on different platforms within a provider.", - "type": [ - "null", - "string" - ] - } - } - } - } - } - } - }, - "custom": { - "description": "Custom can contain additional metadata to be stored with the event. The format is unspecified and can be deeply nested objects. The information will not be indexed or searchable in Elasticsearch.", - "type": [ - "null", - "object" - ] - }, - "message": { - "description": "Message holds details related to message receiving and publishing if the captured event integrates with a messaging system", - "type": [ - "null", - "object" - ], - "properties": { - "age": { - "description": "Age of the message. If the monitored messaging framework provides a timestamp for the message, agents may use it. Otherwise, the sending agent can add a timestamp in milliseconds since the Unix epoch to the message's metadata to be retrieved by the receiving agent. If a timestamp is not available, agents should omit this field.", - "type": [ - "null", - "object" - ], - "properties": { - "ms": { - "description": "Age of the message in milliseconds.", - "type": [ - "null", - "integer" - ] - } - } - }, - "body": { - "description": "Body of the received message, similar to an HTTP request body", - "type": [ - "null", - "string" - ] - }, - "headers": { - "description": "Headers received with the message, similar to HTTP request headers.", - "type": [ - "null", - "object" - ], - "additionalProperties": false, - "patternProperties": { - "[.*]*$": { - "type": [ - "null", - "array", - "string" - ], - "items": { - "type": "string" - } - } - } - }, - "queue": { - "description": "Queue holds information about the message queue where the message is received.", - "type": [ - "null", - "object" - ], - "properties": { - "name": { - "description": "Name holds the name of the message queue where the message is received.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - } - }, - "routing_key": { - "description": "RoutingKey holds the optional routing key of the received message as set on the queuing system, such as in RabbitMQ.", - "type": [ - "null", - "string" - ] - } - } - }, - "page": { - "description": "Page holds information related to the current page and page referers. It is only sent from RUM agents.", - "type": [ - "null", - "object" - ], - "properties": { - "referer": { - "description": "Referer holds the URL of the page that 'linked' to the current page.", - "type": [ - "null", - "string" - ] - }, - "url": { - "description": "URL of the current page", - "type": [ - "null", - "string" - ] - } - } - }, - "request": { - "description": "Request describes the HTTP request information in case the event was created as a result of an HTTP request.", - "type": [ - "null", - "object" - ], - "properties": { - "body": { - "description": "Body only contais the request bod, not the query string information. It can either be a dictionary (for standard HTTP requests) or a raw request body.", - "type": [ - "null", - "string", - "object" - ] - }, - "cookies": { - "description": "Cookies used by the request, parsed as key-value objects.", - "type": [ - "null", - "object" - ] - }, - "env": { - "description": "Env holds environment variable information passed to the monitored service.", - "type": [ - "null", - "object" - ] - }, - "headers": { - "description": "Headers includes any HTTP headers sent by the requester. Cookies will be taken by headers if supplied.", - "type": [ - "null", - "object" - ], - "additionalProperties": false, - "patternProperties": { - "[.*]*$": { - "type": [ - "null", - "array", - "string" - ], - "items": { - "type": "string" - } - } - } - }, - "http_version": { - "description": "HTTPVersion holds information about the used HTTP version.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "method": { - "description": "Method holds information about the method of the HTTP request.", - "type": "string", - "maxLength": 1024 - }, - "socket": { - "description": "Socket holds information related to the recorded request, such as whether or not data were encrypted and the remote address.", - "type": [ - "null", - "object" - ], - "properties": { - "encrypted": { - "description": "Encrypted indicates whether a request was sent as TLS/HTTPS request. DEPRECATED: this field will be removed in a future release.", - "type": [ - "null", - "boolean" - ] - }, - "remote_address": { - "description": "RemoteAddress holds the network address sending the request. It should be obtained through standard APIs and not be parsed from any headers like 'Forwarded'.", - "type": [ - "null", - "string" - ] - } - } - }, - "url": { - "description": "URL holds information sucha as the raw URL, scheme, host and path.", - "type": [ - "null", - "object" - ], - "properties": { - "full": { - "description": "Full, possibly agent-assembled URL of the request, e.g. https://example.com:443/search?q=elasticsearch#top.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "hash": { - "description": "Hash of the request URL, e.g. 'top'", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "hostname": { - "description": "Hostname information of the request, e.g. 'example.com'.\"", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "pathname": { - "description": "Path of the request, e.g. '/search'", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "port": { - "description": "Port of the request, e.g. '443'. Can be sent as string or int.", - "type": [ - "null", - "string", - "integer" - ], - "maxLength": 1024 - }, - "protocol": { - "description": "Protocol information for the recorded request, e.g. 'https:'.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "raw": { - "description": "Raw unparsed URL of the HTTP request line, e.g https://example.com:443/search?q=elasticsearch. This URL may be absolute or relative. For more details, see https://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html#sec5.1.2.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "search": { - "description": "Search contains the query string information of the request. It is expected to have values delimited by ampersands.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - } - } - }, - "required": [ - "method" - ] - }, - "response": { - "description": "Response describes the HTTP response information in case the event was created as a result of an HTTP request.", - "type": [ - "null", - "object" - ], - "properties": { - "decoded_body_size": { - "description": "DecodedBodySize holds the size of the decoded payload.", - "type": [ - "null", - "integer" - ] - }, - "encoded_body_size": { - "description": "EncodedBodySize holds the size of the encoded payload.", - "type": [ - "null", - "integer" - ] - }, - "finished": { - "description": "Finished indicates whether the response was finished or not.", - "type": [ - "null", - "boolean" - ] - }, - "headers": { - "description": "Headers holds the http headers sent in the http response.", - "type": [ - "null", - "object" - ], - "additionalProperties": false, - "patternProperties": { - "[.*]*$": { - "type": [ - "null", - "array", - "string" - ], - "items": { - "type": "string" - } - } - } - }, - "headers_sent": { - "description": "HeadersSent indicates whether http headers were sent.", - "type": [ - "null", - "boolean" - ] - }, - "status_code": { - "description": "StatusCode sent in the http response.", - "type": [ - "null", - "integer" - ] - }, - "transfer_size": { - "description": "TransferSize holds the total size of the payload.", - "type": [ - "null", - "integer" - ] - } - } - }, - "service": { - "description": "Service related information can be sent per event. Information provided here will override the more generic information retrieved from metadata, missing service fields will be retrieved from the metadata information.", - "type": [ - "null", - "object" - ], - "properties": { - "agent": { - "description": "Agent holds information about the APM agent capturing the event.", - "type": [ - "null", - "object" - ], - "properties": { - "ephemeral_id": { - "description": "EphemeralID is a free format ID used for metrics correlation by agents", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "name": { - "description": "Name of the APM agent capturing information.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "version": { - "description": "Version of the APM agent capturing information.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - } - }, - "environment": { - "description": "Environment in which the monitored service is running, e.g. \`production\` or \`staging\`.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "framework": { - "description": "Framework holds information about the framework used in the monitored service.", - "type": [ - "null", - "object" - ], - "properties": { - "name": { - "description": "Name of the used framework", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "version": { - "description": "Version of the used framework", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - } - }, - "id": { - "description": "ID holds a unique identifier for the service.", - "type": [ - "null", - "string" - ] - }, - "language": { - "description": "Language holds information about the programming language of the monitored service.", - "type": [ - "null", - "object" - ], - "properties": { - "name": { - "description": "Name of the used programming language", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "version": { - "description": "Version of the used programming language", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - } - }, - "name": { - "description": "Name of the monitored service.", - "type": [ - "null", - "string" - ], - "maxLength": 1024, - "pattern": "^[a-zA-Z0-9 _-]+$" - }, - "node": { - "description": "Node must be a unique meaningful name of the service node.", - "type": [ - "null", - "object" - ], - "properties": { - "configured_name": { - "description": "Name of the service node", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - } - }, - "origin": { - "description": "Origin contains the self-nested field groups for service.", - "type": [ - "null", - "object" - ], - "properties": { - "id": { - "description": "Immutable id of the service emitting this event.", - "type": [ - "null", - "string" - ] - }, - "name": { - "description": "Immutable name of the service emitting this event.", - "type": [ - "null", - "string" - ] - }, - "version": { - "description": "The version of the service the data was collected from.", - "type": [ - "null", - "string" - ] - } - } - }, - "runtime": { - "description": "Runtime holds information about the language runtime running the monitored service", - "type": [ - "null", - "object" - ], - "properties": { - "name": { - "description": "Name of the language runtime", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "version": { - "description": "Version of the language runtime", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - } - }, - "target": { - "description": "Target holds information about the outgoing service in case of an outgoing event", - "type": [ - "null", - "object" - ], - "properties": { - "name": { - "description": "Immutable name of the target service for the event", - "type": [ - "null", - "string" - ] - }, - "type": { - "description": "Immutable type of the target service for the event", - "type": [ - "null", - "string" - ] - } - }, - "anyOf": [ - { - "properties": { - "type": { - "type": "string" - } - }, - "required": [ - "type" - ] - }, - { - "properties": { - "name": { - "type": "string" - } - }, - "required": [ - "name" - ] - } - ] - }, - "version": { - "description": "Version of the monitored service.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - } - }, - "tags": { - "description": "Tags are a flat mapping of user-defined tags. On the agent side, tags are called labels. Allowed value types are string, boolean and number values. Tags are indexed and searchable.", - "type": [ - "null", - "object" - ], - "additionalProperties": { - "type": [ - "null", - "string", - "boolean", - "number" - ], - "maxLength": 1024 - } - }, - "user": { - "description": "User holds information about the correlated user for this event. If user data are provided here, all user related information from metadata is ignored, otherwise the metadata's user information will be stored with the event.", - "type": [ - "null", - "object" - ], - "properties": { - "domain": { - "description": "Domain of the logged in user", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "email": { - "description": "Email of the user.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "id": { - "description": "ID identifies the logged in user, e.g. can be the primary key of the user", - "type": [ - "null", - "string", - "integer" - ], - "maxLength": 1024 - }, - "username": { - "description": "Name of the user.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - } - } - } - } - }, - "dropped_spans_stats": { - "description": "DroppedSpanStats holds information about spans that were dropped (for example due to transaction_max_spans or exit_span_min_duration).", - "type": [ - "null", - "array" - ], - "items": { - "type": "object", - "properties": { - "destination_service_resource": { - "description": "DestinationServiceResource identifies the destination service resource being operated on. e.g. 'http://elastic.co:80', 'elasticsearch', 'rabbitmq/queue_name'.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "duration": { - "description": "Duration holds duration aggregations about the dropped span.", - "type": [ - "null", - "object" - ], - "properties": { - "count": { - "description": "Count holds the number of times the dropped span happened.", - "type": [ - "null", - "integer" - ], - "minimum": 1 - }, - "sum": { - "description": "Sum holds dimensions about the dropped span's duration.", - "type": [ - "null", - "object" - ], - "properties": { - "us": { - "description": "Us represents the summation of the span duration.", - "type": [ - "null", - "integer" - ], - "minimum": 0 - } - } - } - } - }, - "outcome": { - "description": "Outcome of the span: success, failure, or unknown. Outcome may be one of a limited set of permitted values describing the success or failure of the span. It can be used for calculating error rates for outgoing requests.", - "type": [ - "null", - "string" - ], - "enum": [ - "success", - "failure", - "unknown", - null - ] - }, - "service_target_name": { - "description": "ServiceTargetName identifies the instance name of the target service being operated on", - "type": [ - "null", - "string" - ], - "maxLength": 512 - }, - "service_target_type": { - "description": "ServiceTargetType identifies the type of the target service being operated on e.g. 'oracle', 'rabbitmq'", - "type": [ - "null", - "string" - ], - "maxLength": 512 - } - } - }, - "minItems": 0 - }, - "duration": { - "description": "Duration how long the transaction took to complete, in milliseconds with 3 decimal points.", - "type": "number", - "minimum": 0 - }, - "experience": { - "description": "UserExperience holds metrics for measuring real user experience. This information is only sent by RUM agents.", - "type": [ - "null", - "object" - ], - "properties": { - "cls": { - "description": "CumulativeLayoutShift holds the Cumulative Layout Shift (CLS) metric value, or a negative value if CLS is unknown. See https://web.dev/cls/", - "type": [ - "null", - "number" - ], - "minimum": 0 - }, - "fid": { - "description": "FirstInputDelay holds the First Input Delay (FID) metric value, or a negative value if FID is unknown. See https://web.dev/fid/", - "type": [ - "null", - "number" - ], - "minimum": 0 - }, - "longtask": { - "description": "Longtask holds longtask duration/count metrics.", - "type": [ - "null", - "object" - ], - "properties": { - "count": { - "description": "Count is the total number of of longtasks.", - "type": "integer", - "minimum": 0 - }, - "max": { - "description": "Max longtask duration", - "type": "number", - "minimum": 0 - }, - "sum": { - "description": "Sum of longtask durations", - "type": "number", - "minimum": 0 - } - }, - "required": [ - "count", - "max", - "sum" - ] - }, - "tbt": { - "description": "TotalBlockingTime holds the Total Blocking Time (TBT) metric value, or a negative value if TBT is unknown. See https://web.dev/tbt/", - "type": [ - "null", - "number" - ], - "minimum": 0 - } - } - }, - "faas": { - "description": "FAAS holds fields related to Function as a Service events.", - "type": [ - "null", - "object" - ], - "properties": { - "coldstart": { - "description": "Indicates whether a function invocation was a cold start or not.", - "type": [ - "null", - "boolean" - ] - }, - "execution": { - "description": "The request id of the function invocation.", - "type": [ - "null", - "string" - ] - }, - "id": { - "description": "A unique identifier of the invoked serverless function.", - "type": [ - "null", - "string" - ] - }, - "name": { - "description": "The lambda function name.", - "type": [ - "null", - "string" - ] - }, - "trigger": { - "description": "Trigger attributes.", - "type": [ - "null", - "object" - ], - "properties": { - "request_id": { - "description": "The id of the origin trigger request.", - "type": [ - "null", - "string" - ] - }, - "type": { - "description": "The trigger type.", - "type": [ - "null", - "string" - ] - } - } - }, - "version": { - "description": "The lambda function version.", - "type": [ - "null", - "string" - ] - } - } - }, - "id": { - "description": "ID holds the hex encoded 64 random bits ID of the event.", - "type": "string", - "maxLength": 1024 - }, - "links": { - "description": "Links holds links to other spans, potentially in other traces.", - "type": [ - "null", - "array" - ], - "items": { - "type": "object", - "properties": { - "span_id": { - "description": "SpanID holds the ID of the linked span.", - "type": "string", - "maxLength": 1024 - }, - "trace_id": { - "description": "TraceID holds the ID of the linked span's trace.", - "type": "string", - "maxLength": 1024 - } - }, - "required": [ - "span_id", - "trace_id" - ] - }, - "minItems": 0 - }, - "marks": { - "description": "Marks capture the timing of a significant event during the lifetime of a transaction. Marks are organized into groups and can be set by the user or the agent. Marks are only reported by RUM agents.", - "type": [ - "null", - "object" - ], - "additionalProperties": { - "type": [ - "null", - "object" - ], - "additionalProperties": { - "type": [ - "null", - "number" - ] - } - } - }, - "name": { - "description": "Name is the generic designation of a transaction in the scope of a single service, eg: 'GET /users/:id'.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "otel": { - "description": "OTel contains unmapped OpenTelemetry attributes.", - "type": [ - "null", - "object" - ], - "properties": { - "attributes": { - "description": "Attributes hold the unmapped OpenTelemetry attributes.", - "type": [ - "null", - "object" - ] - }, - "span_kind": { - "description": "SpanKind holds the incoming OpenTelemetry span kind.", - "type": [ - "null", - "string" - ] - } - } - }, - "outcome": { - "description": "Outcome of the transaction with a limited set of permitted values, describing the success or failure of the transaction from the service's perspective. It is used for calculating error rates for incoming requests. Permitted values: success, failure, unknown.", - "type": [ - "null", - "string" - ], - "enum": [ - "success", - "failure", - "unknown", - null - ] - }, - "parent_id": { - "description": "ParentID holds the hex encoded 64 random bits ID of the parent transaction or span.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "result": { - "description": "Result of the transaction. For HTTP-related transactions, this should be the status code formatted like 'HTTP 2xx'.", - "type": [ - "null", - "string" - ], - "maxLength": 1024 - }, - "sample_rate": { - "description": "SampleRate applied to the monitored service at the time where this transaction was recorded. Allowed values are [0..1]. A SampleRate \u003c1 indicates that not all spans are recorded.", - "type": [ - "null", - "number" - ] - }, - "sampled": { - "description": "Sampled indicates whether or not the full information for a transaction is captured. If a transaction is unsampled no spans and less context information will be reported.", - "type": [ - "null", - "boolean" - ] - }, - "session": { - "description": "Session holds optional transaction session information for RUM.", - "type": [ - "null", - "object" - ], - "properties": { - "id": { - "description": "ID holds a session ID for grouping a set of related transactions.", - "type": "string", - "maxLength": 1024 - }, - "sequence": { - "description": "Sequence holds an optional sequence number for a transaction within a session. It is not meaningful to compare sequences across two different sessions.", - "type": [ - "null", - "integer" - ], - "minimum": 1 - } - }, - "required": [ - "id" - ] - }, - "span_count": { - "description": "SpanCount counts correlated spans.", - "type": "object", - "properties": { - "dropped": { - "description": "Dropped is the number of correlated spans that have been dropped by the APM agent recording the transaction.", - "type": [ - "null", - "integer" - ] - }, - "started": { - "description": "Started is the number of correlated spans that are recorded.", - "type": "integer" - } - }, - "required": [ - "started" - ] - }, - "timestamp": { - "description": "Timestamp holds the recorded time of the event, UTC based and formatted as microseconds since Unix epoch", - "type": [ - "null", - "integer" - ] - }, - "trace_id": { - "description": "TraceID holds the hex encoded 128 random bits ID of the correlated trace.", - "type": "string", - "maxLength": 1024 - }, - "type": { - "description": "Type expresses the transaction's type as keyword that has specific relevance within the service's domain, eg: 'request', 'backgroundjob'.", - "type": "string", - "maxLength": 1024 - } - }, - "required": [ - "trace_id", - "id", - "type", - "span_count", - "duration" - ] -}` - -<DocCode children={snippet} /> \ No newline at end of file diff --git a/docs/en/serverless/transclusion/fleet/tab-widgets/download/deb.asciidoc b/docs/en/serverless/transclusion/fleet/tab-widgets/download/deb.asciidoc index f3ee330026..2cb5941d9e 100644 --- a/docs/en/serverless/transclusion/fleet/tab-widgets/download/deb.asciidoc +++ b/docs/en/serverless/transclusion/fleet/tab-widgets/download/deb.asciidoc @@ -4,7 +4,7 @@ To simplify upgrading to future versions of {agent}, we recommended that you use the tarball distribution instead of the DEB distribution. ==== -[source,sh,subs="attributes+"] +[source,sh,subs="attributes"] ---- curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-{version}-amd64.deb sudo dpkg -i elastic-agent-{version}-amd64.deb diff --git a/docs/en/serverless/transclusion/fleet/tab-widgets/download/linux.asciidoc b/docs/en/serverless/transclusion/fleet/tab-widgets/download/linux.asciidoc index 91e04b6e50..2aa1d9f64f 100644 --- a/docs/en/serverless/transclusion/fleet/tab-widgets/download/linux.asciidoc +++ b/docs/en/serverless/transclusion/fleet/tab-widgets/download/linux.asciidoc @@ -1,4 +1,4 @@ -[source,sh,subs="attributes+"] +[source,sh,subs="attributes"] ---- curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-{version}-linux-x86_64.tar.gz tar xzvf elastic-agent-{version}-linux-x86_64.tar.gz diff --git a/docs/en/serverless/transclusion/fleet/tab-widgets/download/mac.asciidoc b/docs/en/serverless/transclusion/fleet/tab-widgets/download/mac.asciidoc index 9c394c3865..cb35bcf2e2 100644 --- a/docs/en/serverless/transclusion/fleet/tab-widgets/download/mac.asciidoc +++ b/docs/en/serverless/transclusion/fleet/tab-widgets/download/mac.asciidoc @@ -1,4 +1,4 @@ -[source,sh,subs="attributes+"] +[source,sh,subs="attributes"] ---- curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-{version}-darwin-x86_64.tar.gz tar xzvf elastic-agent-{version}-darwin-x86_64.tar.gz diff --git a/docs/en/serverless/transclusion/fleet/tab-widgets/download/rpm.asciidoc b/docs/en/serverless/transclusion/fleet/tab-widgets/download/rpm.asciidoc index ca4be02f40..582ef6f24f 100644 --- a/docs/en/serverless/transclusion/fleet/tab-widgets/download/rpm.asciidoc +++ b/docs/en/serverless/transclusion/fleet/tab-widgets/download/rpm.asciidoc @@ -4,7 +4,7 @@ To simplify upgrading to future versions of {agent}, we recommended that you use the tarball distribution instead of the RPM distribution. ==== -[source,sh,subs="attributes+"] +[source,sh,subs="attributes"] ---- curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-{version}-x86_64.rpm sudo rpm -vi elastic-agent-{version}-x86_64.rpm diff --git a/docs/en/serverless/transclusion/fleet/tab-widgets/download/win.asciidoc b/docs/en/serverless/transclusion/fleet/tab-widgets/download/win.asciidoc index 0d04a864f1..3ba14841ce 100644 --- a/docs/en/serverless/transclusion/fleet/tab-widgets/download/win.asciidoc +++ b/docs/en/serverless/transclusion/fleet/tab-widgets/download/win.asciidoc @@ -1,4 +1,4 @@ -[source,powershell,subs="attributes+"] +[source,powershell,subs="attributes"] ---- # PowerShell 5.0+ wget https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-{version}-windows-x86_64.zip -OutFile elastic-agent-{version}-windows-x86_64.zip diff --git a/docs/en/serverless/transclusion/host-details.asciidoc b/docs/en/serverless/transclusion/host-details.asciidoc index 59147da7b1..a90ff49a66 100644 --- a/docs/en/serverless/transclusion/host-details.asciidoc +++ b/docs/en/serverless/transclusion/host-details.asciidoc @@ -125,4 +125,45 @@ You can also select **Actions** → **Show in Inventory** to view the host Inven image::images/anomalies-overlay.png[Anomalies] ===== -// TODO: Find out if OSQuery tab will be included in serverless. It does not currently appear in serverless builds +.Osquery +[%collapsible] +===== +.Required role +[NOTE] +==== +One of the following roles is required to use Osquery. + +* **Admin:** Has full access to project configuration, including the ability to install, manage, and run Osquery queries through {agent}. This role supports both ad hoc (live) queries and scheduled queries against monitored hosts. Admins can view and analyze the results directly in {es}. +* **Editor:** Has limited access. Editors can run pre-configured queries, but may have restricted permissions for setting up and scheduling new queries, especially queries that require broader access or permissions adjustments. +* **Viewer**: Has read-only access to data, including viewing Osquery results if configured by a user with higher permissions. Viewers cannot initiate or schedule Osquery queries themselves. + +To learn more about roles, refer to <<general-assign-user-roles>>. +==== + +[IMPORTANT] +==== +You must have an active {fleet-guide}/elastic-agent-installation.html[{agent}] with an assigned agent policy +that includes the {integrations-docs}/osquery_manager.html[Osquery Manager] integration. +==== + +The **Osquery** tab allows you to build SQL statements to query your host data. +You can create and run live or saved queries against +the {agent}. Osquery results are stored in {es} +so that you can use the {stack} to search, analyze, and +visualize your host metrics. To create saved queries and add scheduled query groups, +refer to {kibana-ref}/osquery.html[Osquery]. + +To view more information about the query, click the **Status** tab. A query status can result in +`success`, `error` (along with an error message), or `pending` (if the {agent} is offline). + +Other options include: + +* View in Discover to search, filter, and view information about the structure of host metric fields. To learn more, refer to {kibana-ref}/discover.html[Discover]. +* View in Lens to create visualizations based on your host metric fields. To learn more, refer to {kibana-ref}/lens.html[Lens]. +* View the results in full screen mode. +* Add, remove, reorder, and resize columns. +* Sort field names in ascending or descending order. + +[role="screenshot"] +image::images/osquery-overlay.png[Osquery] +===== diff --git a/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/deb.asciidoc b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/deb.asciidoc index e6af91eefe..1dd30d828c 100644 --- a/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/deb.asciidoc +++ b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/deb.asciidoc @@ -1,4 +1,4 @@ -[source,sh,subs="attributes+"] +[source,sh,subs="attributes"] ---- curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-{version}-amd64.deb sudo dpkg -i filebeat-{version}-amd64.deb diff --git a/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/linux.asciidoc b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/linux.asciidoc index 1199dc6e7a..55a692da75 100644 --- a/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/linux.asciidoc +++ b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/linux.asciidoc @@ -1,4 +1,4 @@ -[source,sh,subs="attributes+"] +[source,sh,subs="attributes"] ---- curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-{version}-linux-x86_64.tar.gz tar xzvf filebeat-{version}-linux-x86_64.tar.gz diff --git a/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/macos.asciidoc b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/macos.asciidoc index f52b3e9d3b..6a671e1603 100644 --- a/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/macos.asciidoc +++ b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/macos.asciidoc @@ -1,4 +1,4 @@ -[source,sh,subs="attributes+"] +[source,sh,subs="attributes"] ---- curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-{version}-darwin-x86_64.tar.gz tar xzvf filebeat-{version}-darwin-x86_64.tar.gz diff --git a/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/rpm.asciidoc b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/rpm.asciidoc index 6a895c371a..192a3f7fb7 100644 --- a/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/rpm.asciidoc +++ b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/rpm.asciidoc @@ -1,4 +1,4 @@ -[source,sh,subs="attributes+"] +[source,sh,subs="attributes"] ---- curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-{version}-x86_64.rpm sudo rpm -vi filebeat-{version}-x86_64.rpm diff --git a/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/windows.asciidoc b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/windows.asciidoc index 5d3e9438ea..9692bdf594 100644 --- a/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/windows.asciidoc +++ b/docs/en/serverless/transclusion/observability/tab-widgets/filebeat-install/content/windows.asciidoc @@ -6,7 +6,7 @@ and select **Run As Administrator**). . From the PowerShell prompt, run the following commands to install {filebeat} as a Windows service: + -[source,powershell,subs="attributes+"] +[source,powershell,subs="attributes"] ---- PS > cd 'C:\Program Files\{filebeat}' PS C:\Program Files\{filebeat}> .\install-service-filebeat.ps1 diff --git a/docs/en/serverless/transclusion/synthetics/reference/lightweight-config/common.mdx b/docs/en/serverless/transclusion/synthetics/reference/lightweight-config/common.mdx index 2a860da346..93334bb933 100644 --- a/docs/en/serverless/transclusion/synthetics/reference/lightweight-config/common.mdx +++ b/docs/en/serverless/transclusion/synthetics/reference/lightweight-config/common.mdx @@ -48,7 +48,7 @@ </DocRow> <DocRow> <DocCell> - <span id="monitor-name">**`name`**</span><br /> + <span id="common-monitor-name">**`name`**</span><br /> (<DocLink slug="/serverless/observability/synthetics-lightweight" section="string">string</DocLink>) </DocCell> <DocCell> @@ -130,7 +130,7 @@ </DocRow> <DocRow> <DocCell> - <span id="monitor-tags">**`tags`**</span><br /> + <span id="common-monitor-tags">**`tags`**</span><br /> (list of <DocLink slug="/serverless/observability/synthetics-lightweight" section="string">string</DocLink>s) </DocCell> <DocCell> From ade463c740edca88eabe0165ab13a8242a728513 Mon Sep 17 00:00:00 2001 From: Colleen McGinnis <colleen.mcginnis@elastic.co> Date: Mon, 4 Nov 2024 10:40:27 -0600 Subject: [PATCH 08/13] restructure index --- docs/en/serverless/index.asciidoc | 303 +++++++++++++++--------------- 1 file changed, 155 insertions(+), 148 deletions(-) diff --git a/docs/en/serverless/index.asciidoc b/docs/en/serverless/index.asciidoc index df5cba60a0..a3f8a48933 100644 --- a/docs/en/serverless/index.asciidoc +++ b/docs/en/serverless/index.asciidoc @@ -3,151 +3,158 @@ include::{docs-root}/shared/versions/stack/{source_branch}.asciidoc[] include::{docs-root}/shared/attributes.asciidoc[] -= Elastic Observability - -include::./observability-overview.asciidoc[leveloffset=+1] - -include::./quickstarts/overview.asciidoc[leveloffset=+1] -include::./quickstarts/monitor-hosts-with-elastic-agent.asciidoc[leveloffset=+2] -include::./quickstarts/k8s-logs-metrics.asciidoc[leveloffset=+2] - -include::./projects/billing.asciidoc[leveloffset=+1] - -include::./projects/create-an-observability-project.asciidoc[leveloffset=+1] - -include::./logging/log-monitoring.asciidoc[leveloffset=+1] -include::./logging/get-started-with-logs.asciidoc[leveloffset=+2] -include::./logging/stream-log-files.asciidoc[leveloffset=+2] -include::./logging/correlate-application-logs.asciidoc[leveloffset=+2] -include::./logging/plaintext-application-logs.asciidoc[leveloffset=+3] -include::./logging/ecs-application-logs.asciidoc[leveloffset=+3] -include::./logging/send-application-logs.asciidoc[leveloffset=+3] -include::./logging/parse-log-data.asciidoc[leveloffset=+2] -include::./logging/filter-and-aggregate-logs.asciidoc[leveloffset=+2] -include::./logging/view-and-monitor-logs.asciidoc[leveloffset=+2] -include::./logging/add-logs-service-name.asciidoc[leveloffset=+2] -include::./logging/run-log-pattern-analysis.asciidoc[leveloffset=+2] -include::./logging/troubleshoot-logs.asciidoc[leveloffset=+2] - -include::./inventory.asciidoc[leveloffset=+1] - -include::./apm/apm.asciidoc[leveloffset=+1] -include::./apm/apm-get-started.asciidoc[leveloffset=+2] -include::./apm/apm-send-traces-to-elastic.asciidoc[leveloffset=+2] -include::./apm-agents/apm-agents-elastic-apm-agents.asciidoc[leveloffset=+3] -include::./apm-agents/apm-agents-opentelemetry.asciidoc[leveloffset=+3] -include::./apm-agents/apm-agents-opentelemetry-opentelemetry-native-support.asciidoc[leveloffset=+4] -include::./apm-agents/apm-agents-opentelemetry-collect-metrics.asciidoc[leveloffset=+4] -include::./apm-agents/apm-agents-opentelemetry-limitations.asciidoc[leveloffset=+4] -include::./apm-agents/apm-agents-opentelemetry-resource-attributes.asciidoc[leveloffset=+4] -include::./apm-agents/apm-agents-aws-lambda-functions.asciidoc[leveloffset=+3] -include::./apm/apm-view-and-analyze-traces.asciidoc[leveloffset=+2] -include::./apm/apm-find-transaction-latency-and-failure-correlations.asciidoc[leveloffset=+3] -include::./apm/apm-integrate-with-machine-learning.asciidoc[leveloffset=+3] -include::./apm/apm-create-custom-links.asciidoc[leveloffset=+3] -include::./apm/apm-track-deployments-with-annotations.asciidoc[leveloffset=+3] -include::./apm/apm-query-your-data.asciidoc[leveloffset=+3] -include::./apm/apm-filter-your-data.asciidoc[leveloffset=+3] -include::./apm/apm-observe-lambda-functions.asciidoc[leveloffset=+3] -include::./apm/apm-ui-overview.asciidoc[leveloffset=+3] -include::./apm/apm-ui-services.asciidoc[leveloffset=+4] -include::./apm/apm-ui-traces.asciidoc[leveloffset=+4] -include::./apm/apm-ui-dependencies.asciidoc[leveloffset=+4] -include::./apm/apm-ui-service-map.asciidoc[leveloffset=+4] -include::./apm/apm-ui-service-overview.asciidoc[leveloffset=+4] -include::./apm/apm-ui-transactions.asciidoc[leveloffset=+4] -include::./apm/apm-ui-trace-sample-timeline.asciidoc[leveloffset=+4] -include::./apm/apm-ui-errors.asciidoc[leveloffset=+4] -include::./apm/apm-ui-metrics.asciidoc[leveloffset=+4] -include::./apm/apm-ui-infrastructure.asciidoc[leveloffset=+4] -include::./apm/apm-ui-logs.asciidoc[leveloffset=+4] -include::./apm/apm-data-types.asciidoc[leveloffset=+2] -include::./apm/apm-distributed-tracing.asciidoc[leveloffset=+2] -include::./apm/apm-reduce-your-data-usage.asciidoc[leveloffset=+2] -include::./apm/apm-transaction-sampling.asciidoc[leveloffset=+3] -include::./apm/apm-compress-spans.asciidoc[leveloffset=+3] -include::./apm/apm-stacktrace-collection.asciidoc[leveloffset=+3] -include::./apm/apm-keep-data-secure.asciidoc[leveloffset=+2] -include::./apm/apm-troubleshooting.asciidoc[leveloffset=+2] -include::./apm/apm-reference.asciidoc[leveloffset=+2] -include::./apm/apm-kibana-settings.asciidoc[leveloffset=+3] -include::./apm/apm-server-api.asciidoc[leveloffset=+3] - -include::./infra-monitoring/infra-monitoring.asciidoc[leveloffset=+1] -include::./infra-monitoring/get-started-with-metrics.asciidoc[leveloffset=+2] -include::./infra-monitoring/view-infrastructure-metrics.asciidoc[leveloffset=+2] -include::./infra-monitoring/analyze-hosts.asciidoc[leveloffset=+2] -include::./infra-monitoring/detect-metric-anomalies.asciidoc[leveloffset=+2] -include::./infra-monitoring/configure-infra-settings.asciidoc[leveloffset=+2] -include::./infra-monitoring/troubleshooting-infra.asciidoc[leveloffset=+2] -include::./infra-monitoring/handle-no-results-found-message.asciidoc[leveloffset=+3] -include::./infra-monitoring/metrics-reference.asciidoc[leveloffset=+2] -include::./infra-monitoring/host-metrics.asciidoc[leveloffset=+3] -include::./infra-monitoring/container-metrics.asciidoc[leveloffset=+3] -include::./infra-monitoring/kubernetes-pod-metrics.asciidoc[leveloffset=+3] -include::./infra-monitoring/aws-metrics.asciidoc[leveloffset=+3] -include::./infra-monitoring/metrics-app-fields.asciidoc[leveloffset=+2] - -include::./synthetics/synthetics-intro.asciidoc[leveloffset=+1] -include::./synthetics/synthetics-get-started.asciidoc[leveloffset=+2] -include::./synthetics/synthetics-get-started-project.asciidoc[leveloffset=+3] -include::./synthetics/synthetics-get-started-ui.asciidoc[leveloffset=+3] -include::./synthetics/synthetics-journeys.asciidoc[leveloffset=+2] -include::./synthetics/synthetics-create-test.asciidoc[leveloffset=+3] -include::./synthetics/synthetics-monitor-use.asciidoc[leveloffset=+3] -include::./synthetics/synthetics-recorder.asciidoc[leveloffset=+3] -include::./synthetics/synthetics-lightweight.asciidoc[leveloffset=+2] -include::./synthetics/synthetics-manage-monitors.asciidoc[leveloffset=+2] -include::./synthetics/synthetics-params-secrets.asciidoc[leveloffset=+2] -include::./synthetics/synthetics-analyze.asciidoc[leveloffset=+2] -include::./synthetics/synthetics-private-location.asciidoc[leveloffset=+2] -include::./synthetics/synthetics-command-reference.asciidoc[leveloffset=+2] -include::./synthetics/synthetics-configuration.asciidoc[leveloffset=+2] -include::./synthetics/synthetics-settings.asciidoc[leveloffset=+2] -include::./synthetics/synthetics-feature-roles.asciidoc[leveloffset=+2] -include::./synthetics/synthetics-manage-retention.asciidoc[leveloffset=+2] -include::./synthetics/synthetics-scale-and-architect.asciidoc[leveloffset=+2] -include::./synthetics/synthetics-security-encryption.asciidoc[leveloffset=+2] -include::./synthetics/synthetics-troubleshooting.asciidoc[leveloffset=+2] - -include::./dashboards/dashboards-and-visualizations.asciidoc[leveloffset=+1] - -include::./alerting/alerting.asciidoc[leveloffset=+1] -include::./alerting/create-manage-rules.asciidoc[leveloffset=+2] -include::./alerting/aiops-generate-anomaly-alerts.asciidoc[leveloffset=+3] -include::./alerting/create-anomaly-alert-rule.asciidoc[leveloffset=+3] -include::./alerting/create-custom-threshold-alert-rule.asciidoc[leveloffset=+3] -include::./alerting/create-elasticsearch-query-alert-rule.asciidoc[leveloffset=+3] -include::./alerting/create-error-count-threshold-alert-rule.asciidoc[leveloffset=+3] -include::./alerting/create-failed-transaction-rate-threshold-alert-rule.asciidoc[leveloffset=+3] -include::./alerting/create-inventory-threshold-alert-rule.asciidoc[leveloffset=+3] -include::./alerting/create-latency-threshold-alert-rule.asciidoc[leveloffset=+3] -include::./alerting/create-slo-burn-rate-alert-rule.asciidoc[leveloffset=+3] -include::./alerting/synthetic-monitor-status-alert.asciidoc[leveloffset=+3] -include::./alerting/aggregation-options.asciidoc[leveloffset=+2] -include::./alerting/rate-aggregation.asciidoc[leveloffset=+3] -include::./alerting/view-alerts.asciidoc[leveloffset=+2] -include::./alerting/triage-slo-burn-rate-breaches.asciidoc[leveloffset=+3] -include::./alerting/triage-threshold-breaches.asciidoc[leveloffset=+3] - -include::./slos/slos.asciidoc[leveloffset=+1] -include::./slos/create-an-slo.asciidoc[leveloffset=+2] - -include::./cases/cases.asciidoc[leveloffset=+1] -include::./cases/create-manage-cases.asciidoc[leveloffset=+2] -include::./cases/manage-cases-settings.asciidoc[leveloffset=+2] - -include::./aiops/aiops.asciidoc[leveloffset=+1] -include::./aiops/aiops-detect-anomalies.asciidoc[leveloffset=+2] -include::./aiops/aiops-tune-anomaly-detection-job.asciidoc[leveloffset=+3] -include::./aiops/aiops-forecast-anomaly.asciidoc[leveloffset=+3] -include::./aiops/aiops-analyze-spikes.asciidoc[leveloffset=+2] -include::./aiops/aiops-detect-change-points.asciidoc[leveloffset=+2] - -include::./monitor-datasets.asciidoc[leveloffset=+1] - -include::./ai-assistant/ai-assistant.asciidoc[leveloffset=+1] - -include::./elastic-entity-model.asciidoc[leveloffset=+1] - -include::./technical-preview-limitations.asciidoc[leveloffset=+1] +[[what-is-observability-serverless]] +== Elastic Observability serverless + +++++ +<titleabbrev>Elastic Observability</titleabbrev> +++++ + +include::./what-is-observability-serverless.asciidoc[leveloffset=+2] + +include::./observability-overview.asciidoc[leveloffset=+2] + +include::./quickstarts/overview.asciidoc[leveloffset=+2] +include::./quickstarts/monitor-hosts-with-elastic-agent.asciidoc[leveloffset=+3] +include::./quickstarts/k8s-logs-metrics.asciidoc[leveloffset=+3] + +include::./projects/billing.asciidoc[leveloffset=+2] + +include::./projects/create-an-observability-project.asciidoc[leveloffset=+2] + +include::./logging/log-monitoring.asciidoc[leveloffset=+2] +include::./logging/get-started-with-logs.asciidoc[leveloffset=+3] +include::./logging/stream-log-files.asciidoc[leveloffset=+3] +include::./logging/correlate-application-logs.asciidoc[leveloffset=+3] +include::./logging/plaintext-application-logs.asciidoc[leveloffset=+4] +include::./logging/ecs-application-logs.asciidoc[leveloffset=+4] +include::./logging/send-application-logs.asciidoc[leveloffset=+4] +include::./logging/parse-log-data.asciidoc[leveloffset=+3] +include::./logging/filter-and-aggregate-logs.asciidoc[leveloffset=+3] +include::./logging/view-and-monitor-logs.asciidoc[leveloffset=+3] +include::./logging/add-logs-service-name.asciidoc[leveloffset=+3] +include::./logging/run-log-pattern-analysis.asciidoc[leveloffset=+3] +include::./logging/troubleshoot-logs.asciidoc[leveloffset=+3] + +include::./inventory.asciidoc[leveloffset=+2] + +include::./apm/apm.asciidoc[leveloffset=+2] +include::./apm/apm-get-started.asciidoc[leveloffset=+3] +include::./apm/apm-send-traces-to-elastic.asciidoc[leveloffset=+3] +include::./apm-agents/apm-agents-elastic-apm-agents.asciidoc[leveloffset=+4] +include::./apm-agents/apm-agents-opentelemetry.asciidoc[leveloffset=+4] +include::./apm-agents/apm-agents-opentelemetry-opentelemetry-native-support.asciidoc[leveloffset=+5] +include::./apm-agents/apm-agents-opentelemetry-collect-metrics.asciidoc[leveloffset=+5] +include::./apm-agents/apm-agents-opentelemetry-limitations.asciidoc[leveloffset=+5] +include::./apm-agents/apm-agents-opentelemetry-resource-attributes.asciidoc[leveloffset=+5] +include::./apm-agents/apm-agents-aws-lambda-functions.asciidoc[leveloffset=+4] +include::./apm/apm-view-and-analyze-traces.asciidoc[leveloffset=+3] +include::./apm/apm-find-transaction-latency-and-failure-correlations.asciidoc[leveloffset=+4] +include::./apm/apm-integrate-with-machine-learning.asciidoc[leveloffset=+4] +include::./apm/apm-create-custom-links.asciidoc[leveloffset=+4] +include::./apm/apm-track-deployments-with-annotations.asciidoc[leveloffset=+4] +include::./apm/apm-query-your-data.asciidoc[leveloffset=+4] +include::./apm/apm-filter-your-data.asciidoc[leveloffset=+4] +include::./apm/apm-observe-lambda-functions.asciidoc[leveloffset=+4] +include::./apm/apm-ui-overview.asciidoc[leveloffset=+4] +include::./apm/apm-ui-services.asciidoc[leveloffset=+5] +include::./apm/apm-ui-traces.asciidoc[leveloffset=+5] +include::./apm/apm-ui-dependencies.asciidoc[leveloffset=+5] +include::./apm/apm-ui-service-map.asciidoc[leveloffset=+5] +include::./apm/apm-ui-service-overview.asciidoc[leveloffset=+5] +include::./apm/apm-ui-transactions.asciidoc[leveloffset=+5] +include::./apm/apm-ui-trace-sample-timeline.asciidoc[leveloffset=+5] +include::./apm/apm-ui-errors.asciidoc[leveloffset=+5] +include::./apm/apm-ui-metrics.asciidoc[leveloffset=+5] +include::./apm/apm-ui-infrastructure.asciidoc[leveloffset=+5] +include::./apm/apm-ui-logs.asciidoc[leveloffset=+5] +include::./apm/apm-data-types.asciidoc[leveloffset=+3] +include::./apm/apm-distributed-tracing.asciidoc[leveloffset=+3] +include::./apm/apm-reduce-your-data-usage.asciidoc[leveloffset=+3] +include::./apm/apm-transaction-sampling.asciidoc[leveloffset=+4] +include::./apm/apm-compress-spans.asciidoc[leveloffset=+4] +include::./apm/apm-stacktrace-collection.asciidoc[leveloffset=+4] +include::./apm/apm-keep-data-secure.asciidoc[leveloffset=+3] +include::./apm/apm-troubleshooting.asciidoc[leveloffset=+3] +include::./apm/apm-reference.asciidoc[leveloffset=+3] +include::./apm/apm-kibana-settings.asciidoc[leveloffset=+4] +include::./apm/apm-server-api.asciidoc[leveloffset=+4] + +include::./infra-monitoring/infra-monitoring.asciidoc[leveloffset=+2] +include::./infra-monitoring/get-started-with-metrics.asciidoc[leveloffset=+3] +include::./infra-monitoring/view-infrastructure-metrics.asciidoc[leveloffset=+3] +include::./infra-monitoring/analyze-hosts.asciidoc[leveloffset=+3] +include::./infra-monitoring/detect-metric-anomalies.asciidoc[leveloffset=+3] +include::./infra-monitoring/configure-infra-settings.asciidoc[leveloffset=+3] +include::./infra-monitoring/troubleshooting-infra.asciidoc[leveloffset=+3] +include::./infra-monitoring/handle-no-results-found-message.asciidoc[leveloffset=+4] +include::./infra-monitoring/metrics-reference.asciidoc[leveloffset=+3] +include::./infra-monitoring/host-metrics.asciidoc[leveloffset=+4] +include::./infra-monitoring/container-metrics.asciidoc[leveloffset=+4] +include::./infra-monitoring/kubernetes-pod-metrics.asciidoc[leveloffset=+4] +include::./infra-monitoring/aws-metrics.asciidoc[leveloffset=+4] +include::./infra-monitoring/metrics-app-fields.asciidoc[leveloffset=+3] + +include::./synthetics/synthetics-intro.asciidoc[leveloffset=+2] +include::./synthetics/synthetics-get-started.asciidoc[leveloffset=+3] +include::./synthetics/synthetics-get-started-project.asciidoc[leveloffset=+4] +include::./synthetics/synthetics-get-started-ui.asciidoc[leveloffset=+4] +include::./synthetics/synthetics-journeys.asciidoc[leveloffset=+3] +include::./synthetics/synthetics-create-test.asciidoc[leveloffset=+4] +include::./synthetics/synthetics-monitor-use.asciidoc[leveloffset=+4] +include::./synthetics/synthetics-recorder.asciidoc[leveloffset=+4] +include::./synthetics/synthetics-lightweight.asciidoc[leveloffset=+3] +include::./synthetics/synthetics-manage-monitors.asciidoc[leveloffset=+3] +include::./synthetics/synthetics-params-secrets.asciidoc[leveloffset=+3] +include::./synthetics/synthetics-analyze.asciidoc[leveloffset=+3] +include::./synthetics/synthetics-private-location.asciidoc[leveloffset=+3] +include::./synthetics/synthetics-command-reference.asciidoc[leveloffset=+3] +include::./synthetics/synthetics-configuration.asciidoc[leveloffset=+3] +include::./synthetics/synthetics-settings.asciidoc[leveloffset=+3] +include::./synthetics/synthetics-feature-roles.asciidoc[leveloffset=+3] +include::./synthetics/synthetics-manage-retention.asciidoc[leveloffset=+3] +include::./synthetics/synthetics-scale-and-architect.asciidoc[leveloffset=+3] +include::./synthetics/synthetics-security-encryption.asciidoc[leveloffset=+3] +include::./synthetics/synthetics-troubleshooting.asciidoc[leveloffset=+3] + +include::./dashboards/dashboards-and-visualizations.asciidoc[leveloffset=+2] + +include::./alerting/alerting.asciidoc[leveloffset=+2] +include::./alerting/create-manage-rules.asciidoc[leveloffset=+3] +include::./alerting/aiops-generate-anomaly-alerts.asciidoc[leveloffset=+4] +include::./alerting/create-anomaly-alert-rule.asciidoc[leveloffset=+4] +include::./alerting/create-custom-threshold-alert-rule.asciidoc[leveloffset=+4] +include::./alerting/create-elasticsearch-query-alert-rule.asciidoc[leveloffset=+4] +include::./alerting/create-error-count-threshold-alert-rule.asciidoc[leveloffset=+4] +include::./alerting/create-failed-transaction-rate-threshold-alert-rule.asciidoc[leveloffset=+4] +include::./alerting/create-inventory-threshold-alert-rule.asciidoc[leveloffset=+4] +include::./alerting/create-latency-threshold-alert-rule.asciidoc[leveloffset=+4] +include::./alerting/create-slo-burn-rate-alert-rule.asciidoc[leveloffset=+4] +include::./alerting/synthetic-monitor-status-alert.asciidoc[leveloffset=+4] +include::./alerting/aggregation-options.asciidoc[leveloffset=+3] +include::./alerting/rate-aggregation.asciidoc[leveloffset=+4] +include::./alerting/view-alerts.asciidoc[leveloffset=+3] +include::./alerting/triage-slo-burn-rate-breaches.asciidoc[leveloffset=+4] +include::./alerting/triage-threshold-breaches.asciidoc[leveloffset=+4] + +include::./slos/slos.asciidoc[leveloffset=+2] +include::./slos/create-an-slo.asciidoc[leveloffset=+3] + +include::./cases/cases.asciidoc[leveloffset=+2] +include::./cases/create-manage-cases.asciidoc[leveloffset=+3] +include::./cases/manage-cases-settings.asciidoc[leveloffset=+3] + +include::./aiops/aiops.asciidoc[leveloffset=+2] +include::./aiops/aiops-detect-anomalies.asciidoc[leveloffset=+3] +include::./aiops/aiops-tune-anomaly-detection-job.asciidoc[leveloffset=+4] +include::./aiops/aiops-forecast-anomaly.asciidoc[leveloffset=+4] +include::./aiops/aiops-analyze-spikes.asciidoc[leveloffset=+3] +include::./aiops/aiops-detect-change-points.asciidoc[leveloffset=+3] + +include::./monitor-datasets.asciidoc[leveloffset=+2] + +include::./ai-assistant/ai-assistant.asciidoc[leveloffset=+2] + +include::./elastic-entity-model.asciidoc[leveloffset=+2] + +include::./technical-preview-limitations.asciidoc[leveloffset=+2] From c4c53680adaf6990eb7d70d15a4875c17e7b6163 Mon Sep 17 00:00:00 2001 From: Colleen McGinnis <colleen.mcginnis@elastic.co> Date: Mon, 4 Nov 2024 10:51:19 -0600 Subject: [PATCH 09/13] update readme --- README.md | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5ad0380402..9025ca0d67 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Within this repo, the `/docs/en/` directory is structured as follows: | --------------------- | ----------- | | __integrations__ | Contains the source files for the [Integrations Developer Guide](https://www.elastic.co/guide/en/integrations-developer/current/index.html). | __observability__ | Contains the source files for the [Observability Guide](https://www.elastic.co/guide/en/observability/current/index.html), which includes content for APM, Logs, Metrics, Synthetics, User experience, and Uptime.| -| __serverless__ | Contains the source files for the [Elastic Observability Serverless docs](https://docs.elastic.co/serverless/observability/what-is-observability-serverless). +| __serverless__ | Contains the source files for the [Elastic Observability Serverless docs](https://www.elastic.co/docs/current/serverless/observability/what-is-observability-serverless). | __shared__ | Contains the source files for shared Observability content.| | __templates__ | Contains content templates.| @@ -38,7 +38,19 @@ If you prefer to use aliases, you can load the [elastic/docs/doc_build_aliases.s ### Elastic Observability Serverless docs -The Elastic Observability Serverless docs use a custom syntax written in [MDX](https://mdxjs.com/). In many cases, you only need to know plain Markdown to contribute. We'll add a public component reference and additional contribution guidelines in future. Elasticians can refer to our [internal syntax reference](https://docs.elastic.dev/docsmobile/syntax). +The source files for the Serverless docs are written in [AsciiDoc](https://docs.asciidoctor.org/asciidoc/latest/) and are built using [elastic/docs](https://github.com/elastic/docs). + +To build the docs locally: + +1. Check out the `elastic/docs` repository, along with any repositories that contain source files. +2. Run the `build_docs` script, passing in the path to the `index.asciidoc` and resource paths to other repos that contain source files. For example, to build the Observability Guide and open it in the browser, run: + ``` + ../docs/build_docs --doc ../docs-content/serverless/index.asciidoc --chunk 5 --open --resource ./docs/en/serverless --resource ../security-docs/docs/serverless --resource ../docs-content/serverless + ``` + +The above command assumes that this repo, [elastic/docs](https://github.com/elastic/docs), [elastic/observability-docs](https://github.com/elastic/observability-docs), [elastic/security-docs](https://github.com/elastic/security-docs), and [elastic/docs-content](https://github.com/elastic/docs-content) are checked out into the same parent directory. + +If you prefer to use aliases, you can load the [elastic/docs/doc_build_aliases.sh file](https://github.com/elastic/docs/blob/master/doc_build_aliases.sh), which has the resources defined for you. ### Integrations Developer Guide From c303ef94125d52a342ad0f227ea145e6acaa1535 Mon Sep 17 00:00:00 2001 From: Colleen McGinnis <colleen.mcginnis@elastic.co> Date: Mon, 4 Nov 2024 15:07:14 -0600 Subject: [PATCH 10/13] update pr template --- .github/pull_request_template.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 6f47a1cb54..9c0656cfe4 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -19,14 +19,13 @@ Closes # <!-- Add the issue this PR closes here --> Add labels to: 1. Backport to other versions (`backport-*`): - `backport-8.x` to backport to the latest minor - - `backport-skip` to not backport (for example, for serverless docs) + - `backport-skip` to not backport (for example, for serverless docs) - `backport-main` to "backport" to `main` if the target branch is _not_ `main` - Individual `backport-*` labels to target specific minor versions 2. Surface blocking reviews (`needs-*-review`): - `needs-writer-review` for codeowners - `needs-dev-review` for dev team - `needs-product-review` for PM review -3. Build serverless preview docs: `ci:doc-build` --> - [ ] Product/Engineering Review From 8b8f60bd8b1798deb096a344bef4afbe8199e56f Mon Sep 17 00:00:00 2001 From: Colleen McGinnis <colleen.mcginnis@elastic.co> Date: Mon, 4 Nov 2024 15:36:39 -0600 Subject: [PATCH 11/13] catch up to main again --- ...te-elasticsearch-query-alert-rule.asciidoc | 3 +- .../create-elasticsearch-query-alert-rule.mdx | 3 +- .../serverless/alerting/view-alerts.asciidoc | 2 +- docs/en/serverless/alerting/view-alerts.mdx | 2 +- .../apm/apm-server-api/api-info.asciidoc | 2 +- docs/en/serverless/index.asciidoc | 1 + .../logging/troubleshoot-logs.asciidoc | 2 +- .../serverless/logging/troubleshoot-logs.mdx | 2 +- docs/en/serverless/partials/roles.asciidoc | 2 +- docs/en/serverless/partials/roles.mdx | 2 +- docs/en/serverless/projects/billing.asciidoc | 2 +- docs/en/serverless/projects/billing.mdx | 2 +- .../quickstarts/k8s-logs-metrics.asciidoc | 2 +- .../quickstarts/k8s-logs-metrics.mdx | 2 +- .../monitor-hosts-with-elastic-agent.asciidoc | 2 +- .../monitor-hosts-with-elastic-agent.mdx | 2 +- .../synthetics-command-reference.asciidoc | 21 + .../synthetics-feature-roles.asciidoc | 2 +- .../synthetics/synthetics-feature-roles.mdx | 2 +- .../synthetics/synthetics-mfa.asciidoc | 68 + .../transclusion/apm/guide/spec/v2/error.mdx | 1296 +++++++++++++++++ .../apm/guide/spec/v2/metadata.mdx | 570 ++++++++ .../apm/guide/spec/v2/metricset.mdx | 304 ++++ .../transclusion/apm/guide/spec/v2/span.mdx | 906 ++++++++++++ .../apm/guide/spec/v2/transaction.mdx | 1134 +++++++++++++++ 25 files changed, 4319 insertions(+), 17 deletions(-) create mode 100644 docs/en/serverless/synthetics/synthetics-mfa.asciidoc create mode 100644 docs/en/serverless/transclusion/apm/guide/spec/v2/error.mdx create mode 100644 docs/en/serverless/transclusion/apm/guide/spec/v2/metadata.mdx create mode 100644 docs/en/serverless/transclusion/apm/guide/spec/v2/metricset.mdx create mode 100644 docs/en/serverless/transclusion/apm/guide/spec/v2/span.mdx create mode 100644 docs/en/serverless/transclusion/apm/guide/spec/v2/transaction.mdx diff --git a/docs/en/serverless/alerting/create-elasticsearch-query-alert-rule.asciidoc b/docs/en/serverless/alerting/create-elasticsearch-query-alert-rule.asciidoc index 25fa77a97e..36f0b21b24 100644 --- a/docs/en/serverless/alerting/create-elasticsearch-query-alert-rule.asciidoc +++ b/docs/en/serverless/alerting/create-elasticsearch-query-alert-rule.asciidoc @@ -212,9 +212,10 @@ For example: ---- {{#context.hits}} timestamp: {{_source.@timestamp}} -day of the week: {{fields.day_of_week}} +day of the week: {{fields.day_of_week}} <1> {{/context.hits}} ---- +<1> The `fields` parameter here is used to access the `day_of_week` runtime field. + As the {ref}/search-fields.html#search-fields-response[`fields`] response always returns an array of values for each field, the https://mustache.github.io/[Mustache] template array syntax is used to iterate over these values in your actions. diff --git a/docs/en/serverless/alerting/create-elasticsearch-query-alert-rule.mdx b/docs/en/serverless/alerting/create-elasticsearch-query-alert-rule.mdx index 1b12b6461d..fd7f84b5d5 100644 --- a/docs/en/serverless/alerting/create-elasticsearch-query-alert-rule.mdx +++ b/docs/en/serverless/alerting/create-elasticsearch-query-alert-rule.mdx @@ -194,9 +194,10 @@ You can also specify [variables common to all rules](((kibana-ref))/rule-action- ```txt {{#context.hits}} timestamp: {{_source.@timestamp}} - day of the week: {{fields.day_of_week}} + day of the week: {{fields.day_of_week}} [^1] {{/context.hits}} ``` + [^1]: The `fields` parameter here is used to access the `day_of_week` runtime field. As the [`fields`](((ref))/search-fields.html#search-fields-response) response always returns an array of values for each field, the [Mustache](https://mustache.github.io/) template array syntax is used to iterate over these values in your actions. diff --git a/docs/en/serverless/alerting/view-alerts.asciidoc b/docs/en/serverless/alerting/view-alerts.asciidoc index acca3c039f..93321d7893 100644 --- a/docs/en/serverless/alerting/view-alerts.asciidoc +++ b/docs/en/serverless/alerting/view-alerts.asciidoc @@ -102,7 +102,7 @@ Use the toolbar buttons in the upper-left of the alerts table to customize the c For example, click **Fields** and choose the `Maintenance Windows` field. If an alert was affected by a maintenance window, its identifier appears in the new column. -For more information about their impact on alert notifications, refer to <<maintenance-windows,Maintenance windows>>. +For more information about their impact on alert notifications, refer to <<maintenance-windows>>. // ![Alerts table with toolbar buttons highlighted](images/view-observability-alerts/-observability-alert-table-toolbar-buttons.png) diff --git a/docs/en/serverless/alerting/view-alerts.mdx b/docs/en/serverless/alerting/view-alerts.mdx index a545e176cb..1a10210a19 100644 --- a/docs/en/serverless/alerting/view-alerts.mdx +++ b/docs/en/serverless/alerting/view-alerts.mdx @@ -87,7 +87,7 @@ Use the toolbar buttons in the upper-left of the alerts table to customize the c For example, click **Fields** and choose the `Maintenance Windows` field. If an alert was affected by a maintenance window, its identifier appears in the new column. -For more information about their impact on alert notifications, refer to <DocLink slug="/serverless/maintenance-windows">Maintenance windows</DocLink>. +For more information about their impact on alert notifications, refer to <DocLink slug="/serverless/maintenance-windows" />. {/* ![Alerts table with toolbar buttons highlighted](images/view-observability-alerts/-observability-alert-table-toolbar-buttons.png) */} diff --git a/docs/en/serverless/apm/apm-server-api/api-info.asciidoc b/docs/en/serverless/apm/apm-server-api/api-info.asciidoc index c02e6989e2..014e2f8153 100644 --- a/docs/en/serverless/apm/apm-server-api/api-info.asciidoc +++ b/docs/en/serverless/apm/apm-server-api/api-info.asciidoc @@ -24,7 +24,7 @@ Requests to this endpoint must be authenticated. Example managed intake service information request: -[source,sh,subs="attributes+"] +[source,sh,subs="attributes"] ---- curl -X POST http://127.0.0.1:8200/ \ -H "Authorization: ApiKey api_key" diff --git a/docs/en/serverless/index.asciidoc b/docs/en/serverless/index.asciidoc index a3f8a48933..174f290f1f 100644 --- a/docs/en/serverless/index.asciidoc +++ b/docs/en/serverless/index.asciidoc @@ -110,6 +110,7 @@ include::./synthetics/synthetics-analyze.asciidoc[leveloffset=+3] include::./synthetics/synthetics-private-location.asciidoc[leveloffset=+3] include::./synthetics/synthetics-command-reference.asciidoc[leveloffset=+3] include::./synthetics/synthetics-configuration.asciidoc[leveloffset=+3] +include::./synthetics/synthetics-mfa.asciidoc[leveloffset=+3] include::./synthetics/synthetics-settings.asciidoc[leveloffset=+3] include::./synthetics/synthetics-feature-roles.asciidoc[leveloffset=+3] include::./synthetics/synthetics-manage-retention.asciidoc[leveloffset=+3] diff --git a/docs/en/serverless/logging/troubleshoot-logs.asciidoc b/docs/en/serverless/logging/troubleshoot-logs.asciidoc index 44c54a3a30..ef99d95f47 100644 --- a/docs/en/serverless/logging/troubleshoot-logs.asciidoc +++ b/docs/en/serverless/logging/troubleshoot-logs.asciidoc @@ -26,7 +26,7 @@ You need permission to manage API keys You need to either: -* Ask an administrator to update your user role to at least **Deployment access** → **Admin**. Read more about user roles in <<general-assign-user-roles,Assign user roles and privileges>>. After your use role is updated, restart the onboarding flow. +* Ask an administrator to update your user role to at least **Deployment access** → **Admin**. Read more about user roles in <<general-assign-user-roles>>. After your use role is updated, restart the onboarding flow. * Get an API key from an administrator and manually add the API to the {agent} configuration. See <<observability-stream-log-files-step-3-configure-the-agent,Configure the {agent}>> for more on manually updating the configuration and adding the API key. // Not sure if these are different in serverless... diff --git a/docs/en/serverless/logging/troubleshoot-logs.mdx b/docs/en/serverless/logging/troubleshoot-logs.mdx index f1b08924a2..5bf09218ee 100644 --- a/docs/en/serverless/logging/troubleshoot-logs.mdx +++ b/docs/en/serverless/logging/troubleshoot-logs.mdx @@ -20,7 +20,7 @@ if you don't have the required privileges to create an API key, you'll see the f You need to either: -* Ask an administrator to update your user role to at least **Deployment access** → **Admin**. Read more about user roles in <DocLink slug="/serverless/general/assign-user-roles">Assign user roles and privileges</DocLink>. After your use role is updated, restart the onboarding flow. +* Ask an administrator to update your user role to at least **Deployment access** → **Admin**. Read more about user roles in <DocLink slug="/serverless/general/assign-user-roles" />. After your use role is updated, restart the onboarding flow. * Get an API key from an administrator and manually add the API to the ((agent)) configuration. See <DocLink slug="/serverless/observability/stream-log-files" section="step-3-configure-the-agent">Configure the ((agent))</DocLink> for more on manually updating the configuration and adding the API key. {/* Not sure if these are different in serverless... */} diff --git a/docs/en/serverless/partials/roles.asciidoc b/docs/en/serverless/partials/roles.asciidoc index 58ebd580f6..fd36c45a9a 100644 --- a/docs/en/serverless/partials/roles.asciidoc +++ b/docs/en/serverless/partials/roles.asciidoc @@ -1,5 +1,5 @@ .Required role [NOTE] ==== -The **{role}** role or higher is required to {goal}. To learn more, refer to <<general-assign-user-roles,Assign user roles and privileges>>. +The **{role}** role or higher is required to {goal}. To learn more, refer to <<general-assign-user-roles>>. ==== diff --git a/docs/en/serverless/partials/roles.mdx b/docs/en/serverless/partials/roles.mdx index fc438318ce..d7d302aa28 100644 --- a/docs/en/serverless/partials/roles.mdx +++ b/docs/en/serverless/partials/roles.mdx @@ -1,3 +1,3 @@ <DocCallOut title="Required role"> - The **{props.role}** role or higher is required to {props.goal}. To learn more, refer to <DocLink slug="/serverless/general/assign-user-roles">Assign user roles and privileges</DocLink>. + The **{props.role}** role or higher is required to {props.goal}. To learn more, refer to <DocLink slug="/serverless/general/assign-user-roles" />. </DocCallOut> \ No newline at end of file diff --git a/docs/en/serverless/projects/billing.asciidoc b/docs/en/serverless/projects/billing.asciidoc index a371ecdefe..1bf9c64fc3 100644 --- a/docs/en/serverless/projects/billing.asciidoc +++ b/docs/en/serverless/projects/billing.asciidoc @@ -18,6 +18,6 @@ When you use Elastic Observability, your bill is calculated based on data volume Browser (journey) based tests are charged on a per-test-run basis, and Ping (lightweight) tests have an all-you-can-use model per location used. -For more information, refer to <<general-serverless-billing,Serverless billing dimensions>>. +For more information, refer to <<general-serverless-billing>>. For detailed Observability serverless project rates, check the https://www.elastic.co/pricing/serverless-observability[Observability Serverless pricing page]. diff --git a/docs/en/serverless/projects/billing.mdx b/docs/en/serverless/projects/billing.mdx index 2de3bc1c25..f3b6f3f4d8 100644 --- a/docs/en/serverless/projects/billing.mdx +++ b/docs/en/serverless/projects/billing.mdx @@ -19,6 +19,6 @@ When you use Elastic Observability, your bill is calculated based on data volume Browser (journey) based tests are charged on a per-test-run basis, and Ping (lightweight) tests have an all-you-can-use model per location used. -For more information, refer to <DocLink slug="/serverless/general/serverless-billing">Serverless billing dimensions</DocLink>. +For more information, refer to <DocLink slug="/serverless/general/serverless-billing" />. For detailed Observability serverless project rates, check the [Observability Serverless pricing page](https://www.elastic.co/pricing/serverless-observability). diff --git a/docs/en/serverless/quickstarts/k8s-logs-metrics.asciidoc b/docs/en/serverless/quickstarts/k8s-logs-metrics.asciidoc index 9e36851e7c..1f64f4e633 100644 --- a/docs/en/serverless/quickstarts/k8s-logs-metrics.asciidoc +++ b/docs/en/serverless/quickstarts/k8s-logs-metrics.asciidoc @@ -17,7 +17,7 @@ The kubectl command installs the standalone Elastic Agent in your Kubernetes clu == Prerequisites * An {observability} project. To learn more, refer to <<observability-create-an-observability-project>>. -* A user with the **Admin** role or higher—required to onboard system logs and metrics. To learn more, refer to <<general-assign-user-roles,Assign user roles and privileges>>. +* A user with the **Admin** role or higher—required to onboard system logs and metrics. To learn more, refer to <<general-assign-user-roles>>. * A running Kubernetes cluster. * https://kubernetes.io/docs/reference/kubectl/[Kubectl]. diff --git a/docs/en/serverless/quickstarts/k8s-logs-metrics.mdx b/docs/en/serverless/quickstarts/k8s-logs-metrics.mdx index 4a2fbd4459..62ca87950e 100644 --- a/docs/en/serverless/quickstarts/k8s-logs-metrics.mdx +++ b/docs/en/serverless/quickstarts/k8s-logs-metrics.mdx @@ -16,7 +16,7 @@ The kubectl command installs the standalone Elastic Agent in your Kubernetes clu ## Prerequisites - An ((observability)) project. To learn more, refer to <DocLink slug="/serverless/observability/create-an-observability-project" />. -- A user with the **Admin** role or higher—required to onboard system logs and metrics. To learn more, refer to <DocLink slug="/serverless/general/assign-user-roles">Assign user roles and privileges</DocLink>. +- A user with the **Admin** role or higher—required to onboard system logs and metrics. To learn more, refer to <DocLink slug="/serverless/general/assign-user-roles" />. - A running Kubernetes cluster. - [Kubectl](https://kubernetes.io/docs/reference/kubectl/). diff --git a/docs/en/serverless/quickstarts/monitor-hosts-with-elastic-agent.asciidoc b/docs/en/serverless/quickstarts/monitor-hosts-with-elastic-agent.asciidoc index 6bfa21cd36..98c1bfa958 100644 --- a/docs/en/serverless/quickstarts/monitor-hosts-with-elastic-agent.asciidoc +++ b/docs/en/serverless/quickstarts/monitor-hosts-with-elastic-agent.asciidoc @@ -20,7 +20,7 @@ The script also generates an {agent} configuration file that you can use with yo == Prerequisites * An {observability} project. To learn more, refer to <<observability-create-an-observability-project>>. -* A user with the **Admin** role or higher—required to onboard system logs and metrics. To learn more, refer to <<general-assign-user-roles,Assign user roles and privileges>>. +* A user with the **Admin** role or higher—required to onboard system logs and metrics. To learn more, refer to <<general-assign-user-roles>>. * Root privileges on the host—required to run the auto-detection script used in this quickstart. [discrete] diff --git a/docs/en/serverless/quickstarts/monitor-hosts-with-elastic-agent.mdx b/docs/en/serverless/quickstarts/monitor-hosts-with-elastic-agent.mdx index 2fa12a7caf..72f1ecf6e1 100644 --- a/docs/en/serverless/quickstarts/monitor-hosts-with-elastic-agent.mdx +++ b/docs/en/serverless/quickstarts/monitor-hosts-with-elastic-agent.mdx @@ -19,7 +19,7 @@ The script also generates an ((agent)) configuration file that you can use with ## Prerequisites - An ((observability)) project. To learn more, refer to <DocLink slug="/serverless/observability/create-an-observability-project" />. -- A user with the **Admin** role or higher—required to onboard system logs and metrics. To learn more, refer to <DocLink slug="/serverless/general/assign-user-roles">Assign user roles and privileges</DocLink>. +- A user with the **Admin** role or higher—required to onboard system logs and metrics. To learn more, refer to <DocLink slug="/serverless/general/assign-user-roles" />. - Root privileges on the host—required to run the auto-detection script used in this quickstart. ## Limitations diff --git a/docs/en/serverless/synthetics/synthetics-command-reference.asciidoc b/docs/en/serverless/synthetics/synthetics-command-reference.asciidoc index 2d9269c86e..fa0630e090 100644 --- a/docs/en/serverless/synthetics/synthetics-command-reference.asciidoc +++ b/docs/en/serverless/synthetics/synthetics-command-reference.asciidoc @@ -323,3 +323,24 @@ _You don't have permission to use Elastic managed global locations_. For more de <DocLink slug="/serverless/observability/synthetics-troubleshooting" section="you-do-not-have-permission-to-use-elastic-managed-locations">troubleshooting docs</DocLink>. </DocCallOut> */ //// + +[discrete] +[[observability-synthetics-command-reference-elasticsynthetics-totp-lesssecretgreater]] +== `@elastic/synthetics totp <secret>` + +Generate a Time-based One-Time Password (TOTP) for multifactor authentication(MFA) in Synthetics. + +[source,sh] +---- +npx @elastic/synthetics totp <secret> --issuer <issuer> --label <label> +---- + +`secret`:: +The encoded secret key used to generate the TOTP. + +`--issuer <string>`:: +Name of the provider or service that is assocaited with the account. + +`--label <string>`:: +Identifier for the account. Defaults to `SyntheticsTOTP` + diff --git a/docs/en/serverless/synthetics/synthetics-feature-roles.asciidoc b/docs/en/serverless/synthetics/synthetics-feature-roles.asciidoc index 54d33ec956..5b2428c155 100644 --- a/docs/en/serverless/synthetics/synthetics-feature-roles.asciidoc +++ b/docs/en/serverless/synthetics/synthetics-feature-roles.asciidoc @@ -23,4 +23,4 @@ a| * Full access to project management, properties, and security privileges. * View and create visualizations that access Synthetics data. |=== -Read more about user roles in <<general-assign-user-roles,Assign user roles and privileges>>. +Read more about user roles in <<general-assign-user-roles>>. diff --git a/docs/en/serverless/synthetics/synthetics-feature-roles.mdx b/docs/en/serverless/synthetics/synthetics-feature-roles.mdx index 69b9109103..e2e804fcad 100644 --- a/docs/en/serverless/synthetics/synthetics-feature-roles.mdx +++ b/docs/en/serverless/synthetics/synthetics-feature-roles.mdx @@ -42,4 +42,4 @@ requirements and the minimum privileges required to use specific features. </DocRow> </DocTable> -Read more about user roles in <DocLink slug="/serverless/general/assign-user-roles">Assign user roles and privileges</DocLink>. +Read more about user roles in <DocLink slug="/serverless/general/assign-user-roles" />. diff --git a/docs/en/serverless/synthetics/synthetics-mfa.asciidoc b/docs/en/serverless/synthetics/synthetics-mfa.asciidoc new file mode 100644 index 0000000000..8afc1d38a5 --- /dev/null +++ b/docs/en/serverless/synthetics/synthetics-mfa.asciidoc @@ -0,0 +1,68 @@ +[[observability-synthetics-mfa]] += Multi-factor Authentication (MFA) for browser monitors + +++++ +<titleabbrev>Multifactor Authentication for browser monitors</titleabbrev> +++++ + +preview:[] + +Multi-factor Authentication (MFA) adds an essential layer of security to +applications login processes, protecting against unauthorized access. A very +common use case in Synthetics is testing user journeys involving websites +protected by MFA. + +Synthetics supports testing websites secured by Time-based One-Time Password +(TOTP), a common MFA method that provides short-lived one-time tokens to +enhance security. + +[discrete] +[[observability-synthetics-mfa-configuring-totp-for-mfa]] +== Configuring TOTP for MFA + +To test a browser journey that uses TOTP for MFA, first configure the +Synthetics authenticator token in the target application. To do this, generate a One-Time +Password (OTP) using the Synthetics CLI; refer to <<observability-synthetics-command-reference,`@elastic/synthetics totp <secret>`>>. + +[source,sh] +---- +npx @elastic/synthetics totp <secret> + +// prints +OTP Token: 123456 +---- + +[discrete] +[[observability-synthetics-mfa-applying-the-totp-token-in-browser-journeys]] +== Applying the TOTP Token in Browser Journeys + +Once the Synthetics TOTP Authentication is configured in your application, you can now use the OTP token in the synthetics browser +journeys using the `mfa` object imported from `@elastic/synthetics`. + +[source,ts] +---- +import { journey, step, mfa } from "@elastic/synthetics"; + +journey("MFA Test", ({ page, params }) => { + step("Login using TOTP token", async () => { + // login using username and pass and go to 2FA in next page + const token = mfa.token(params.MFA_GH_SECRET); + await page.getByPlaceholder("token-input").fill(token); + }); +}); +---- + +For monitors created in the Synthetics UI using the Script editor, the `mfa` object can be accessed as shown below: + +[source,ts] +---- +step("Login using 2FA", async () => { + const token = mfa.token(params.MFA_GH_SECRET); + await page.getByPlaceholder("token-input").fill(token); +}); +---- + +[NOTE] +==== +`params.MFA_GH_SECRET` would be the encoded secret that was used for registering the Synthetics Authentication in your web application. +==== diff --git a/docs/en/serverless/transclusion/apm/guide/spec/v2/error.mdx b/docs/en/serverless/transclusion/apm/guide/spec/v2/error.mdx new file mode 100644 index 0000000000..23b18ba8b1 --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/spec/v2/error.mdx @@ -0,0 +1,1296 @@ +export const snippet = ` +{ + "$id": "docs/spec/v2/error", + "description": "errorEvent represents an error or a logged error message, captured by an APM agent in a monitored service.", + "type": "object", + "properties": { + "context": { + "description": "Context holds arbitrary contextual information for the event.", + "type": [ + "null", + "object" + ], + "properties": { + "cloud": { + "description": "Cloud holds fields related to the cloud or infrastructure the events are coming from.", + "type": [ + "null", + "object" + ], + "properties": { + "origin": { + "description": "Origin contains the self-nested field groups for cloud.", + "type": [ + "null", + "object" + ], + "properties": { + "account": { + "description": "The cloud account or organization id used to identify different entities in a multi-tenant environment.", + "type": [ + "null", + "object" + ], + "properties": { + "id": { + "description": "The cloud account or organization id used to identify different entities in a multi-tenant environment.", + "type": [ + "null", + "string" + ] + } + } + }, + "provider": { + "description": "Name of the cloud provider.", + "type": [ + "null", + "string" + ] + }, + "region": { + "description": "Region in which this host, resource, or service is located.", + "type": [ + "null", + "string" + ] + }, + "service": { + "description": "The cloud service name is intended to distinguish services running on different platforms within a provider.", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "The cloud service name is intended to distinguish services running on different platforms within a provider.", + "type": [ + "null", + "string" + ] + } + } + } + } + } + } + }, + "custom": { + "description": "Custom can contain additional metadata to be stored with the event. The format is unspecified and can be deeply nested objects. The information will not be indexed or searchable in Elasticsearch.", + "type": [ + "null", + "object" + ] + }, + "message": { + "description": "Message holds details related to message receiving and publishing if the captured event integrates with a messaging system", + "type": [ + "null", + "object" + ], + "properties": { + "age": { + "description": "Age of the message. If the monitored messaging framework provides a timestamp for the message, agents may use it. Otherwise, the sending agent can add a timestamp in milliseconds since the Unix epoch to the message's metadata to be retrieved by the receiving agent. If a timestamp is not available, agents should omit this field.", + "type": [ + "null", + "object" + ], + "properties": { + "ms": { + "description": "Age of the message in milliseconds.", + "type": [ + "null", + "integer" + ] + } + } + }, + "body": { + "description": "Body of the received message, similar to an HTTP request body", + "type": [ + "null", + "string" + ] + }, + "headers": { + "description": "Headers received with the message, similar to HTTP request headers.", + "type": [ + "null", + "object" + ], + "additionalProperties": false, + "patternProperties": { + "[.*]*$": { + "type": [ + "null", + "array", + "string" + ], + "items": { + "type": "string" + } + } + } + }, + "queue": { + "description": "Queue holds information about the message queue where the message is received.", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Name holds the name of the message queue where the message is received.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "routing_key": { + "description": "RoutingKey holds the optional routing key of the received message as set on the queuing system, such as in RabbitMQ.", + "type": [ + "null", + "string" + ] + } + } + }, + "page": { + "description": "Page holds information related to the current page and page referers. It is only sent from RUM agents.", + "type": [ + "null", + "object" + ], + "properties": { + "referer": { + "description": "Referer holds the URL of the page that 'linked' to the current page.", + "type": [ + "null", + "string" + ] + }, + "url": { + "description": "URL of the current page", + "type": [ + "null", + "string" + ] + } + } + }, + "request": { + "description": "Request describes the HTTP request information in case the event was created as a result of an HTTP request.", + "type": [ + "null", + "object" + ], + "properties": { + "body": { + "description": "Body only contais the request bod, not the query string information. It can either be a dictionary (for standard HTTP requests) or a raw request body.", + "type": [ + "null", + "string", + "object" + ] + }, + "cookies": { + "description": "Cookies used by the request, parsed as key-value objects.", + "type": [ + "null", + "object" + ] + }, + "env": { + "description": "Env holds environment variable information passed to the monitored service.", + "type": [ + "null", + "object" + ] + }, + "headers": { + "description": "Headers includes any HTTP headers sent by the requester. Cookies will be taken by headers if supplied.", + "type": [ + "null", + "object" + ], + "additionalProperties": false, + "patternProperties": { + "[.*]*$": { + "type": [ + "null", + "array", + "string" + ], + "items": { + "type": "string" + } + } + } + }, + "http_version": { + "description": "HTTPVersion holds information about the used HTTP version.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "method": { + "description": "Method holds information about the method of the HTTP request.", + "type": "string", + "maxLength": 1024 + }, + "socket": { + "description": "Socket holds information related to the recorded request, such as whether or not data were encrypted and the remote address.", + "type": [ + "null", + "object" + ], + "properties": { + "encrypted": { + "description": "Encrypted indicates whether a request was sent as TLS/HTTPS request. DEPRECATED: this field will be removed in a future release.", + "type": [ + "null", + "boolean" + ] + }, + "remote_address": { + "description": "RemoteAddress holds the network address sending the request. It should be obtained through standard APIs and not be parsed from any headers like 'Forwarded'.", + "type": [ + "null", + "string" + ] + } + } + }, + "url": { + "description": "URL holds information sucha as the raw URL, scheme, host and path.", + "type": [ + "null", + "object" + ], + "properties": { + "full": { + "description": "Full, possibly agent-assembled URL of the request, e.g. https://example.com:443/search?q=elasticsearch#top.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "hash": { + "description": "Hash of the request URL, e.g. 'top'", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "hostname": { + "description": "Hostname information of the request, e.g. 'example.com'.\"", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "pathname": { + "description": "Path of the request, e.g. '/search'", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "port": { + "description": "Port of the request, e.g. '443'. Can be sent as string or int.", + "type": [ + "null", + "string", + "integer" + ], + "maxLength": 1024 + }, + "protocol": { + "description": "Protocol information for the recorded request, e.g. 'https:'.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "raw": { + "description": "Raw unparsed URL of the HTTP request line, e.g https://example.com:443/search?q=elasticsearch. This URL may be absolute or relative. For more details, see https://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html#sec5.1.2.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "search": { + "description": "Search contains the query string information of the request. It is expected to have values delimited by ampersands.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + } + }, + "required": [ + "method" + ] + }, + "response": { + "description": "Response describes the HTTP response information in case the event was created as a result of an HTTP request.", + "type": [ + "null", + "object" + ], + "properties": { + "decoded_body_size": { + "description": "DecodedBodySize holds the size of the decoded payload.", + "type": [ + "null", + "integer" + ] + }, + "encoded_body_size": { + "description": "EncodedBodySize holds the size of the encoded payload.", + "type": [ + "null", + "integer" + ] + }, + "finished": { + "description": "Finished indicates whether the response was finished or not.", + "type": [ + "null", + "boolean" + ] + }, + "headers": { + "description": "Headers holds the http headers sent in the http response.", + "type": [ + "null", + "object" + ], + "additionalProperties": false, + "patternProperties": { + "[.*]*$": { + "type": [ + "null", + "array", + "string" + ], + "items": { + "type": "string" + } + } + } + }, + "headers_sent": { + "description": "HeadersSent indicates whether http headers were sent.", + "type": [ + "null", + "boolean" + ] + }, + "status_code": { + "description": "StatusCode sent in the http response.", + "type": [ + "null", + "integer" + ] + }, + "transfer_size": { + "description": "TransferSize holds the total size of the payload.", + "type": [ + "null", + "integer" + ] + } + } + }, + "service": { + "description": "Service related information can be sent per event. Information provided here will override the more generic information retrieved from metadata, missing service fields will be retrieved from the metadata information.", + "type": [ + "null", + "object" + ], + "properties": { + "agent": { + "description": "Agent holds information about the APM agent capturing the event.", + "type": [ + "null", + "object" + ], + "properties": { + "ephemeral_id": { + "description": "EphemeralID is a free format ID used for metrics correlation by agents", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "name": { + "description": "Name of the APM agent capturing information.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "version": { + "description": "Version of the APM agent capturing information.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "environment": { + "description": "Environment in which the monitored service is running, e.g. \`production\` or \`staging\`.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "framework": { + "description": "Framework holds information about the framework used in the monitored service.", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Name of the used framework", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "version": { + "description": "Version of the used framework", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "id": { + "description": "ID holds a unique identifier for the service.", + "type": [ + "null", + "string" + ] + }, + "language": { + "description": "Language holds information about the programming language of the monitored service.", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Name of the used programming language", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "version": { + "description": "Version of the used programming language", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "name": { + "description": "Name of the monitored service.", + "type": [ + "null", + "string" + ], + "maxLength": 1024, + "pattern": "^[a-zA-Z0-9 _-]+$" + }, + "node": { + "description": "Node must be a unique meaningful name of the service node.", + "type": [ + "null", + "object" + ], + "properties": { + "configured_name": { + "description": "Name of the service node", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "origin": { + "description": "Origin contains the self-nested field groups for service.", + "type": [ + "null", + "object" + ], + "properties": { + "id": { + "description": "Immutable id of the service emitting this event.", + "type": [ + "null", + "string" + ] + }, + "name": { + "description": "Immutable name of the service emitting this event.", + "type": [ + "null", + "string" + ] + }, + "version": { + "description": "The version of the service the data was collected from.", + "type": [ + "null", + "string" + ] + } + } + }, + "runtime": { + "description": "Runtime holds information about the language runtime running the monitored service", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Name of the language runtime", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "version": { + "description": "Version of the language runtime", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "target": { + "description": "Target holds information about the outgoing service in case of an outgoing event", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Immutable name of the target service for the event", + "type": [ + "null", + "string" + ] + }, + "type": { + "description": "Immutable type of the target service for the event", + "type": [ + "null", + "string" + ] + } + }, + "anyOf": [ + { + "properties": { + "type": { + "type": "string" + } + }, + "required": [ + "type" + ] + }, + { + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ] + } + ] + }, + "version": { + "description": "Version of the monitored service.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "tags": { + "description": "Tags are a flat mapping of user-defined tags. On the agent side, tags are called labels. Allowed value types are string, boolean and number values. Tags are indexed and searchable.", + "type": [ + "null", + "object" + ], + "additionalProperties": { + "type": [ + "null", + "string", + "boolean", + "number" + ], + "maxLength": 1024 + } + }, + "user": { + "description": "User holds information about the correlated user for this event. If user data are provided here, all user related information from metadata is ignored, otherwise the metadata's user information will be stored with the event.", + "type": [ + "null", + "object" + ], + "properties": { + "domain": { + "description": "Domain of the logged in user", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "email": { + "description": "Email of the user.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "id": { + "description": "ID identifies the logged in user, e.g. can be the primary key of the user", + "type": [ + "null", + "string", + "integer" + ], + "maxLength": 1024 + }, + "username": { + "description": "Name of the user.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + } + } + }, + "culprit": { + "description": "Culprit identifies the function call which was the primary perpetrator of this event.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "exception": { + "description": "Exception holds information about the original error. The information is language specific.", + "type": [ + "null", + "object" + ], + "properties": { + "attributes": { + "description": "Attributes of the exception.", + "type": [ + "null", + "object" + ] + }, + "cause": { + "description": "Cause can hold a collection of error exceptions representing chained exceptions. The chain starts with the outermost exception, followed by its cause, and so on.", + "type": [ + "null", + "array" + ], + "items": { + "type": "object" + }, + "minItems": 0 + }, + "code": { + "description": "Code that is set when the error happened, e.g. database error code.", + "type": [ + "null", + "string", + "integer" + ], + "maxLength": 1024 + }, + "handled": { + "description": "Handled indicates whether the error was caught in the code or not.", + "type": [ + "null", + "boolean" + ] + }, + "message": { + "description": "Message contains the originally captured error message.", + "type": [ + "null", + "string" + ] + }, + "module": { + "description": "Module describes the exception type's module namespace.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "stacktrace": { + "description": "Stacktrace information of the captured exception.", + "type": [ + "null", + "array" + ], + "items": { + "type": "object", + "properties": { + "abs_path": { + "description": "AbsPath is the absolute path of the frame's file.", + "type": [ + "null", + "string" + ] + }, + "classname": { + "description": "Classname of the frame.", + "type": [ + "null", + "string" + ] + }, + "colno": { + "description": "ColumnNumber of the frame.", + "type": [ + "null", + "integer" + ] + }, + "context_line": { + "description": "ContextLine is the line from the frame's file.", + "type": [ + "null", + "string" + ] + }, + "filename": { + "description": "Filename is the relative name of the frame's file.", + "type": [ + "null", + "string" + ] + }, + "function": { + "description": "Function represented by the frame.", + "type": [ + "null", + "string" + ] + }, + "library_frame": { + "description": "LibraryFrame indicates whether the frame is from a third party library.", + "type": [ + "null", + "boolean" + ] + }, + "lineno": { + "description": "LineNumber of the frame.", + "type": [ + "null", + "integer" + ] + }, + "module": { + "description": "Module to which the frame belongs to.", + "type": [ + "null", + "string" + ] + }, + "post_context": { + "description": "PostContext is a slice of code lines immediately before the line from the frame's file.", + "type": [ + "null", + "array" + ], + "items": { + "type": "string" + }, + "minItems": 0 + }, + "pre_context": { + "description": "PreContext is a slice of code lines immediately after the line from the frame's file.", + "type": [ + "null", + "array" + ], + "items": { + "type": "string" + }, + "minItems": 0 + }, + "vars": { + "description": "Vars is a flat mapping of local variables of the frame.", + "type": [ + "null", + "object" + ] + } + }, + "anyOf": [ + { + "properties": { + "classname": { + "type": "string" + } + }, + "required": [ + "classname" + ] + }, + { + "properties": { + "filename": { + "type": "string" + } + }, + "required": [ + "filename" + ] + } + ] + }, + "minItems": 0 + }, + "type": { + "description": "Type of the exception.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + }, + "anyOf": [ + { + "properties": { + "message": { + "type": "string" + } + }, + "required": [ + "message" + ] + }, + { + "properties": { + "type": { + "type": "string" + } + }, + "required": [ + "type" + ] + } + ] + }, + "id": { + "description": "ID holds the hex encoded 128 random bits ID of the event.", + "type": "string", + "maxLength": 1024 + }, + "log": { + "description": "Log holds additional information added when the error is logged.", + "type": [ + "null", + "object" + ], + "properties": { + "level": { + "description": "Level represents the severity of the recorded log.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "logger_name": { + "description": "LoggerName holds the name of the used logger instance.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "message": { + "description": "Message of the logged error. In case a parameterized message is captured, Message should contain the same information, but with any placeholders being replaced.", + "type": "string" + }, + "param_message": { + "description": "ParamMessage should contain the same information as Message, but with placeholders where parameters were logged, e.g. 'error connecting to %s'. The string is not interpreted, allowing differnt placeholders per client languange. The information might be used to group errors together.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "stacktrace": { + "description": "Stacktrace information of the captured error.", + "type": [ + "null", + "array" + ], + "items": { + "type": "object", + "properties": { + "abs_path": { + "description": "AbsPath is the absolute path of the frame's file.", + "type": [ + "null", + "string" + ] + }, + "classname": { + "description": "Classname of the frame.", + "type": [ + "null", + "string" + ] + }, + "colno": { + "description": "ColumnNumber of the frame.", + "type": [ + "null", + "integer" + ] + }, + "context_line": { + "description": "ContextLine is the line from the frame's file.", + "type": [ + "null", + "string" + ] + }, + "filename": { + "description": "Filename is the relative name of the frame's file.", + "type": [ + "null", + "string" + ] + }, + "function": { + "description": "Function represented by the frame.", + "type": [ + "null", + "string" + ] + }, + "library_frame": { + "description": "LibraryFrame indicates whether the frame is from a third party library.", + "type": [ + "null", + "boolean" + ] + }, + "lineno": { + "description": "LineNumber of the frame.", + "type": [ + "null", + "integer" + ] + }, + "module": { + "description": "Module to which the frame belongs to.", + "type": [ + "null", + "string" + ] + }, + "post_context": { + "description": "PostContext is a slice of code lines immediately before the line from the frame's file.", + "type": [ + "null", + "array" + ], + "items": { + "type": "string" + }, + "minItems": 0 + }, + "pre_context": { + "description": "PreContext is a slice of code lines immediately after the line from the frame's file.", + "type": [ + "null", + "array" + ], + "items": { + "type": "string" + }, + "minItems": 0 + }, + "vars": { + "description": "Vars is a flat mapping of local variables of the frame.", + "type": [ + "null", + "object" + ] + } + }, + "anyOf": [ + { + "properties": { + "classname": { + "type": "string" + } + }, + "required": [ + "classname" + ] + }, + { + "properties": { + "filename": { + "type": "string" + } + }, + "required": [ + "filename" + ] + } + ] + }, + "minItems": 0 + } + }, + "required": [ + "message" + ] + }, + "parent_id": { + "description": "ParentID holds the hex encoded 64 random bits ID of the parent transaction or span.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "timestamp": { + "description": "Timestamp holds the recorded time of the event, UTC based and formatted as microseconds since Unix epoch.", + "type": [ + "null", + "integer" + ] + }, + "trace_id": { + "description": "TraceID holds the hex encoded 128 random bits ID of the correlated trace.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "transaction": { + "description": "Transaction holds information about the correlated transaction.", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Name is the generic designation of a transaction in the scope of a single service, eg: 'GET /users/:id'.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "sampled": { + "description": "Sampled indicates whether or not the full information for a transaction is captured. If a transaction is unsampled no spans and less context information will be reported.", + "type": [ + "null", + "boolean" + ] + }, + "type": { + "description": "Type expresses the correlated transaction's type as keyword that has specific relevance within the service's domain, eg: 'request', 'backgroundjob'.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "transaction_id": { + "description": "TransactionID holds the hex encoded 64 random bits ID of the correlated transaction.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + }, + "required": [ + "id" + ], + "allOf": [ + { + "if": { + "properties": { + "transaction_id": { + "type": "string" + } + }, + "required": [ + "transaction_id" + ] + }, + "then": { + "properties": { + "parent_id": { + "type": "string" + } + }, + "required": [ + "parent_id" + ] + } + }, + { + "if": { + "properties": { + "trace_id": { + "type": "string" + } + }, + "required": [ + "trace_id" + ] + }, + "then": { + "properties": { + "parent_id": { + "type": "string" + } + }, + "required": [ + "parent_id" + ] + } + }, + { + "if": { + "properties": { + "transaction_id": { + "type": "string" + } + }, + "required": [ + "transaction_id" + ] + }, + "then": { + "properties": { + "trace_id": { + "type": "string" + } + }, + "required": [ + "trace_id" + ] + } + }, + { + "if": { + "properties": { + "parent_id": { + "type": "string" + } + }, + "required": [ + "parent_id" + ] + }, + "then": { + "properties": { + "trace_id": { + "type": "string" + } + }, + "required": [ + "trace_id" + ] + } + } + ], + "anyOf": [ + { + "properties": { + "exception": { + "type": "object" + } + }, + "required": [ + "exception" + ] + }, + { + "properties": { + "log": { + "type": "object" + } + }, + "required": [ + "log" + ] + } + ] +}` + +<DocCode children={snippet} /> \ No newline at end of file diff --git a/docs/en/serverless/transclusion/apm/guide/spec/v2/metadata.mdx b/docs/en/serverless/transclusion/apm/guide/spec/v2/metadata.mdx new file mode 100644 index 0000000000..a4cfb12600 --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/spec/v2/metadata.mdx @@ -0,0 +1,570 @@ +export const snippet = ` +{ + "$id": "docs/spec/v2/metadata", + "type": "object", + "properties": { + "cloud": { + "description": "Cloud metadata about where the monitored service is running.", + "type": [ + "null", + "object" + ], + "properties": { + "account": { + "description": "Account where the monitored service is running.", + "type": [ + "null", + "object" + ], + "properties": { + "id": { + "description": "ID of the cloud account.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "name": { + "description": "Name of the cloud account.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "availability_zone": { + "description": "AvailabilityZone where the monitored service is running, e.g. us-east-1a", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "instance": { + "description": "Instance on which the monitored service is running.", + "type": [ + "null", + "object" + ], + "properties": { + "id": { + "description": "ID of the cloud instance.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "name": { + "description": "Name of the cloud instance.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "machine": { + "description": "Machine on which the monitored service is running.", + "type": [ + "null", + "object" + ], + "properties": { + "type": { + "description": "ID of the cloud machine.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "project": { + "description": "Project in which the monitored service is running.", + "type": [ + "null", + "object" + ], + "properties": { + "id": { + "description": "ID of the cloud project.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "name": { + "description": "Name of the cloud project.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "provider": { + "description": "Provider that is used, e.g. aws, azure, gcp, digitalocean.", + "type": "string", + "maxLength": 1024 + }, + "region": { + "description": "Region where the monitored service is running, e.g. us-east-1", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "service": { + "description": "Service that is monitored on cloud", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Name of the cloud service, intended to distinguish services running on different platforms within a provider, eg AWS EC2 vs Lambda, GCP GCE vs App Engine, Azure VM vs App Server.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + } + }, + "required": [ + "provider" + ] + }, + "labels": { + "description": "Labels are a flat mapping of user-defined tags. Allowed value types are string, boolean and number values. Labels are indexed and searchable.", + "type": [ + "null", + "object" + ], + "additionalProperties": { + "type": [ + "null", + "string", + "boolean", + "number" + ], + "maxLength": 1024 + } + }, + "network": { + "description": "Network holds information about the network over which the monitored service is communicating.", + "type": [ + "null", + "object" + ], + "properties": { + "connection": { + "type": [ + "null", + "object" + ], + "properties": { + "type": { + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + } + } + }, + "process": { + "description": "Process metadata about the monitored service.", + "type": [ + "null", + "object" + ], + "properties": { + "argv": { + "description": "Argv holds the command line arguments used to start this process.", + "type": [ + "null", + "array" + ], + "items": { + "type": "string" + }, + "minItems": 0 + }, + "pid": { + "description": "PID holds the process ID of the service.", + "type": "integer" + }, + "ppid": { + "description": "Ppid holds the parent process ID of the service.", + "type": [ + "null", + "integer" + ] + }, + "title": { + "description": "Title is the process title. It can be the same as process name.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + }, + "required": [ + "pid" + ] + }, + "service": { + "description": "Service metadata about the monitored service.", + "type": "object", + "properties": { + "agent": { + "description": "Agent holds information about the APM agent capturing the event.", + "type": "object", + "properties": { + "activation_method": { + "description": "ActivationMethod of the APM agent capturing information.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "ephemeral_id": { + "description": "EphemeralID is a free format ID used for metrics correlation by agents", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "name": { + "description": "Name of the APM agent capturing information.", + "type": "string", + "maxLength": 1024, + "minLength": 1 + }, + "version": { + "description": "Version of the APM agent capturing information.", + "type": "string", + "maxLength": 1024 + } + }, + "required": [ + "name", + "version" + ] + }, + "environment": { + "description": "Environment in which the monitored service is running, e.g. \`production\` or \`staging\`.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "framework": { + "description": "Framework holds information about the framework used in the monitored service.", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Name of the used framework", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "version": { + "description": "Version of the used framework", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "id": { + "description": "ID holds a unique identifier for the running service.", + "type": [ + "null", + "string" + ] + }, + "language": { + "description": "Language holds information about the programming language of the monitored service.", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Name of the used programming language", + "type": "string", + "maxLength": 1024 + }, + "version": { + "description": "Version of the used programming language", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + }, + "required": [ + "name" + ] + }, + "name": { + "description": "Name of the monitored service.", + "type": "string", + "maxLength": 1024, + "minLength": 1, + "pattern": "^[a-zA-Z0-9 _-]+$" + }, + "node": { + "description": "Node must be a unique meaningful name of the service node.", + "type": [ + "null", + "object" + ], + "properties": { + "configured_name": { + "description": "Name of the service node", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "runtime": { + "description": "Runtime holds information about the language runtime running the monitored service", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Name of the language runtime", + "type": "string", + "maxLength": 1024 + }, + "version": { + "description": "Name of the language runtime", + "type": "string", + "maxLength": 1024 + } + }, + "required": [ + "name", + "version" + ] + }, + "version": { + "description": "Version of the monitored service.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + }, + "required": [ + "agent", + "name" + ] + }, + "system": { + "description": "System metadata", + "type": [ + "null", + "object" + ], + "properties": { + "architecture": { + "description": "Architecture of the system the monitored service is running on.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "configured_hostname": { + "description": "ConfiguredHostname is the configured name of the host the monitored service is running on. It should only be sent when configured by the user. If given, it is used as the event's hostname.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "container": { + "description": "Container holds the system's container ID if available.", + "type": [ + "null", + "object" + ], + "properties": { + "id": { + "description": "ID of the container the monitored service is running in.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "detected_hostname": { + "description": "DetectedHostname is the hostname detected by the APM agent. It usually contains what the hostname command returns on the host machine. It will be used as the event's hostname if ConfiguredHostname is not present.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "hostname": { + "description": "Deprecated: Use ConfiguredHostname and DetectedHostname instead. DeprecatedHostname is the host name of the system the service is running on. It does not distinguish between configured and detected hostname and therefore is deprecated and only used if no other hostname information is available.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "kubernetes": { + "description": "Kubernetes system information if the monitored service runs on Kubernetes.", + "type": [ + "null", + "object" + ], + "properties": { + "namespace": { + "description": "Namespace of the Kubernetes resource the monitored service is run on.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "node": { + "description": "Node related information", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Name of the Kubernetes Node", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "pod": { + "description": "Pod related information", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Name of the Kubernetes Pod", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "uid": { + "description": "UID is the system-generated string uniquely identifying the Pod.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + } + } + }, + "platform": { + "description": "Platform name of the system platform the monitored service is running on.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "user": { + "description": "User metadata, which can be overwritten on a per event basis.", + "type": [ + "null", + "object" + ], + "properties": { + "domain": { + "description": "Domain of the logged in user", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "email": { + "description": "Email of the user.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "id": { + "description": "ID identifies the logged in user, e.g. can be the primary key of the user", + "type": [ + "null", + "string", + "integer" + ], + "maxLength": 1024 + }, + "username": { + "description": "Name of the user.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + } + }, + "required": [ + "service" + ] +}` + +<DocCode children={snippet} /> \ No newline at end of file diff --git a/docs/en/serverless/transclusion/apm/guide/spec/v2/metricset.mdx b/docs/en/serverless/transclusion/apm/guide/spec/v2/metricset.mdx new file mode 100644 index 0000000000..5e47004d9a --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/spec/v2/metricset.mdx @@ -0,0 +1,304 @@ +export const snippet = ` +{ + "$id": "docs/spec/v2/metricset", + "type": "object", + "properties": { + "faas": { + "description": "FAAS holds fields related to Function as a Service events.", + "type": [ + "null", + "object" + ], + "properties": { + "coldstart": { + "description": "Indicates whether a function invocation was a cold start or not.", + "type": [ + "null", + "boolean" + ] + }, + "execution": { + "description": "The request id of the function invocation.", + "type": [ + "null", + "string" + ] + }, + "id": { + "description": "A unique identifier of the invoked serverless function.", + "type": [ + "null", + "string" + ] + }, + "name": { + "description": "The lambda function name.", + "type": [ + "null", + "string" + ] + }, + "trigger": { + "description": "Trigger attributes.", + "type": [ + "null", + "object" + ], + "properties": { + "request_id": { + "description": "The id of the origin trigger request.", + "type": [ + "null", + "string" + ] + }, + "type": { + "description": "The trigger type.", + "type": [ + "null", + "string" + ] + } + } + }, + "version": { + "description": "The lambda function version.", + "type": [ + "null", + "string" + ] + } + } + }, + "samples": { + "description": "Samples hold application metrics collected from the agent.", + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^[^*\"]*$": { + "type": [ + "null", + "object" + ], + "properties": { + "counts": { + "description": "Counts holds the bucket counts for histogram metrics. These numbers must be positive or zero. If Counts is specified, then Values is expected to be specified with the same number of elements, and with the same order.", + "type": [ + "null", + "array" + ], + "items": { + "type": "integer", + "minimum": 0 + }, + "minItems": 0 + }, + "type": { + "description": "Type holds an optional metric type: gauge, counter, or histogram. If Type is unknown, it will be ignored.", + "type": [ + "null", + "string" + ] + }, + "unit": { + "description": "Unit holds an optional unit for the metric. - \"percent\" (value is in the range [0,1]) - \"byte\" - a time unit: \"nanos\", \"micros\", \"ms\", \"s\", \"m\", \"h\", \"d\" If Unit is unknown, it will be ignored.", + "type": [ + "null", + "string" + ] + }, + "value": { + "description": "Value holds the value of a single metric sample.", + "type": [ + "null", + "number" + ] + }, + "values": { + "description": "Values holds the bucket values for histogram metrics. Values must be provided in ascending order; failure to do so will result in the metric being discarded.", + "type": [ + "null", + "array" + ], + "items": { + "type": "number" + }, + "minItems": 0 + } + }, + "allOf": [ + { + "if": { + "properties": { + "counts": { + "type": "array" + } + }, + "required": [ + "counts" + ] + }, + "then": { + "properties": { + "values": { + "type": "array" + } + }, + "required": [ + "values" + ] + } + }, + { + "if": { + "properties": { + "values": { + "type": "array" + } + }, + "required": [ + "values" + ] + }, + "then": { + "properties": { + "counts": { + "type": "array" + } + }, + "required": [ + "counts" + ] + } + } + ], + "anyOf": [ + { + "properties": { + "value": { + "type": "number" + } + }, + "required": [ + "value" + ] + }, + { + "properties": { + "values": { + "type": "array" + } + }, + "required": [ + "values" + ] + } + ] + } + } + }, + "service": { + "description": "Service holds selected information about the correlated service.", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Name of the correlated service.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "version": { + "description": "Version of the correlated service.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "span": { + "description": "Span holds selected information about the correlated transaction.", + "type": [ + "null", + "object" + ], + "properties": { + "subtype": { + "description": "Subtype is a further sub-division of the type (e.g. postgresql, elasticsearch)", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "type": { + "description": "Type expresses the correlated span's type as keyword that has specific relevance within the service's domain, eg: 'request', 'backgroundjob'.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "tags": { + "description": "Tags are a flat mapping of user-defined tags. On the agent side, tags are called labels. Allowed value types are string, boolean and number values. Tags are indexed and searchable.", + "type": [ + "null", + "object" + ], + "additionalProperties": { + "type": [ + "null", + "string", + "boolean", + "number" + ], + "maxLength": 1024 + } + }, + "timestamp": { + "description": "Timestamp holds the recorded time of the event, UTC based and formatted as microseconds since Unix epoch", + "type": [ + "null", + "integer" + ] + }, + "transaction": { + "description": "Transaction holds selected information about the correlated transaction.", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Name of the correlated transaction.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "type": { + "description": "Type expresses the correlated transaction's type as keyword that has specific relevance within the service's domain, eg: 'request', 'backgroundjob'.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + } + }, + "required": [ + "samples" + ] +}` + +<DocCode children={snippet} /> \ No newline at end of file diff --git a/docs/en/serverless/transclusion/apm/guide/spec/v2/span.mdx b/docs/en/serverless/transclusion/apm/guide/spec/v2/span.mdx new file mode 100644 index 0000000000..6ac47163fb --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/spec/v2/span.mdx @@ -0,0 +1,906 @@ +export const snippet = ` +{ + "$id": "docs/spec/v2/span", + "type": "object", + "properties": { + "action": { + "description": "Action holds the specific kind of event within the sub-type represented by the span (e.g. query, connect)", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "child_ids": { + "description": "ChildIDs holds a list of successor transactions and/or spans.", + "type": [ + "null", + "array" + ], + "items": { + "type": "string", + "maxLength": 1024 + }, + "minItems": 0 + }, + "composite": { + "description": "Composite holds details on a group of spans represented by a single one.", + "type": [ + "null", + "object" + ], + "properties": { + "compression_strategy": { + "description": "A string value indicating which compression strategy was used. The valid values are \`exact_match\` and \`same_kind\`.", + "type": "string" + }, + "count": { + "description": "Count is the number of compressed spans the composite span represents. The minimum count is 2, as a composite span represents at least two spans.", + "type": "integer", + "minimum": 2 + }, + "sum": { + "description": "Sum is the durations of all compressed spans this composite span represents in milliseconds.", + "type": "number", + "minimum": 0 + } + }, + "required": [ + "compression_strategy", + "count", + "sum" + ] + }, + "context": { + "description": "Context holds arbitrary contextual information for the event.", + "type": [ + "null", + "object" + ], + "properties": { + "db": { + "description": "Database contains contextual data for database spans", + "type": [ + "null", + "object" + ], + "properties": { + "instance": { + "description": "Instance name of the database.", + "type": [ + "null", + "string" + ] + }, + "link": { + "description": "Link to the database server.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "rows_affected": { + "description": "RowsAffected shows the number of rows affected by the statement.", + "type": [ + "null", + "integer" + ] + }, + "statement": { + "description": "Statement of the recorded database event, e.g. query.", + "type": [ + "null", + "string" + ] + }, + "type": { + "description": "Type of the recorded database event., e.g. sql, cassandra, hbase, redis.", + "type": [ + "null", + "string" + ] + }, + "user": { + "description": "User is the username with which the database is accessed.", + "type": [ + "null", + "string" + ] + } + } + }, + "destination": { + "description": "Destination contains contextual data about the destination of spans", + "type": [ + "null", + "object" + ], + "properties": { + "address": { + "description": "Address is the destination network address: hostname (e.g. 'localhost'), FQDN (e.g. 'elastic.co'), IPv4 (e.g. '127.0.0.1') IPv6 (e.g. '::1')", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "port": { + "description": "Port is the destination network port (e.g. 443)", + "type": [ + "null", + "integer" + ] + }, + "service": { + "description": "Service describes the destination service", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Name is the identifier for the destination service, e.g. 'http://elastic.co', 'elasticsearch', 'rabbitmq' ( DEPRECATED: this field will be removed in a future release", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "resource": { + "description": "Resource identifies the destination service resource being operated on e.g. 'http://elastic.co:80', 'elasticsearch', 'rabbitmq/queue_name' DEPRECATED: this field will be removed in a future release", + "type": "string", + "maxLength": 1024 + }, + "type": { + "description": "Type of the destination service, e.g. db, elasticsearch. Should typically be the same as span.type. DEPRECATED: this field will be removed in a future release", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + }, + "required": [ + "resource" + ] + } + } + }, + "http": { + "description": "HTTP contains contextual information when the span concerns an HTTP request.", + "type": [ + "null", + "object" + ], + "properties": { + "method": { + "description": "Method holds information about the method of the HTTP request.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "request": { + "description": "Request describes the HTTP request information.", + "type": [ + "null", + "object" + ], + "properties": { + "id": { + "description": "ID holds the unique identifier for the http request.", + "type": [ + "null", + "string" + ] + } + } + }, + "response": { + "description": "Response describes the HTTP response information in case the event was created as a result of an HTTP request.", + "type": [ + "null", + "object" + ], + "properties": { + "decoded_body_size": { + "description": "DecodedBodySize holds the size of the decoded payload.", + "type": [ + "null", + "integer" + ] + }, + "encoded_body_size": { + "description": "EncodedBodySize holds the size of the encoded payload.", + "type": [ + "null", + "integer" + ] + }, + "headers": { + "description": "Headers holds the http headers sent in the http response.", + "type": [ + "null", + "object" + ], + "additionalProperties": false, + "patternProperties": { + "[.*]*$": { + "type": [ + "null", + "array", + "string" + ], + "items": { + "type": "string" + } + } + } + }, + "status_code": { + "description": "StatusCode sent in the http response.", + "type": [ + "null", + "integer" + ] + }, + "transfer_size": { + "description": "TransferSize holds the total size of the payload.", + "type": [ + "null", + "integer" + ] + } + } + }, + "status_code": { + "description": "Deprecated: Use Response.StatusCode instead. StatusCode sent in the http response.", + "type": [ + "null", + "integer" + ] + }, + "url": { + "description": "URL is the raw url of the correlating HTTP request.", + "type": [ + "null", + "string" + ] + } + } + }, + "message": { + "description": "Message holds details related to message receiving and publishing if the captured event integrates with a messaging system", + "type": [ + "null", + "object" + ], + "properties": { + "age": { + "description": "Age of the message. If the monitored messaging framework provides a timestamp for the message, agents may use it. Otherwise, the sending agent can add a timestamp in milliseconds since the Unix epoch to the message's metadata to be retrieved by the receiving agent. If a timestamp is not available, agents should omit this field.", + "type": [ + "null", + "object" + ], + "properties": { + "ms": { + "description": "Age of the message in milliseconds.", + "type": [ + "null", + "integer" + ] + } + } + }, + "body": { + "description": "Body of the received message, similar to an HTTP request body", + "type": [ + "null", + "string" + ] + }, + "headers": { + "description": "Headers received with the message, similar to HTTP request headers.", + "type": [ + "null", + "object" + ], + "additionalProperties": false, + "patternProperties": { + "[.*]*$": { + "type": [ + "null", + "array", + "string" + ], + "items": { + "type": "string" + } + } + } + }, + "queue": { + "description": "Queue holds information about the message queue where the message is received.", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Name holds the name of the message queue where the message is received.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "routing_key": { + "description": "RoutingKey holds the optional routing key of the received message as set on the queuing system, such as in RabbitMQ.", + "type": [ + "null", + "string" + ] + } + } + }, + "service": { + "description": "Service related information can be sent per span. Information provided here will override the more generic information retrieved from metadata, missing service fields will be retrieved from the metadata information.", + "type": [ + "null", + "object" + ], + "properties": { + "agent": { + "description": "Agent holds information about the APM agent capturing the event.", + "type": [ + "null", + "object" + ], + "properties": { + "ephemeral_id": { + "description": "EphemeralID is a free format ID used for metrics correlation by agents", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "name": { + "description": "Name of the APM agent capturing information.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "version": { + "description": "Version of the APM agent capturing information.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "environment": { + "description": "Environment in which the monitored service is running, e.g. \`production\` or \`staging\`.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "framework": { + "description": "Framework holds information about the framework used in the monitored service.", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Name of the used framework", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "version": { + "description": "Version of the used framework", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "id": { + "description": "ID holds a unique identifier for the service.", + "type": [ + "null", + "string" + ] + }, + "language": { + "description": "Language holds information about the programming language of the monitored service.", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Name of the used programming language", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "version": { + "description": "Version of the used programming language", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "name": { + "description": "Name of the monitored service.", + "type": [ + "null", + "string" + ], + "maxLength": 1024, + "pattern": "^[a-zA-Z0-9 _-]+$" + }, + "node": { + "description": "Node must be a unique meaningful name of the service node.", + "type": [ + "null", + "object" + ], + "properties": { + "configured_name": { + "description": "Name of the service node", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "origin": { + "description": "Origin contains the self-nested field groups for service.", + "type": [ + "null", + "object" + ], + "properties": { + "id": { + "description": "Immutable id of the service emitting this event.", + "type": [ + "null", + "string" + ] + }, + "name": { + "description": "Immutable name of the service emitting this event.", + "type": [ + "null", + "string" + ] + }, + "version": { + "description": "The version of the service the data was collected from.", + "type": [ + "null", + "string" + ] + } + } + }, + "runtime": { + "description": "Runtime holds information about the language runtime running the monitored service", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Name of the language runtime", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "version": { + "description": "Version of the language runtime", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "target": { + "description": "Target holds information about the outgoing service in case of an outgoing event", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Immutable name of the target service for the event", + "type": [ + "null", + "string" + ] + }, + "type": { + "description": "Immutable type of the target service for the event", + "type": [ + "null", + "string" + ] + } + }, + "anyOf": [ + { + "properties": { + "type": { + "type": "string" + } + }, + "required": [ + "type" + ] + }, + { + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ] + } + ] + }, + "version": { + "description": "Version of the monitored service.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "tags": { + "description": "Tags are a flat mapping of user-defined tags. On the agent side, tags are called labels. Allowed value types are string, boolean and number values. Tags are indexed and searchable.", + "type": [ + "null", + "object" + ], + "additionalProperties": { + "type": [ + "null", + "string", + "boolean", + "number" + ], + "maxLength": 1024 + } + } + } + }, + "duration": { + "description": "Duration of the span in milliseconds. When the span is a composite one, duration is the gross duration, including \"whitespace\" in between spans.", + "type": "number", + "minimum": 0 + }, + "id": { + "description": "ID holds the hex encoded 64 random bits ID of the event.", + "type": "string", + "maxLength": 1024 + }, + "links": { + "description": "Links holds links to other spans, potentially in other traces.", + "type": [ + "null", + "array" + ], + "items": { + "type": "object", + "properties": { + "span_id": { + "description": "SpanID holds the ID of the linked span.", + "type": "string", + "maxLength": 1024 + }, + "trace_id": { + "description": "TraceID holds the ID of the linked span's trace.", + "type": "string", + "maxLength": 1024 + } + }, + "required": [ + "span_id", + "trace_id" + ] + }, + "minItems": 0 + }, + "name": { + "description": "Name is the generic designation of a span in the scope of a transaction.", + "type": "string", + "maxLength": 1024 + }, + "otel": { + "description": "OTel contains unmapped OpenTelemetry attributes.", + "type": [ + "null", + "object" + ], + "properties": { + "attributes": { + "description": "Attributes hold the unmapped OpenTelemetry attributes.", + "type": [ + "null", + "object" + ] + }, + "span_kind": { + "description": "SpanKind holds the incoming OpenTelemetry span kind.", + "type": [ + "null", + "string" + ] + } + } + }, + "outcome": { + "description": "Outcome of the span: success, failure, or unknown. Outcome may be one of a limited set of permitted values describing the success or failure of the span. It can be used for calculating error rates for outgoing requests.", + "type": [ + "null", + "string" + ], + "enum": [ + "success", + "failure", + "unknown", + null + ] + }, + "parent_id": { + "description": "ParentID holds the hex encoded 64 random bits ID of the parent transaction or span.", + "type": "string", + "maxLength": 1024 + }, + "sample_rate": { + "description": "SampleRate applied to the monitored service at the time where this span was recorded.", + "type": [ + "null", + "number" + ] + }, + "stacktrace": { + "description": "Stacktrace connected to this span event.", + "type": [ + "null", + "array" + ], + "items": { + "type": "object", + "properties": { + "abs_path": { + "description": "AbsPath is the absolute path of the frame's file.", + "type": [ + "null", + "string" + ] + }, + "classname": { + "description": "Classname of the frame.", + "type": [ + "null", + "string" + ] + }, + "colno": { + "description": "ColumnNumber of the frame.", + "type": [ + "null", + "integer" + ] + }, + "context_line": { + "description": "ContextLine is the line from the frame's file.", + "type": [ + "null", + "string" + ] + }, + "filename": { + "description": "Filename is the relative name of the frame's file.", + "type": [ + "null", + "string" + ] + }, + "function": { + "description": "Function represented by the frame.", + "type": [ + "null", + "string" + ] + }, + "library_frame": { + "description": "LibraryFrame indicates whether the frame is from a third party library.", + "type": [ + "null", + "boolean" + ] + }, + "lineno": { + "description": "LineNumber of the frame.", + "type": [ + "null", + "integer" + ] + }, + "module": { + "description": "Module to which the frame belongs to.", + "type": [ + "null", + "string" + ] + }, + "post_context": { + "description": "PostContext is a slice of code lines immediately before the line from the frame's file.", + "type": [ + "null", + "array" + ], + "items": { + "type": "string" + }, + "minItems": 0 + }, + "pre_context": { + "description": "PreContext is a slice of code lines immediately after the line from the frame's file.", + "type": [ + "null", + "array" + ], + "items": { + "type": "string" + }, + "minItems": 0 + }, + "vars": { + "description": "Vars is a flat mapping of local variables of the frame.", + "type": [ + "null", + "object" + ] + } + }, + "anyOf": [ + { + "properties": { + "classname": { + "type": "string" + } + }, + "required": [ + "classname" + ] + }, + { + "properties": { + "filename": { + "type": "string" + } + }, + "required": [ + "filename" + ] + } + ] + }, + "minItems": 0 + }, + "start": { + "description": "Start is the offset relative to the transaction's timestamp identifying the start of the span, in milliseconds.", + "type": [ + "null", + "number" + ] + }, + "subtype": { + "description": "Subtype is a further sub-division of the type (e.g. postgresql, elasticsearch)", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "sync": { + "description": "Sync indicates whether the span was executed synchronously or asynchronously.", + "type": [ + "null", + "boolean" + ] + }, + "timestamp": { + "description": "Timestamp holds the recorded time of the event, UTC based and formatted as microseconds since Unix epoch", + "type": [ + "null", + "integer" + ] + }, + "trace_id": { + "description": "TraceID holds the hex encoded 128 random bits ID of the correlated trace.", + "type": "string", + "maxLength": 1024 + }, + "transaction_id": { + "description": "TransactionID holds the hex encoded 64 random bits ID of the correlated transaction.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "type": { + "description": "Type holds the span's type, and can have specific keywords within the service's domain (eg: 'request', 'backgroundjob', etc)", + "type": "string", + "maxLength": 1024 + } + }, + "required": [ + "id", + "trace_id", + "name", + "parent_id", + "type", + "duration" + ], + "anyOf": [ + { + "properties": { + "start": { + "type": "number" + } + }, + "required": [ + "start" + ] + }, + { + "properties": { + "timestamp": { + "type": "integer" + } + }, + "required": [ + "timestamp" + ] + } + ] +}` + +<DocCode children={snippet} /> \ No newline at end of file diff --git a/docs/en/serverless/transclusion/apm/guide/spec/v2/transaction.mdx b/docs/en/serverless/transclusion/apm/guide/spec/v2/transaction.mdx new file mode 100644 index 0000000000..610c92fa2a --- /dev/null +++ b/docs/en/serverless/transclusion/apm/guide/spec/v2/transaction.mdx @@ -0,0 +1,1134 @@ +export const snippet = ` +{ + "$id": "docs/spec/v2/transaction", + "type": "object", + "properties": { + "context": { + "description": "Context holds arbitrary contextual information for the event.", + "type": [ + "null", + "object" + ], + "properties": { + "cloud": { + "description": "Cloud holds fields related to the cloud or infrastructure the events are coming from.", + "type": [ + "null", + "object" + ], + "properties": { + "origin": { + "description": "Origin contains the self-nested field groups for cloud.", + "type": [ + "null", + "object" + ], + "properties": { + "account": { + "description": "The cloud account or organization id used to identify different entities in a multi-tenant environment.", + "type": [ + "null", + "object" + ], + "properties": { + "id": { + "description": "The cloud account or organization id used to identify different entities in a multi-tenant environment.", + "type": [ + "null", + "string" + ] + } + } + }, + "provider": { + "description": "Name of the cloud provider.", + "type": [ + "null", + "string" + ] + }, + "region": { + "description": "Region in which this host, resource, or service is located.", + "type": [ + "null", + "string" + ] + }, + "service": { + "description": "The cloud service name is intended to distinguish services running on different platforms within a provider.", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "The cloud service name is intended to distinguish services running on different platforms within a provider.", + "type": [ + "null", + "string" + ] + } + } + } + } + } + } + }, + "custom": { + "description": "Custom can contain additional metadata to be stored with the event. The format is unspecified and can be deeply nested objects. The information will not be indexed or searchable in Elasticsearch.", + "type": [ + "null", + "object" + ] + }, + "message": { + "description": "Message holds details related to message receiving and publishing if the captured event integrates with a messaging system", + "type": [ + "null", + "object" + ], + "properties": { + "age": { + "description": "Age of the message. If the monitored messaging framework provides a timestamp for the message, agents may use it. Otherwise, the sending agent can add a timestamp in milliseconds since the Unix epoch to the message's metadata to be retrieved by the receiving agent. If a timestamp is not available, agents should omit this field.", + "type": [ + "null", + "object" + ], + "properties": { + "ms": { + "description": "Age of the message in milliseconds.", + "type": [ + "null", + "integer" + ] + } + } + }, + "body": { + "description": "Body of the received message, similar to an HTTP request body", + "type": [ + "null", + "string" + ] + }, + "headers": { + "description": "Headers received with the message, similar to HTTP request headers.", + "type": [ + "null", + "object" + ], + "additionalProperties": false, + "patternProperties": { + "[.*]*$": { + "type": [ + "null", + "array", + "string" + ], + "items": { + "type": "string" + } + } + } + }, + "queue": { + "description": "Queue holds information about the message queue where the message is received.", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Name holds the name of the message queue where the message is received.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "routing_key": { + "description": "RoutingKey holds the optional routing key of the received message as set on the queuing system, such as in RabbitMQ.", + "type": [ + "null", + "string" + ] + } + } + }, + "page": { + "description": "Page holds information related to the current page and page referers. It is only sent from RUM agents.", + "type": [ + "null", + "object" + ], + "properties": { + "referer": { + "description": "Referer holds the URL of the page that 'linked' to the current page.", + "type": [ + "null", + "string" + ] + }, + "url": { + "description": "URL of the current page", + "type": [ + "null", + "string" + ] + } + } + }, + "request": { + "description": "Request describes the HTTP request information in case the event was created as a result of an HTTP request.", + "type": [ + "null", + "object" + ], + "properties": { + "body": { + "description": "Body only contais the request bod, not the query string information. It can either be a dictionary (for standard HTTP requests) or a raw request body.", + "type": [ + "null", + "string", + "object" + ] + }, + "cookies": { + "description": "Cookies used by the request, parsed as key-value objects.", + "type": [ + "null", + "object" + ] + }, + "env": { + "description": "Env holds environment variable information passed to the monitored service.", + "type": [ + "null", + "object" + ] + }, + "headers": { + "description": "Headers includes any HTTP headers sent by the requester. Cookies will be taken by headers if supplied.", + "type": [ + "null", + "object" + ], + "additionalProperties": false, + "patternProperties": { + "[.*]*$": { + "type": [ + "null", + "array", + "string" + ], + "items": { + "type": "string" + } + } + } + }, + "http_version": { + "description": "HTTPVersion holds information about the used HTTP version.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "method": { + "description": "Method holds information about the method of the HTTP request.", + "type": "string", + "maxLength": 1024 + }, + "socket": { + "description": "Socket holds information related to the recorded request, such as whether or not data were encrypted and the remote address.", + "type": [ + "null", + "object" + ], + "properties": { + "encrypted": { + "description": "Encrypted indicates whether a request was sent as TLS/HTTPS request. DEPRECATED: this field will be removed in a future release.", + "type": [ + "null", + "boolean" + ] + }, + "remote_address": { + "description": "RemoteAddress holds the network address sending the request. It should be obtained through standard APIs and not be parsed from any headers like 'Forwarded'.", + "type": [ + "null", + "string" + ] + } + } + }, + "url": { + "description": "URL holds information sucha as the raw URL, scheme, host and path.", + "type": [ + "null", + "object" + ], + "properties": { + "full": { + "description": "Full, possibly agent-assembled URL of the request, e.g. https://example.com:443/search?q=elasticsearch#top.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "hash": { + "description": "Hash of the request URL, e.g. 'top'", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "hostname": { + "description": "Hostname information of the request, e.g. 'example.com'.\"", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "pathname": { + "description": "Path of the request, e.g. '/search'", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "port": { + "description": "Port of the request, e.g. '443'. Can be sent as string or int.", + "type": [ + "null", + "string", + "integer" + ], + "maxLength": 1024 + }, + "protocol": { + "description": "Protocol information for the recorded request, e.g. 'https:'.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "raw": { + "description": "Raw unparsed URL of the HTTP request line, e.g https://example.com:443/search?q=elasticsearch. This URL may be absolute or relative. For more details, see https://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html#sec5.1.2.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "search": { + "description": "Search contains the query string information of the request. It is expected to have values delimited by ampersands.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + } + }, + "required": [ + "method" + ] + }, + "response": { + "description": "Response describes the HTTP response information in case the event was created as a result of an HTTP request.", + "type": [ + "null", + "object" + ], + "properties": { + "decoded_body_size": { + "description": "DecodedBodySize holds the size of the decoded payload.", + "type": [ + "null", + "integer" + ] + }, + "encoded_body_size": { + "description": "EncodedBodySize holds the size of the encoded payload.", + "type": [ + "null", + "integer" + ] + }, + "finished": { + "description": "Finished indicates whether the response was finished or not.", + "type": [ + "null", + "boolean" + ] + }, + "headers": { + "description": "Headers holds the http headers sent in the http response.", + "type": [ + "null", + "object" + ], + "additionalProperties": false, + "patternProperties": { + "[.*]*$": { + "type": [ + "null", + "array", + "string" + ], + "items": { + "type": "string" + } + } + } + }, + "headers_sent": { + "description": "HeadersSent indicates whether http headers were sent.", + "type": [ + "null", + "boolean" + ] + }, + "status_code": { + "description": "StatusCode sent in the http response.", + "type": [ + "null", + "integer" + ] + }, + "transfer_size": { + "description": "TransferSize holds the total size of the payload.", + "type": [ + "null", + "integer" + ] + } + } + }, + "service": { + "description": "Service related information can be sent per event. Information provided here will override the more generic information retrieved from metadata, missing service fields will be retrieved from the metadata information.", + "type": [ + "null", + "object" + ], + "properties": { + "agent": { + "description": "Agent holds information about the APM agent capturing the event.", + "type": [ + "null", + "object" + ], + "properties": { + "ephemeral_id": { + "description": "EphemeralID is a free format ID used for metrics correlation by agents", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "name": { + "description": "Name of the APM agent capturing information.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "version": { + "description": "Version of the APM agent capturing information.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "environment": { + "description": "Environment in which the monitored service is running, e.g. \`production\` or \`staging\`.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "framework": { + "description": "Framework holds information about the framework used in the monitored service.", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Name of the used framework", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "version": { + "description": "Version of the used framework", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "id": { + "description": "ID holds a unique identifier for the service.", + "type": [ + "null", + "string" + ] + }, + "language": { + "description": "Language holds information about the programming language of the monitored service.", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Name of the used programming language", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "version": { + "description": "Version of the used programming language", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "name": { + "description": "Name of the monitored service.", + "type": [ + "null", + "string" + ], + "maxLength": 1024, + "pattern": "^[a-zA-Z0-9 _-]+$" + }, + "node": { + "description": "Node must be a unique meaningful name of the service node.", + "type": [ + "null", + "object" + ], + "properties": { + "configured_name": { + "description": "Name of the service node", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "origin": { + "description": "Origin contains the self-nested field groups for service.", + "type": [ + "null", + "object" + ], + "properties": { + "id": { + "description": "Immutable id of the service emitting this event.", + "type": [ + "null", + "string" + ] + }, + "name": { + "description": "Immutable name of the service emitting this event.", + "type": [ + "null", + "string" + ] + }, + "version": { + "description": "The version of the service the data was collected from.", + "type": [ + "null", + "string" + ] + } + } + }, + "runtime": { + "description": "Runtime holds information about the language runtime running the monitored service", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Name of the language runtime", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "version": { + "description": "Version of the language runtime", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "target": { + "description": "Target holds information about the outgoing service in case of an outgoing event", + "type": [ + "null", + "object" + ], + "properties": { + "name": { + "description": "Immutable name of the target service for the event", + "type": [ + "null", + "string" + ] + }, + "type": { + "description": "Immutable type of the target service for the event", + "type": [ + "null", + "string" + ] + } + }, + "anyOf": [ + { + "properties": { + "type": { + "type": "string" + } + }, + "required": [ + "type" + ] + }, + { + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ] + } + ] + }, + "version": { + "description": "Version of the monitored service.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + }, + "tags": { + "description": "Tags are a flat mapping of user-defined tags. On the agent side, tags are called labels. Allowed value types are string, boolean and number values. Tags are indexed and searchable.", + "type": [ + "null", + "object" + ], + "additionalProperties": { + "type": [ + "null", + "string", + "boolean", + "number" + ], + "maxLength": 1024 + } + }, + "user": { + "description": "User holds information about the correlated user for this event. If user data are provided here, all user related information from metadata is ignored, otherwise the metadata's user information will be stored with the event.", + "type": [ + "null", + "object" + ], + "properties": { + "domain": { + "description": "Domain of the logged in user", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "email": { + "description": "Email of the user.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "id": { + "description": "ID identifies the logged in user, e.g. can be the primary key of the user", + "type": [ + "null", + "string", + "integer" + ], + "maxLength": 1024 + }, + "username": { + "description": "Name of the user.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + } + } + } + } + }, + "dropped_spans_stats": { + "description": "DroppedSpanStats holds information about spans that were dropped (for example due to transaction_max_spans or exit_span_min_duration).", + "type": [ + "null", + "array" + ], + "items": { + "type": "object", + "properties": { + "destination_service_resource": { + "description": "DestinationServiceResource identifies the destination service resource being operated on. e.g. 'http://elastic.co:80', 'elasticsearch', 'rabbitmq/queue_name'.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "duration": { + "description": "Duration holds duration aggregations about the dropped span.", + "type": [ + "null", + "object" + ], + "properties": { + "count": { + "description": "Count holds the number of times the dropped span happened.", + "type": [ + "null", + "integer" + ], + "minimum": 1 + }, + "sum": { + "description": "Sum holds dimensions about the dropped span's duration.", + "type": [ + "null", + "object" + ], + "properties": { + "us": { + "description": "Us represents the summation of the span duration.", + "type": [ + "null", + "integer" + ], + "minimum": 0 + } + } + } + } + }, + "outcome": { + "description": "Outcome of the span: success, failure, or unknown. Outcome may be one of a limited set of permitted values describing the success or failure of the span. It can be used for calculating error rates for outgoing requests.", + "type": [ + "null", + "string" + ], + "enum": [ + "success", + "failure", + "unknown", + null + ] + }, + "service_target_name": { + "description": "ServiceTargetName identifies the instance name of the target service being operated on", + "type": [ + "null", + "string" + ], + "maxLength": 512 + }, + "service_target_type": { + "description": "ServiceTargetType identifies the type of the target service being operated on e.g. 'oracle', 'rabbitmq'", + "type": [ + "null", + "string" + ], + "maxLength": 512 + } + } + }, + "minItems": 0 + }, + "duration": { + "description": "Duration how long the transaction took to complete, in milliseconds with 3 decimal points.", + "type": "number", + "minimum": 0 + }, + "experience": { + "description": "UserExperience holds metrics for measuring real user experience. This information is only sent by RUM agents.", + "type": [ + "null", + "object" + ], + "properties": { + "cls": { + "description": "CumulativeLayoutShift holds the Cumulative Layout Shift (CLS) metric value, or a negative value if CLS is unknown. See https://web.dev/cls/", + "type": [ + "null", + "number" + ], + "minimum": 0 + }, + "fid": { + "description": "FirstInputDelay holds the First Input Delay (FID) metric value, or a negative value if FID is unknown. See https://web.dev/fid/", + "type": [ + "null", + "number" + ], + "minimum": 0 + }, + "longtask": { + "description": "Longtask holds longtask duration/count metrics.", + "type": [ + "null", + "object" + ], + "properties": { + "count": { + "description": "Count is the total number of of longtasks.", + "type": "integer", + "minimum": 0 + }, + "max": { + "description": "Max longtask duration", + "type": "number", + "minimum": 0 + }, + "sum": { + "description": "Sum of longtask durations", + "type": "number", + "minimum": 0 + } + }, + "required": [ + "count", + "max", + "sum" + ] + }, + "tbt": { + "description": "TotalBlockingTime holds the Total Blocking Time (TBT) metric value, or a negative value if TBT is unknown. See https://web.dev/tbt/", + "type": [ + "null", + "number" + ], + "minimum": 0 + } + } + }, + "faas": { + "description": "FAAS holds fields related to Function as a Service events.", + "type": [ + "null", + "object" + ], + "properties": { + "coldstart": { + "description": "Indicates whether a function invocation was a cold start or not.", + "type": [ + "null", + "boolean" + ] + }, + "execution": { + "description": "The request id of the function invocation.", + "type": [ + "null", + "string" + ] + }, + "id": { + "description": "A unique identifier of the invoked serverless function.", + "type": [ + "null", + "string" + ] + }, + "name": { + "description": "The lambda function name.", + "type": [ + "null", + "string" + ] + }, + "trigger": { + "description": "Trigger attributes.", + "type": [ + "null", + "object" + ], + "properties": { + "request_id": { + "description": "The id of the origin trigger request.", + "type": [ + "null", + "string" + ] + }, + "type": { + "description": "The trigger type.", + "type": [ + "null", + "string" + ] + } + } + }, + "version": { + "description": "The lambda function version.", + "type": [ + "null", + "string" + ] + } + } + }, + "id": { + "description": "ID holds the hex encoded 64 random bits ID of the event.", + "type": "string", + "maxLength": 1024 + }, + "links": { + "description": "Links holds links to other spans, potentially in other traces.", + "type": [ + "null", + "array" + ], + "items": { + "type": "object", + "properties": { + "span_id": { + "description": "SpanID holds the ID of the linked span.", + "type": "string", + "maxLength": 1024 + }, + "trace_id": { + "description": "TraceID holds the ID of the linked span's trace.", + "type": "string", + "maxLength": 1024 + } + }, + "required": [ + "span_id", + "trace_id" + ] + }, + "minItems": 0 + }, + "marks": { + "description": "Marks capture the timing of a significant event during the lifetime of a transaction. Marks are organized into groups and can be set by the user or the agent. Marks are only reported by RUM agents.", + "type": [ + "null", + "object" + ], + "additionalProperties": { + "type": [ + "null", + "object" + ], + "additionalProperties": { + "type": [ + "null", + "number" + ] + } + } + }, + "name": { + "description": "Name is the generic designation of a transaction in the scope of a single service, eg: 'GET /users/:id'.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "otel": { + "description": "OTel contains unmapped OpenTelemetry attributes.", + "type": [ + "null", + "object" + ], + "properties": { + "attributes": { + "description": "Attributes hold the unmapped OpenTelemetry attributes.", + "type": [ + "null", + "object" + ] + }, + "span_kind": { + "description": "SpanKind holds the incoming OpenTelemetry span kind.", + "type": [ + "null", + "string" + ] + } + } + }, + "outcome": { + "description": "Outcome of the transaction with a limited set of permitted values, describing the success or failure of the transaction from the service's perspective. It is used for calculating error rates for incoming requests. Permitted values: success, failure, unknown.", + "type": [ + "null", + "string" + ], + "enum": [ + "success", + "failure", + "unknown", + null + ] + }, + "parent_id": { + "description": "ParentID holds the hex encoded 64 random bits ID of the parent transaction or span.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "result": { + "description": "Result of the transaction. For HTTP-related transactions, this should be the status code formatted like 'HTTP 2xx'.", + "type": [ + "null", + "string" + ], + "maxLength": 1024 + }, + "sample_rate": { + "description": "SampleRate applied to the monitored service at the time where this transaction was recorded. Allowed values are [0..1]. A SampleRate \u003c1 indicates that not all spans are recorded.", + "type": [ + "null", + "number" + ] + }, + "sampled": { + "description": "Sampled indicates whether or not the full information for a transaction is captured. If a transaction is unsampled no spans and less context information will be reported.", + "type": [ + "null", + "boolean" + ] + }, + "session": { + "description": "Session holds optional transaction session information for RUM.", + "type": [ + "null", + "object" + ], + "properties": { + "id": { + "description": "ID holds a session ID for grouping a set of related transactions.", + "type": "string", + "maxLength": 1024 + }, + "sequence": { + "description": "Sequence holds an optional sequence number for a transaction within a session. It is not meaningful to compare sequences across two different sessions.", + "type": [ + "null", + "integer" + ], + "minimum": 1 + } + }, + "required": [ + "id" + ] + }, + "span_count": { + "description": "SpanCount counts correlated spans.", + "type": "object", + "properties": { + "dropped": { + "description": "Dropped is the number of correlated spans that have been dropped by the APM agent recording the transaction.", + "type": [ + "null", + "integer" + ] + }, + "started": { + "description": "Started is the number of correlated spans that are recorded.", + "type": "integer" + } + }, + "required": [ + "started" + ] + }, + "timestamp": { + "description": "Timestamp holds the recorded time of the event, UTC based and formatted as microseconds since Unix epoch", + "type": [ + "null", + "integer" + ] + }, + "trace_id": { + "description": "TraceID holds the hex encoded 128 random bits ID of the correlated trace.", + "type": "string", + "maxLength": 1024 + }, + "type": { + "description": "Type expresses the transaction's type as keyword that has specific relevance within the service's domain, eg: 'request', 'backgroundjob'.", + "type": "string", + "maxLength": 1024 + } + }, + "required": [ + "trace_id", + "id", + "type", + "span_count", + "duration" + ] +}` + +<DocCode children={snippet} /> \ No newline at end of file From bb85443ff4e9088baded4cce649dd6cd0793372d Mon Sep 17 00:00:00 2001 From: Colleen McGinnis <colleen.mcginnis@elastic.co> Date: Mon, 4 Nov 2024 17:09:24 -0600 Subject: [PATCH 12/13] use asciidoc-dir --- docs/en/serverless/index.asciidoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/en/serverless/index.asciidoc b/docs/en/serverless/index.asciidoc index 174f290f1f..1e86377d1e 100644 --- a/docs/en/serverless/index.asciidoc +++ b/docs/en/serverless/index.asciidoc @@ -1,7 +1,7 @@ :doctype: book -include::{docs-root}/shared/versions/stack/{source_branch}.asciidoc[] -include::{docs-root}/shared/attributes.asciidoc[] +include::{asciidoc-dir}/../../shared/versions/stack/master.asciidoc[] +include::{asciidoc-dir}/../../shared/attributes.asciidoc[] [[what-is-observability-serverless]] == Elastic Observability serverless From 0cb766c055bf8c3e7e21d0a38b0f949897440759 Mon Sep 17 00:00:00 2001 From: Colleen McGinnis <colleen.mcginnis@elastic.co> Date: Mon, 4 Nov 2024 17:53:26 -0600 Subject: [PATCH 13/13] comment out description and keywords --- docs/en/serverless/ai-assistant/ai-assistant.asciidoc | 2 +- docs/en/serverless/aiops/aiops-analyze-spikes.asciidoc | 4 ++-- docs/en/serverless/aiops/aiops-detect-anomalies.asciidoc | 4 ++-- docs/en/serverless/aiops/aiops-detect-change-points.asciidoc | 4 ++-- docs/en/serverless/aiops/aiops-forecast-anomaly.asciidoc | 4 ++-- .../aiops/aiops-tune-anomaly-detection-job.asciidoc | 4 ++-- docs/en/serverless/aiops/aiops.asciidoc | 4 ++-- docs/en/serverless/alerting/aggregation-options.asciidoc | 4 ++-- .../alerting/aiops-generate-anomaly-alerts.asciidoc | 4 ++-- docs/en/serverless/alerting/alerting.asciidoc | 4 ++-- .../en/serverless/alerting/create-anomaly-alert-rule.asciidoc | 4 ++-- .../alerting/create-custom-threshold-alert-rule.asciidoc | 4 ++-- .../alerting/create-elasticsearch-query-alert-rule.asciidoc | 4 ++-- .../alerting/create-error-count-threshold-alert-rule.asciidoc | 4 ++-- ...eate-failed-transaction-rate-threshold-alert-rule.asciidoc | 4 ++-- .../alerting/create-inventory-threshold-alert-rule.asciidoc | 4 ++-- .../alerting/create-latency-threshold-alert-rule.asciidoc | 4 ++-- docs/en/serverless/alerting/create-manage-rules.asciidoc | 4 ++-- .../alerting/create-slo-burn-rate-alert-rule.asciidoc | 4 ++-- docs/en/serverless/alerting/rate-aggregation.asciidoc | 4 ++-- .../alerting/synthetic-monitor-status-alert.asciidoc | 4 ++-- .../alerting/triage-slo-burn-rate-breaches.asciidoc | 4 ++-- .../en/serverless/alerting/triage-threshold-breaches.asciidoc | 4 ++-- docs/en/serverless/alerting/view-alerts.asciidoc | 4 ++-- .../apm-agents/apm-agents-aws-lambda-functions.asciidoc | 4 ++-- .../apm-agents/apm-agents-elastic-apm-agents.asciidoc | 2 +- .../apm-agents-opentelemetry-collect-metrics.asciidoc | 2 +- .../apm-agents/apm-agents-opentelemetry-limitations.asciidoc | 2 +- ...agents-opentelemetry-opentelemetry-native-support.asciidoc | 2 +- .../apm-agents-opentelemetry-resource-attributes.asciidoc | 2 +- .../serverless/apm-agents/apm-agents-opentelemetry.asciidoc | 2 +- docs/en/serverless/apm/apm-compress-spans.asciidoc | 4 ++-- docs/en/serverless/apm/apm-create-custom-links.asciidoc | 2 +- docs/en/serverless/apm/apm-data-types.asciidoc | 4 ++-- docs/en/serverless/apm/apm-distributed-tracing.asciidoc | 4 ++-- docs/en/serverless/apm/apm-filter-your-data.asciidoc | 2 +- ...find-transaction-latency-and-failure-correlations.asciidoc | 2 +- docs/en/serverless/apm/apm-get-started.asciidoc | 4 ++-- .../apm/apm-integrate-with-machine-learning.asciidoc | 2 +- docs/en/serverless/apm/apm-keep-data-secure.asciidoc | 4 ++-- docs/en/serverless/apm/apm-kibana-settings.asciidoc | 2 +- docs/en/serverless/apm/apm-observe-lambda-functions.asciidoc | 2 +- docs/en/serverless/apm/apm-query-your-data.asciidoc | 2 +- docs/en/serverless/apm/apm-reduce-your-data-usage.asciidoc | 4 ++-- docs/en/serverless/apm/apm-reference.asciidoc | 2 +- docs/en/serverless/apm/apm-send-traces-to-elastic.asciidoc | 2 +- docs/en/serverless/apm/apm-server-api.asciidoc | 2 +- docs/en/serverless/apm/apm-stacktrace-collection.asciidoc | 4 ++-- .../apm/apm-track-deployments-with-annotations.asciidoc | 2 +- docs/en/serverless/apm/apm-transaction-sampling.asciidoc | 4 ++-- docs/en/serverless/apm/apm-troubleshooting.asciidoc | 2 +- docs/en/serverless/apm/apm-ui-dependencies.asciidoc | 2 +- docs/en/serverless/apm/apm-ui-errors.asciidoc | 2 +- docs/en/serverless/apm/apm-ui-infrastructure.asciidoc | 2 +- docs/en/serverless/apm/apm-ui-logs.asciidoc | 2 +- docs/en/serverless/apm/apm-ui-metrics.asciidoc | 2 +- docs/en/serverless/apm/apm-ui-overview.asciidoc | 4 ++-- docs/en/serverless/apm/apm-ui-service-map.asciidoc | 2 +- docs/en/serverless/apm/apm-ui-service-overview.asciidoc | 2 +- docs/en/serverless/apm/apm-ui-services.asciidoc | 2 +- docs/en/serverless/apm/apm-ui-trace-sample-timeline.asciidoc | 2 +- docs/en/serverless/apm/apm-ui-traces.asciidoc | 2 +- docs/en/serverless/apm/apm-ui-transactions.asciidoc | 2 +- docs/en/serverless/apm/apm-view-and-analyze-traces.asciidoc | 2 +- docs/en/serverless/apm/apm.asciidoc | 2 +- docs/en/serverless/cases/cases.asciidoc | 4 ++-- docs/en/serverless/cases/create-manage-cases.asciidoc | 4 ++-- docs/en/serverless/cases/manage-cases-settings.asciidoc | 4 ++-- .../dashboards/dashboards-and-visualizations.asciidoc | 4 ++-- docs/en/serverless/elastic-entity-model.asciidoc | 4 ++-- docs/en/serverless/infra-monitoring/analyze-hosts.asciidoc | 4 ++-- docs/en/serverless/infra-monitoring/aws-metrics.asciidoc | 4 ++-- .../infra-monitoring/configure-infra-settings.asciidoc | 4 ++-- .../en/serverless/infra-monitoring/container-metrics.asciidoc | 4 ++-- .../infra-monitoring/detect-metric-anomalies.asciidoc | 4 ++-- .../infra-monitoring/get-started-with-metrics.asciidoc | 4 ++-- .../infra-monitoring/handle-no-results-found-message.asciidoc | 4 ++-- docs/en/serverless/infra-monitoring/host-metrics.asciidoc | 4 ++-- docs/en/serverless/infra-monitoring/infra-monitoring.asciidoc | 4 ++-- .../infra-monitoring/kubernetes-pod-metrics.asciidoc | 4 ++-- .../serverless/infra-monitoring/metrics-app-fields.asciidoc | 4 ++-- .../en/serverless/infra-monitoring/metrics-reference.asciidoc | 4 ++-- .../infra-monitoring/troubleshooting-infra.asciidoc | 4 ++-- .../infra-monitoring/view-infrastructure-metrics.asciidoc | 4 ++-- docs/en/serverless/inventory.asciidoc | 4 ++-- docs/en/serverless/logging/add-logs-service-name.asciidoc | 4 ++-- .../en/serverless/logging/correlate-application-logs.asciidoc | 4 ++-- docs/en/serverless/logging/ecs-application-logs.asciidoc | 4 ++-- docs/en/serverless/logging/filter-and-aggregate-logs.asciidoc | 2 +- docs/en/serverless/logging/get-started-with-logs.asciidoc | 4 ++-- docs/en/serverless/logging/log-monitoring.asciidoc | 4 ++-- docs/en/serverless/logging/parse-log-data.asciidoc | 2 +- .../en/serverless/logging/plaintext-application-logs.asciidoc | 4 ++-- docs/en/serverless/logging/run-log-pattern-analysis.asciidoc | 4 ++-- docs/en/serverless/logging/send-application-logs.asciidoc | 4 ++-- docs/en/serverless/logging/stream-log-files.asciidoc | 4 ++-- docs/en/serverless/logging/troubleshoot-logs.asciidoc | 4 ++-- docs/en/serverless/logging/view-and-monitor-logs.asciidoc | 4 ++-- docs/en/serverless/monitor-datasets.asciidoc | 4 ++-- docs/en/serverless/observability-overview.asciidoc | 4 ++-- docs/en/serverless/projects/billing.asciidoc | 4 ++-- .../projects/create-an-observability-project.asciidoc | 4 ++-- docs/en/serverless/quickstarts/k8s-logs-metrics.asciidoc | 4 ++-- .../quickstarts/monitor-hosts-with-elastic-agent.asciidoc | 4 ++-- docs/en/serverless/quickstarts/overview.asciidoc | 4 ++-- docs/en/serverless/slos/create-an-slo.asciidoc | 4 ++-- docs/en/serverless/slos/slos.asciidoc | 4 ++-- docs/en/serverless/technical-preview-limitations.asciidoc | 4 ++-- docs/en/serverless/what-is-observability-serverless.asciidoc | 2 +- 109 files changed, 183 insertions(+), 183 deletions(-) diff --git a/docs/en/serverless/ai-assistant/ai-assistant.asciidoc b/docs/en/serverless/ai-assistant/ai-assistant.asciidoc index 59f7cabdd0..c88d102989 100644 --- a/docs/en/serverless/ai-assistant/ai-assistant.asciidoc +++ b/docs/en/serverless/ai-assistant/ai-assistant.asciidoc @@ -1,7 +1,7 @@ [[observability-ai-assistant]] = AI Assistant -:keywords: serverless, observability, overview +// :keywords: serverless, observability, overview preview:[] diff --git a/docs/en/serverless/aiops/aiops-analyze-spikes.asciidoc b/docs/en/serverless/aiops/aiops-analyze-spikes.asciidoc index 0dbc8f9a13..46670a047b 100644 --- a/docs/en/serverless/aiops/aiops-analyze-spikes.asciidoc +++ b/docs/en/serverless/aiops/aiops-analyze-spikes.asciidoc @@ -1,8 +1,8 @@ [[observability-aiops-analyze-spikes]] = Analyze log spikes and drops -:description: Find and investigate the causes of unusual spikes or drops in log rates. -:keywords: serverless, observability, how-to +// :description: Find and investigate the causes of unusual spikes or drops in log rates. +// :keywords: serverless, observability, how-to preview:[] diff --git a/docs/en/serverless/aiops/aiops-detect-anomalies.asciidoc b/docs/en/serverless/aiops/aiops-detect-anomalies.asciidoc index 56ef927f26..afe5d8ef4d 100644 --- a/docs/en/serverless/aiops/aiops-detect-anomalies.asciidoc +++ b/docs/en/serverless/aiops/aiops-detect-anomalies.asciidoc @@ -1,8 +1,8 @@ [[observability-aiops-detect-anomalies]] = Detect anomalies -:description: Detect anomalies by comparing real-time and historical data from different sources to look for unusual, problematic patterns. -:keywords: serverless, observability, how-to +// :description: Detect anomalies by comparing real-time and historical data from different sources to look for unusual, problematic patterns. +// :keywords: serverless, observability, how-to preview:[] diff --git a/docs/en/serverless/aiops/aiops-detect-change-points.asciidoc b/docs/en/serverless/aiops/aiops-detect-change-points.asciidoc index 80946307db..ddb58b71cf 100644 --- a/docs/en/serverless/aiops/aiops-detect-change-points.asciidoc +++ b/docs/en/serverless/aiops/aiops-detect-change-points.asciidoc @@ -1,8 +1,8 @@ [[observability-aiops-detect-change-points]] = Detect change points -:description: Detect distribution changes, trend changes, and other statistically significant change points in a metric of your time series data. -:keywords: serverless, observability, how-to +// :description: Detect distribution changes, trend changes, and other statistically significant change points in a metric of your time series data. +// :keywords: serverless, observability, how-to preview:[] diff --git a/docs/en/serverless/aiops/aiops-forecast-anomaly.asciidoc b/docs/en/serverless/aiops/aiops-forecast-anomaly.asciidoc index df6eb1d153..274d1979b0 100644 --- a/docs/en/serverless/aiops/aiops-forecast-anomaly.asciidoc +++ b/docs/en/serverless/aiops/aiops-forecast-anomaly.asciidoc @@ -1,8 +1,8 @@ [[observability-aiops-forecast-anomalies]] = Forecast future behavior -:description: Predict future behavior of your data by creating a forecast for an anomaly detection job. -:keywords: serverless, observability, how-to +// :description: Predict future behavior of your data by creating a forecast for an anomaly detection job. +// :keywords: serverless, observability, how-to preview:[] diff --git a/docs/en/serverless/aiops/aiops-tune-anomaly-detection-job.asciidoc b/docs/en/serverless/aiops/aiops-tune-anomaly-detection-job.asciidoc index ab6e3441e1..3670f81a36 100644 --- a/docs/en/serverless/aiops/aiops-tune-anomaly-detection-job.asciidoc +++ b/docs/en/serverless/aiops/aiops-tune-anomaly-detection-job.asciidoc @@ -1,8 +1,8 @@ [[observability-aiops-tune-anomaly-detection-job]] = Tune your anomaly detection job -:description: Tune your job by creating calendars, adding job rules, and defining custom URLs. -:keywords: serverless, observability, how-to +// :description: Tune your job by creating calendars, adding job rules, and defining custom URLs. +// :keywords: serverless, observability, how-to preview:[] diff --git a/docs/en/serverless/aiops/aiops.asciidoc b/docs/en/serverless/aiops/aiops.asciidoc index 7e7eb451c5..b8205222ac 100644 --- a/docs/en/serverless/aiops/aiops.asciidoc +++ b/docs/en/serverless/aiops/aiops.asciidoc @@ -1,8 +1,8 @@ [[observability-aiops]] = AIOps -:description: Automate anomaly detection and accelerate root cause analysis with AIOps. -:keywords: serverless, observability, overview +// :description: Automate anomaly detection and accelerate root cause analysis with AIOps. +// :keywords: serverless, observability, overview preview:[] diff --git a/docs/en/serverless/alerting/aggregation-options.asciidoc b/docs/en/serverless/alerting/aggregation-options.asciidoc index 981eaf9e23..74f8952e2b 100644 --- a/docs/en/serverless/alerting/aggregation-options.asciidoc +++ b/docs/en/serverless/alerting/aggregation-options.asciidoc @@ -1,8 +1,8 @@ [[observability-aggregationOptions]] = Aggregation options -:description: Learn about aggregations available in alerting rules. -:keywords: serverless, observability, reference +// :description: Learn about aggregations available in alerting rules. +// :keywords: serverless, observability, reference preview:[] diff --git a/docs/en/serverless/alerting/aiops-generate-anomaly-alerts.asciidoc b/docs/en/serverless/alerting/aiops-generate-anomaly-alerts.asciidoc index 88e03e06f3..432d0472f8 100644 --- a/docs/en/serverless/alerting/aiops-generate-anomaly-alerts.asciidoc +++ b/docs/en/serverless/alerting/aiops-generate-anomaly-alerts.asciidoc @@ -1,8 +1,8 @@ [[observability-aiops-generate-anomaly-alerts]] = Create an anomaly detection rule -:description: Get alerts when anomalies match specific conditions. -:keywords: serverless, observability, how-to +// :description: Get alerts when anomalies match specific conditions. +// :keywords: serverless, observability, how-to ++++ <titleabbrev>Anomaly detection</titleabbrev> diff --git a/docs/en/serverless/alerting/alerting.asciidoc b/docs/en/serverless/alerting/alerting.asciidoc index a957f336e9..59c3e6eb1d 100644 --- a/docs/en/serverless/alerting/alerting.asciidoc +++ b/docs/en/serverless/alerting/alerting.asciidoc @@ -1,8 +1,8 @@ [[observability-alerting]] = Alerting -:description: Get alerts based on rules you define for detecting complex conditions in your applications and services. -:keywords: serverless, observability, overview, alerting +// :description: Get alerts based on rules you define for detecting complex conditions in your applications and services. +// :keywords: serverless, observability, overview, alerting preview:[] diff --git a/docs/en/serverless/alerting/create-anomaly-alert-rule.asciidoc b/docs/en/serverless/alerting/create-anomaly-alert-rule.asciidoc index b639c46710..67dbeb0c03 100644 --- a/docs/en/serverless/alerting/create-anomaly-alert-rule.asciidoc +++ b/docs/en/serverless/alerting/create-anomaly-alert-rule.asciidoc @@ -1,8 +1,8 @@ [[observability-create-anomaly-alert-rule]] = Create an APM anomaly rule -:description: Get alerts when either the latency, throughput, or failed transaction rate of a service is abnormal. -:keywords: serverless, observability, how-to, alerting +// :description: Get alerts when either the latency, throughput, or failed transaction rate of a service is abnormal. +// :keywords: serverless, observability, how-to, alerting ++++ <titleabbrev>APM anomaly</titleabbrev> diff --git a/docs/en/serverless/alerting/create-custom-threshold-alert-rule.asciidoc b/docs/en/serverless/alerting/create-custom-threshold-alert-rule.asciidoc index 7fea10f097..6360a17f38 100644 --- a/docs/en/serverless/alerting/create-custom-threshold-alert-rule.asciidoc +++ b/docs/en/serverless/alerting/create-custom-threshold-alert-rule.asciidoc @@ -1,8 +1,8 @@ [[observability-create-custom-threshold-alert-rule]] = Create a custom threshold rule -:description: Get alerts when an Observability data type reach a given value. -:keywords: serverless, observability, how-to, alerting +// :description: Get alerts when an Observability data type reach a given value. +// :keywords: serverless, observability, how-to, alerting ++++ <titleabbrev>Custom threshold</titleabbrev> diff --git a/docs/en/serverless/alerting/create-elasticsearch-query-alert-rule.asciidoc b/docs/en/serverless/alerting/create-elasticsearch-query-alert-rule.asciidoc index 36f0b21b24..fe4011b2c8 100644 --- a/docs/en/serverless/alerting/create-elasticsearch-query-alert-rule.asciidoc +++ b/docs/en/serverless/alerting/create-elasticsearch-query-alert-rule.asciidoc @@ -1,8 +1,8 @@ [[observability-create-elasticsearch-query-rule]] = Create an Elasticsearch query rule -:description: Get alerts when matches are found during the latest query run. -:keywords: serverless, observability, how-to, alerting +// :description: Get alerts when matches are found during the latest query run. +// :keywords: serverless, observability, how-to, alerting ++++ <titleabbrev>Elasticsearch query</titleabbrev> diff --git a/docs/en/serverless/alerting/create-error-count-threshold-alert-rule.asciidoc b/docs/en/serverless/alerting/create-error-count-threshold-alert-rule.asciidoc index 1baa9c69fc..cd36b85b93 100644 --- a/docs/en/serverless/alerting/create-error-count-threshold-alert-rule.asciidoc +++ b/docs/en/serverless/alerting/create-error-count-threshold-alert-rule.asciidoc @@ -1,8 +1,8 @@ [[observability-create-error-count-threshold-alert-rule]] = Create an error count threshold rule -:description: Get alerts when the number of errors in a service exceeds a defined threshold. -:keywords: serverless, observability, how-to, alerting +// :description: Get alerts when the number of errors in a service exceeds a defined threshold. +// :keywords: serverless, observability, how-to, alerting ++++ <titleabbrev>Error count threshold</titleabbrev> diff --git a/docs/en/serverless/alerting/create-failed-transaction-rate-threshold-alert-rule.asciidoc b/docs/en/serverless/alerting/create-failed-transaction-rate-threshold-alert-rule.asciidoc index 6eecfc173e..3551fde3e2 100644 --- a/docs/en/serverless/alerting/create-failed-transaction-rate-threshold-alert-rule.asciidoc +++ b/docs/en/serverless/alerting/create-failed-transaction-rate-threshold-alert-rule.asciidoc @@ -1,8 +1,8 @@ [[observability-create-failed-transaction-rate-threshold-alert-rule]] = Create a failed transaction rate threshold rule -:description: Get alerts when the rate of transaction errors in a service exceeds a defined threshold. -:keywords: serverless, observability, how-to, alerting +// :description: Get alerts when the rate of transaction errors in a service exceeds a defined threshold. +// :keywords: serverless, observability, how-to, alerting ++++ <titleabbrev>Failed transaction rate threshold</titleabbrev> diff --git a/docs/en/serverless/alerting/create-inventory-threshold-alert-rule.asciidoc b/docs/en/serverless/alerting/create-inventory-threshold-alert-rule.asciidoc index bb90d99d83..9db7772283 100644 --- a/docs/en/serverless/alerting/create-inventory-threshold-alert-rule.asciidoc +++ b/docs/en/serverless/alerting/create-inventory-threshold-alert-rule.asciidoc @@ -1,8 +1,8 @@ [[observability-create-inventory-threshold-alert-rule]] = Create an inventory rule -:description: Get alerts when the infrastructure inventory exceeds a defined threshold. -:keywords: serverless, observability, how-to, alerting +// :description: Get alerts when the infrastructure inventory exceeds a defined threshold. +// :keywords: serverless, observability, how-to, alerting ++++ <titleabbrev>Inventory</titleabbrev> diff --git a/docs/en/serverless/alerting/create-latency-threshold-alert-rule.asciidoc b/docs/en/serverless/alerting/create-latency-threshold-alert-rule.asciidoc index 4da412fec3..cf6bc393da 100644 --- a/docs/en/serverless/alerting/create-latency-threshold-alert-rule.asciidoc +++ b/docs/en/serverless/alerting/create-latency-threshold-alert-rule.asciidoc @@ -1,8 +1,8 @@ [[observability-create-latency-threshold-alert-rule]] = Create a latency threshold rule -:description: Get alerts when the latency of a specific transaction type in a service exceeds a defined threshold. -:keywords: serverless, observability, how-to, alerting +// :description: Get alerts when the latency of a specific transaction type in a service exceeds a defined threshold. +// :keywords: serverless, observability, how-to, alerting ++++ <titleabbrev>Latency threshold</titleabbrev> diff --git a/docs/en/serverless/alerting/create-manage-rules.asciidoc b/docs/en/serverless/alerting/create-manage-rules.asciidoc index 3ab113d99c..2c9bfbefde 100644 --- a/docs/en/serverless/alerting/create-manage-rules.asciidoc +++ b/docs/en/serverless/alerting/create-manage-rules.asciidoc @@ -1,8 +1,8 @@ [[observability-create-manage-rules]] = Create and manage rules -:description: Create and manage rules for alerting when conditions are met. -:keywords: serverless, observability, how-to +// :description: Create and manage rules for alerting when conditions are met. +// :keywords: serverless, observability, how-to preview:[] diff --git a/docs/en/serverless/alerting/create-slo-burn-rate-alert-rule.asciidoc b/docs/en/serverless/alerting/create-slo-burn-rate-alert-rule.asciidoc index 8f144c8f9f..c45cdbd9df 100644 --- a/docs/en/serverless/alerting/create-slo-burn-rate-alert-rule.asciidoc +++ b/docs/en/serverless/alerting/create-slo-burn-rate-alert-rule.asciidoc @@ -1,8 +1,8 @@ [[observability-create-slo-burn-rate-alert-rule]] = Create an SLO burn rate rule -:description: Get alerts when the SLO failure rate is too high over a defined period of time. -:keywords: serverless, observability, how-to, alerting +// :description: Get alerts when the SLO failure rate is too high over a defined period of time. +// :keywords: serverless, observability, how-to, alerting ++++ <titleabbrev>SLO burn rate</titleabbrev> diff --git a/docs/en/serverless/alerting/rate-aggregation.asciidoc b/docs/en/serverless/alerting/rate-aggregation.asciidoc index dcb3839b56..701e592826 100644 --- a/docs/en/serverless/alerting/rate-aggregation.asciidoc +++ b/docs/en/serverless/alerting/rate-aggregation.asciidoc @@ -1,8 +1,8 @@ [[observability-rateAggregation]] = Rate aggregation -:description: Analyze the rate at which a specific field changes over time. -:keywords: serverless, observability, reference +// :description: Analyze the rate at which a specific field changes over time. +// :keywords: serverless, observability, reference preview:[] diff --git a/docs/en/serverless/alerting/synthetic-monitor-status-alert.asciidoc b/docs/en/serverless/alerting/synthetic-monitor-status-alert.asciidoc index 6acd7a02ad..c9ba53ca0d 100644 --- a/docs/en/serverless/alerting/synthetic-monitor-status-alert.asciidoc +++ b/docs/en/serverless/alerting/synthetic-monitor-status-alert.asciidoc @@ -1,8 +1,8 @@ [[observability-monitor-status-alert]] = Create a synthetic monitor status rule -:description: Get alerts based on the status of synthetic monitors. -:keywords: serverless, observability, how-to, alerting +// :description: Get alerts based on the status of synthetic monitors. +// :keywords: serverless, observability, how-to, alerting ++++ <titleabbrev>Synthetic monitor status</titleabbrev> diff --git a/docs/en/serverless/alerting/triage-slo-burn-rate-breaches.asciidoc b/docs/en/serverless/alerting/triage-slo-burn-rate-breaches.asciidoc index d3fb7f95d6..1ae5f51f82 100644 --- a/docs/en/serverless/alerting/triage-slo-burn-rate-breaches.asciidoc +++ b/docs/en/serverless/alerting/triage-slo-burn-rate-breaches.asciidoc @@ -1,8 +1,8 @@ [[observability-triage-slo-burn-rate-breaches]] = Triage SLO burn rate breaches -:description: Triage SLO burn rate breaches to avoid exhausting your error budget and violating your SLO. -:keywords: serverless, observability, how-to, alerting +// :description: Triage SLO burn rate breaches to avoid exhausting your error budget and violating your SLO. +// :keywords: serverless, observability, how-to, alerting ++++ <titleabbrev>SLO burn rate breaches</titleabbrev> diff --git a/docs/en/serverless/alerting/triage-threshold-breaches.asciidoc b/docs/en/serverless/alerting/triage-threshold-breaches.asciidoc index 5499637d2a..1b3b22ddf2 100644 --- a/docs/en/serverless/alerting/triage-threshold-breaches.asciidoc +++ b/docs/en/serverless/alerting/triage-threshold-breaches.asciidoc @@ -1,8 +1,8 @@ [[observability-triage-threshold-breaches]] = Triage threshold breaches -:description: Triage threshold breaches on the alert details page. -:keywords: serverless, observability, how-to, alerting +// :description: Triage threshold breaches on the alert details page. +// :keywords: serverless, observability, how-to, alerting ++++ <titleabbrev>Threshold breaches</titleabbrev> diff --git a/docs/en/serverless/alerting/view-alerts.asciidoc b/docs/en/serverless/alerting/view-alerts.asciidoc index 93321d7893..b677a609a1 100644 --- a/docs/en/serverless/alerting/view-alerts.asciidoc +++ b/docs/en/serverless/alerting/view-alerts.asciidoc @@ -1,8 +1,8 @@ [[observability-view-alerts]] = View alerts -:description: Track and manage alerts for your services and applications. -:keywords: serverless, observability, how-to, alerting +// :description: Track and manage alerts for your services and applications. +// :keywords: serverless, observability, how-to, alerting preview:[] diff --git a/docs/en/serverless/apm-agents/apm-agents-aws-lambda-functions.asciidoc b/docs/en/serverless/apm-agents/apm-agents-aws-lambda-functions.asciidoc index e8161a19bb..5483f6caae 100644 --- a/docs/en/serverless/apm-agents/apm-agents-aws-lambda-functions.asciidoc +++ b/docs/en/serverless/apm-agents/apm-agents-aws-lambda-functions.asciidoc @@ -1,8 +1,8 @@ [[observability-apm-agents-aws-lambda-functions]] = AWS Lambda functions -:description: Use Elastic APM to monitor your AWS Lambda functions. -:keywords: serverless, observability, overview +// :description: Use Elastic APM to monitor your AWS Lambda functions. +// :keywords: serverless, observability, overview preview:[] diff --git a/docs/en/serverless/apm-agents/apm-agents-elastic-apm-agents.asciidoc b/docs/en/serverless/apm-agents/apm-agents-elastic-apm-agents.asciidoc index dce4331e4b..353f0ecf51 100644 --- a/docs/en/serverless/apm-agents/apm-agents-elastic-apm-agents.asciidoc +++ b/docs/en/serverless/apm-agents/apm-agents-elastic-apm-agents.asciidoc @@ -1,7 +1,7 @@ [[observability-apm-agents-elastic-apm-agents]] = Elastic APM agents -:keywords: serverless, observability, overview +// :keywords: serverless, observability, overview preview:[] diff --git a/docs/en/serverless/apm-agents/apm-agents-opentelemetry-collect-metrics.asciidoc b/docs/en/serverless/apm-agents/apm-agents-opentelemetry-collect-metrics.asciidoc index ff47cabc49..2fd6d08307 100644 --- a/docs/en/serverless/apm-agents/apm-agents-opentelemetry-collect-metrics.asciidoc +++ b/docs/en/serverless/apm-agents/apm-agents-opentelemetry-collect-metrics.asciidoc @@ -1,7 +1,7 @@ [[observability-apm-agents-opentelemetry-collect-metrics]] = Collect metrics -:keywords: serverless, observability, reference +// :keywords: serverless, observability, reference preview:[] diff --git a/docs/en/serverless/apm-agents/apm-agents-opentelemetry-limitations.asciidoc b/docs/en/serverless/apm-agents/apm-agents-opentelemetry-limitations.asciidoc index aafa296008..eefeea5138 100644 --- a/docs/en/serverless/apm-agents/apm-agents-opentelemetry-limitations.asciidoc +++ b/docs/en/serverless/apm-agents/apm-agents-opentelemetry-limitations.asciidoc @@ -1,7 +1,7 @@ [[observability-apm-agents-opentelemetry-limitations]] = Limitations -:keywords: serverless, observability, overview +// :keywords: serverless, observability, overview preview:[] diff --git a/docs/en/serverless/apm-agents/apm-agents-opentelemetry-opentelemetry-native-support.asciidoc b/docs/en/serverless/apm-agents/apm-agents-opentelemetry-opentelemetry-native-support.asciidoc index 49eb35265e..e53e7d47d6 100644 --- a/docs/en/serverless/apm-agents/apm-agents-opentelemetry-opentelemetry-native-support.asciidoc +++ b/docs/en/serverless/apm-agents/apm-agents-opentelemetry-opentelemetry-native-support.asciidoc @@ -1,7 +1,7 @@ [[observability-apm-agents-opentelemetry-opentelemetry-native-support]] = Upstream OpenTelemetry Collectors and language SDKs -:keywords: serverless, observability, overview +// :keywords: serverless, observability, overview preview:[] diff --git a/docs/en/serverless/apm-agents/apm-agents-opentelemetry-resource-attributes.asciidoc b/docs/en/serverless/apm-agents/apm-agents-opentelemetry-resource-attributes.asciidoc index 0a1b33f9e8..5b4d3fe918 100644 --- a/docs/en/serverless/apm-agents/apm-agents-opentelemetry-resource-attributes.asciidoc +++ b/docs/en/serverless/apm-agents/apm-agents-opentelemetry-resource-attributes.asciidoc @@ -1,7 +1,7 @@ [[observability-apm-agents-opentelemetry-resource-attributes]] = Resource attributes -:keywords: serverless, observability, how-to +// :keywords: serverless, observability, how-to preview:[] diff --git a/docs/en/serverless/apm-agents/apm-agents-opentelemetry.asciidoc b/docs/en/serverless/apm-agents/apm-agents-opentelemetry.asciidoc index c554cf23c4..2a297d6bfe 100644 --- a/docs/en/serverless/apm-agents/apm-agents-opentelemetry.asciidoc +++ b/docs/en/serverless/apm-agents/apm-agents-opentelemetry.asciidoc @@ -1,7 +1,7 @@ [[observability-apm-agents-opentelemetry]] = Use OpenTelemetry with APM -:keywords: serverless, observability, overview +// :keywords: serverless, observability, overview preview:[] diff --git a/docs/en/serverless/apm/apm-compress-spans.asciidoc b/docs/en/serverless/apm/apm-compress-spans.asciidoc index dd0bca1167..427cc99a99 100644 --- a/docs/en/serverless/apm/apm-compress-spans.asciidoc +++ b/docs/en/serverless/apm/apm-compress-spans.asciidoc @@ -1,8 +1,8 @@ [[observability-apm-compress-spans]] = Compress spans -:description: Compress similar or identical spans to reduce storage overhead, processing power needed, and clutter in the Applications UI. -:keywords: serverless, observability, how-to +// :description: Compress similar or identical spans to reduce storage overhead, processing power needed, and clutter in the Applications UI. +// :keywords: serverless, observability, how-to preview:[] diff --git a/docs/en/serverless/apm/apm-create-custom-links.asciidoc b/docs/en/serverless/apm/apm-create-custom-links.asciidoc index 0d9655886b..ce5355e238 100644 --- a/docs/en/serverless/apm/apm-create-custom-links.asciidoc +++ b/docs/en/serverless/apm/apm-create-custom-links.asciidoc @@ -1,7 +1,7 @@ [[observability-apm-create-custom-links]] = Create custom links -:keywords: serverless, observability, how-to +// :keywords: serverless, observability, how-to preview:[] diff --git a/docs/en/serverless/apm/apm-data-types.asciidoc b/docs/en/serverless/apm/apm-data-types.asciidoc index e5ee0a40e1..177fde831f 100644 --- a/docs/en/serverless/apm/apm-data-types.asciidoc +++ b/docs/en/serverless/apm/apm-data-types.asciidoc @@ -1,8 +1,8 @@ [[observability-apm-data-types]] = APM data types -:description: Learn about the various APM data types. -:keywords: serverless, observability, overview +// :description: Learn about the various APM data types. +// :keywords: serverless, observability, overview preview:[] diff --git a/docs/en/serverless/apm/apm-distributed-tracing.asciidoc b/docs/en/serverless/apm/apm-distributed-tracing.asciidoc index fb7ef23de9..1ee167e3ab 100644 --- a/docs/en/serverless/apm/apm-distributed-tracing.asciidoc +++ b/docs/en/serverless/apm/apm-distributed-tracing.asciidoc @@ -1,8 +1,8 @@ [[observability-apm-distributed-tracing]] = Distributed tracing -:description: Understand how a single request that travels through multiple services impacts your application. -:keywords: serverless, observability, how-to +// :description: Understand how a single request that travels through multiple services impacts your application. +// :keywords: serverless, observability, how-to preview:[] diff --git a/docs/en/serverless/apm/apm-filter-your-data.asciidoc b/docs/en/serverless/apm/apm-filter-your-data.asciidoc index 399860e7d0..fee20316d0 100644 --- a/docs/en/serverless/apm/apm-filter-your-data.asciidoc +++ b/docs/en/serverless/apm/apm-filter-your-data.asciidoc @@ -1,7 +1,7 @@ [[observability-apm-filter-your-data]] = Filter your data -:keywords: serverless, observability, how-to +// :keywords: serverless, observability, how-to preview:[] diff --git a/docs/en/serverless/apm/apm-find-transaction-latency-and-failure-correlations.asciidoc b/docs/en/serverless/apm/apm-find-transaction-latency-and-failure-correlations.asciidoc index 93a72765c3..60ffe59172 100644 --- a/docs/en/serverless/apm/apm-find-transaction-latency-and-failure-correlations.asciidoc +++ b/docs/en/serverless/apm/apm-find-transaction-latency-and-failure-correlations.asciidoc @@ -1,7 +1,7 @@ [[observability-apm-find-transaction-latency-and-failure-correlations]] = Find transaction latency and failure correlations -:keywords: serverless, observability, how-to +// :keywords: serverless, observability, how-to preview:[] diff --git a/docs/en/serverless/apm/apm-get-started.asciidoc b/docs/en/serverless/apm/apm-get-started.asciidoc index 0111499603..f485a26ac7 100644 --- a/docs/en/serverless/apm/apm-get-started.asciidoc +++ b/docs/en/serverless/apm/apm-get-started.asciidoc @@ -1,8 +1,8 @@ [[observability-apm-get-started]] = Get started with traces and APM -:description: Learn how to collect Application Performance Monitoring (APM) data and visualize it in real time. -:keywords: serverless, observability, how-to +// :description: Learn how to collect Application Performance Monitoring (APM) data and visualize it in real time. +// :keywords: serverless, observability, how-to preview:[] diff --git a/docs/en/serverless/apm/apm-integrate-with-machine-learning.asciidoc b/docs/en/serverless/apm/apm-integrate-with-machine-learning.asciidoc index bbd6fe2aa4..3cdf7de6b9 100644 --- a/docs/en/serverless/apm/apm-integrate-with-machine-learning.asciidoc +++ b/docs/en/serverless/apm/apm-integrate-with-machine-learning.asciidoc @@ -1,7 +1,7 @@ [[observability-apm-integrate-with-machine-learning]] = Integrate with machine learning -:keywords: serverless, observability, how-to +// :keywords: serverless, observability, how-to preview:[] diff --git a/docs/en/serverless/apm/apm-keep-data-secure.asciidoc b/docs/en/serverless/apm/apm-keep-data-secure.asciidoc index e30205fa6e..292b078480 100644 --- a/docs/en/serverless/apm/apm-keep-data-secure.asciidoc +++ b/docs/en/serverless/apm/apm-keep-data-secure.asciidoc @@ -1,8 +1,8 @@ [[observability-apm-keep-data-secure]] = Keep APM data secure -:description: Make sure APM data is sent to Elastic securely and sensitive data is protected. -:keywords: serverless, observability, overview +// :description: Make sure APM data is sent to Elastic securely and sensitive data is protected. +// :keywords: serverless, observability, overview preview:[] diff --git a/docs/en/serverless/apm/apm-kibana-settings.asciidoc b/docs/en/serverless/apm/apm-kibana-settings.asciidoc index 62904413fb..0998ef2c51 100644 --- a/docs/en/serverless/apm/apm-kibana-settings.asciidoc +++ b/docs/en/serverless/apm/apm-kibana-settings.asciidoc @@ -1,7 +1,7 @@ [[observability-apm-kibana-settings]] = Settings -:keywords: serverless, observability, reference +// :keywords: serverless, observability, reference preview:[] diff --git a/docs/en/serverless/apm/apm-observe-lambda-functions.asciidoc b/docs/en/serverless/apm/apm-observe-lambda-functions.asciidoc index 8cd2b96ebe..f730d80e8f 100644 --- a/docs/en/serverless/apm/apm-observe-lambda-functions.asciidoc +++ b/docs/en/serverless/apm/apm-observe-lambda-functions.asciidoc @@ -1,7 +1,7 @@ [[observability-apm-observe-lambda-functions]] = Observe Lambda functions -:keywords: serverless, observability, how-to +// :keywords: serverless, observability, how-to preview:[] diff --git a/docs/en/serverless/apm/apm-query-your-data.asciidoc b/docs/en/serverless/apm/apm-query-your-data.asciidoc index 8753e26402..7d0e1e62cf 100644 --- a/docs/en/serverless/apm/apm-query-your-data.asciidoc +++ b/docs/en/serverless/apm/apm-query-your-data.asciidoc @@ -1,7 +1,7 @@ [[observability-apm-query-your-data]] = Query your data -:keywords: serverless, observability, how-to +// :keywords: serverless, observability, how-to preview:[] diff --git a/docs/en/serverless/apm/apm-reduce-your-data-usage.asciidoc b/docs/en/serverless/apm/apm-reduce-your-data-usage.asciidoc index 69b392abc7..f6c5268611 100644 --- a/docs/en/serverless/apm/apm-reduce-your-data-usage.asciidoc +++ b/docs/en/serverless/apm/apm-reduce-your-data-usage.asciidoc @@ -1,8 +1,8 @@ [[observability-apm-reduce-your-data-usage]] = Reduce your data usage -:description: Implement strategies for reducing your data usage without compromising the ability to analyze APM data. -:keywords: serverless, observability, overview +// :description: Implement strategies for reducing your data usage without compromising the ability to analyze APM data. +// :keywords: serverless, observability, overview preview:[] diff --git a/docs/en/serverless/apm/apm-reference.asciidoc b/docs/en/serverless/apm/apm-reference.asciidoc index 7c4a8e6c5c..f9b1aef9e9 100644 --- a/docs/en/serverless/apm/apm-reference.asciidoc +++ b/docs/en/serverless/apm/apm-reference.asciidoc @@ -1,7 +1,7 @@ [[observability-apm-reference]] = Reference -:keywords: serverless, observability, reference +// :keywords: serverless, observability, reference preview:[] diff --git a/docs/en/serverless/apm/apm-send-traces-to-elastic.asciidoc b/docs/en/serverless/apm/apm-send-traces-to-elastic.asciidoc index 67fb997504..ac33f576db 100644 --- a/docs/en/serverless/apm/apm-send-traces-to-elastic.asciidoc +++ b/docs/en/serverless/apm/apm-send-traces-to-elastic.asciidoc @@ -1,7 +1,7 @@ [[observability-apm-send-data-to-elastic]] = Send APM data to Elastic -:keywords: serverless, observability, overview +// :keywords: serverless, observability, overview preview:[] diff --git a/docs/en/serverless/apm/apm-server-api.asciidoc b/docs/en/serverless/apm/apm-server-api.asciidoc index dd6dde960e..ddd8a4e07d 100644 --- a/docs/en/serverless/apm/apm-server-api.asciidoc +++ b/docs/en/serverless/apm/apm-server-api.asciidoc @@ -1,7 +1,7 @@ [[observability-apm-server-api]] = Managed intake service event API -:keywords: serverless, observability, reference +// :keywords: serverless, observability, reference preview:[] diff --git a/docs/en/serverless/apm/apm-stacktrace-collection.asciidoc b/docs/en/serverless/apm/apm-stacktrace-collection.asciidoc index 0d47c775c5..5a6ae825d9 100644 --- a/docs/en/serverless/apm/apm-stacktrace-collection.asciidoc +++ b/docs/en/serverless/apm/apm-stacktrace-collection.asciidoc @@ -1,8 +1,8 @@ [[observability-apm-stacktrace-collection]] = Stacktrace collection -:description: Reduce data storage and costs by reducing stacktrace collection -:keywords: serverless, observability, how-to +// :description: Reduce data storage and costs by reducing stacktrace collection +// :keywords: serverless, observability, how-to preview:[] diff --git a/docs/en/serverless/apm/apm-track-deployments-with-annotations.asciidoc b/docs/en/serverless/apm/apm-track-deployments-with-annotations.asciidoc index 723aeb8931..1c4bd9d2c4 100644 --- a/docs/en/serverless/apm/apm-track-deployments-with-annotations.asciidoc +++ b/docs/en/serverless/apm/apm-track-deployments-with-annotations.asciidoc @@ -1,7 +1,7 @@ [[observability-apm-track-deployments-with-annotations]] = Track deployments with annotations -:keywords: serverless, observability, how-to +// :keywords: serverless, observability, how-to preview:[] diff --git a/docs/en/serverless/apm/apm-transaction-sampling.asciidoc b/docs/en/serverless/apm/apm-transaction-sampling.asciidoc index 645a6d1d91..a3d0116347 100644 --- a/docs/en/serverless/apm/apm-transaction-sampling.asciidoc +++ b/docs/en/serverless/apm/apm-transaction-sampling.asciidoc @@ -1,8 +1,8 @@ [[observability-apm-transaction-sampling]] = Transaction sampling -:description: Reduce data storage, costs, and noise by ingesting only a percentage of all traces that you can extrapolate from in your analysis. -:keywords: serverless, observability, how-to +// :description: Reduce data storage, costs, and noise by ingesting only a percentage of all traces that you can extrapolate from in your analysis. +// :keywords: serverless, observability, how-to preview:[] diff --git a/docs/en/serverless/apm/apm-troubleshooting.asciidoc b/docs/en/serverless/apm/apm-troubleshooting.asciidoc index 1ea1ec3598..e07ea26ad0 100644 --- a/docs/en/serverless/apm/apm-troubleshooting.asciidoc +++ b/docs/en/serverless/apm/apm-troubleshooting.asciidoc @@ -1,7 +1,7 @@ [[observability-apm-troubleshooting]] = Troubleshooting -:keywords: serverless, observability, reference +// :keywords: serverless, observability, reference preview:[] diff --git a/docs/en/serverless/apm/apm-ui-dependencies.asciidoc b/docs/en/serverless/apm/apm-ui-dependencies.asciidoc index b5756399a2..d866655c71 100644 --- a/docs/en/serverless/apm/apm-ui-dependencies.asciidoc +++ b/docs/en/serverless/apm/apm-ui-dependencies.asciidoc @@ -1,7 +1,7 @@ [[observability-apm-dependencies]] = Dependencies -:keywords: serverless, observability, reference +// :keywords: serverless, observability, reference preview:[] diff --git a/docs/en/serverless/apm/apm-ui-errors.asciidoc b/docs/en/serverless/apm/apm-ui-errors.asciidoc index cb5a6a050e..f5077f8b70 100644 --- a/docs/en/serverless/apm/apm-ui-errors.asciidoc +++ b/docs/en/serverless/apm/apm-ui-errors.asciidoc @@ -1,7 +1,7 @@ [[observability-apm-errors]] = Errors -:keywords: serverless, observability, reference +// :keywords: serverless, observability, reference preview:[] diff --git a/docs/en/serverless/apm/apm-ui-infrastructure.asciidoc b/docs/en/serverless/apm/apm-ui-infrastructure.asciidoc index 9f1fc4d335..3b8928c1a0 100644 --- a/docs/en/serverless/apm/apm-ui-infrastructure.asciidoc +++ b/docs/en/serverless/apm/apm-ui-infrastructure.asciidoc @@ -1,7 +1,7 @@ [[observability-apm-infrastructure]] = Infrastructure -:keywords: serverless, observability, reference +// :keywords: serverless, observability, reference preview:[] diff --git a/docs/en/serverless/apm/apm-ui-logs.asciidoc b/docs/en/serverless/apm/apm-ui-logs.asciidoc index d6d6b956d1..be01d1c0e5 100644 --- a/docs/en/serverless/apm/apm-ui-logs.asciidoc +++ b/docs/en/serverless/apm/apm-ui-logs.asciidoc @@ -1,7 +1,7 @@ [[observability-apm-logs]] = Logs -:keywords: serverless, observability, reference +// :keywords: serverless, observability, reference preview:[] diff --git a/docs/en/serverless/apm/apm-ui-metrics.asciidoc b/docs/en/serverless/apm/apm-ui-metrics.asciidoc index 39f08bc717..cd9fbb90b5 100644 --- a/docs/en/serverless/apm/apm-ui-metrics.asciidoc +++ b/docs/en/serverless/apm/apm-ui-metrics.asciidoc @@ -1,7 +1,7 @@ [[observability-apm-metrics]] = Metrics -:keywords: serverless, observability, reference +// :keywords: serverless, observability, reference preview:[] diff --git a/docs/en/serverless/apm/apm-ui-overview.asciidoc b/docs/en/serverless/apm/apm-ui-overview.asciidoc index 6ef9fa8b33..1698cfce9b 100644 --- a/docs/en/serverless/apm/apm-ui-overview.asciidoc +++ b/docs/en/serverless/apm/apm-ui-overview.asciidoc @@ -1,8 +1,8 @@ [[observability-apm-ui-overview]] = Navigate the Applications UI -:description: Learn how to navigate the Applications UI. -:keywords: serverless, observability, reference +// :description: Learn how to navigate the Applications UI. +// :keywords: serverless, observability, reference preview:[] diff --git a/docs/en/serverless/apm/apm-ui-service-map.asciidoc b/docs/en/serverless/apm/apm-ui-service-map.asciidoc index 55f6e4b98a..8bf6d636c8 100644 --- a/docs/en/serverless/apm/apm-ui-service-map.asciidoc +++ b/docs/en/serverless/apm/apm-ui-service-map.asciidoc @@ -1,7 +1,7 @@ [[observability-apm-service-map]] = Service map -:keywords: serverless, observability, reference +// :keywords: serverless, observability, reference preview:[] diff --git a/docs/en/serverless/apm/apm-ui-service-overview.asciidoc b/docs/en/serverless/apm/apm-ui-service-overview.asciidoc index 99938d08c8..8cabccdeef 100644 --- a/docs/en/serverless/apm/apm-ui-service-overview.asciidoc +++ b/docs/en/serverless/apm/apm-ui-service-overview.asciidoc @@ -1,7 +1,7 @@ [[observability-apm-service-overview]] = Service Overview -:keywords: serverless, observability, reference +// :keywords: serverless, observability, reference preview:[] diff --git a/docs/en/serverless/apm/apm-ui-services.asciidoc b/docs/en/serverless/apm/apm-ui-services.asciidoc index e8f68a0475..e7ff9c0b9c 100644 --- a/docs/en/serverless/apm/apm-ui-services.asciidoc +++ b/docs/en/serverless/apm/apm-ui-services.asciidoc @@ -1,7 +1,7 @@ [[observability-apm-services]] = Services -:keywords: serverless, observability, reference +// :keywords: serverless, observability, reference preview:[] diff --git a/docs/en/serverless/apm/apm-ui-trace-sample-timeline.asciidoc b/docs/en/serverless/apm/apm-ui-trace-sample-timeline.asciidoc index ffbef5a352..8af33c6f32 100644 --- a/docs/en/serverless/apm/apm-ui-trace-sample-timeline.asciidoc +++ b/docs/en/serverless/apm/apm-ui-trace-sample-timeline.asciidoc @@ -1,7 +1,7 @@ [[observability-apm-trace-sample-timeline]] = Trace sample timeline -:keywords: serverless, observability, reference +// :keywords: serverless, observability, reference preview:[] diff --git a/docs/en/serverless/apm/apm-ui-traces.asciidoc b/docs/en/serverless/apm/apm-ui-traces.asciidoc index 7da555fa48..6f20a861fd 100644 --- a/docs/en/serverless/apm/apm-ui-traces.asciidoc +++ b/docs/en/serverless/apm/apm-ui-traces.asciidoc @@ -1,7 +1,7 @@ [[observability-apm-traces]] = Traces -:keywords: serverless, observability, reference +// :keywords: serverless, observability, reference preview:[] diff --git a/docs/en/serverless/apm/apm-ui-transactions.asciidoc b/docs/en/serverless/apm/apm-ui-transactions.asciidoc index f70192e0e7..46cf846b62 100644 --- a/docs/en/serverless/apm/apm-ui-transactions.asciidoc +++ b/docs/en/serverless/apm/apm-ui-transactions.asciidoc @@ -1,7 +1,7 @@ [[observability-apm-transactions]] = Transactions -:keywords: serverless, observability, reference +// :keywords: serverless, observability, reference preview:[] diff --git a/docs/en/serverless/apm/apm-view-and-analyze-traces.asciidoc b/docs/en/serverless/apm/apm-view-and-analyze-traces.asciidoc index 0215c73d6a..256c9d31cd 100644 --- a/docs/en/serverless/apm/apm-view-and-analyze-traces.asciidoc +++ b/docs/en/serverless/apm/apm-view-and-analyze-traces.asciidoc @@ -1,7 +1,7 @@ [[observability-apm-view-and-analyze-traces]] = View and analyze traces -:keywords: serverless, observability, overview +// :keywords: serverless, observability, overview preview:[] diff --git a/docs/en/serverless/apm/apm.asciidoc b/docs/en/serverless/apm/apm.asciidoc index 2bb7782c6b..a07e8994bd 100644 --- a/docs/en/serverless/apm/apm.asciidoc +++ b/docs/en/serverless/apm/apm.asciidoc @@ -1,7 +1,7 @@ [[observability-apm]] = Application performance monitoring (APM) -:keywords: serverless, observability, overview +// :keywords: serverless, observability, overview preview:[] diff --git a/docs/en/serverless/cases/cases.asciidoc b/docs/en/serverless/cases/cases.asciidoc index 6f2d63a366..fe5ea7c005 100644 --- a/docs/en/serverless/cases/cases.asciidoc +++ b/docs/en/serverless/cases/cases.asciidoc @@ -1,8 +1,8 @@ [[observability-cases]] = Cases -:description: Use cases to track progress toward solving problems detected in Elastic Observability. -:keywords: serverless, observability, overview +// :description: Use cases to track progress toward solving problems detected in Elastic Observability. +// :keywords: serverless, observability, overview preview:[] diff --git a/docs/en/serverless/cases/create-manage-cases.asciidoc b/docs/en/serverless/cases/create-manage-cases.asciidoc index 74cbbb1231..70b9317667 100644 --- a/docs/en/serverless/cases/create-manage-cases.asciidoc +++ b/docs/en/serverless/cases/create-manage-cases.asciidoc @@ -1,8 +1,8 @@ [[observability-create-a-new-case]] = Create and manage cases -:description: Learn how to create a case, add files, and manage the case over time. -:keywords: serverless, observability, how-to +// :description: Learn how to create a case, add files, and manage the case over time. +// :keywords: serverless, observability, how-to preview:[] diff --git a/docs/en/serverless/cases/manage-cases-settings.asciidoc b/docs/en/serverless/cases/manage-cases-settings.asciidoc index 2a156d09fe..167822fcc4 100644 --- a/docs/en/serverless/cases/manage-cases-settings.asciidoc +++ b/docs/en/serverless/cases/manage-cases-settings.asciidoc @@ -1,8 +1,8 @@ [[observability-case-settings]] = Configure case settings -:description: Change the default behavior of {observability} cases by adding connectors, custom fields, templates, and closure options. -:keywords: serverless, observability, how-to +// :description: Change the default behavior of {observability} cases by adding connectors, custom fields, templates, and closure options. +// :keywords: serverless, observability, how-to preview:[] diff --git a/docs/en/serverless/dashboards/dashboards-and-visualizations.asciidoc b/docs/en/serverless/dashboards/dashboards-and-visualizations.asciidoc index 8aa107a9d8..dd450416c7 100644 --- a/docs/en/serverless/dashboards/dashboards-and-visualizations.asciidoc +++ b/docs/en/serverless/dashboards/dashboards-and-visualizations.asciidoc @@ -1,8 +1,8 @@ [[observability-dashboards]] = Dashboards -:description: Visualize your observability data using pre-built dashboards or create your own. -:keywords: serverless, observability, overview +// :description: Visualize your observability data using pre-built dashboards or create your own. +// :keywords: serverless, observability, overview preview:[] diff --git a/docs/en/serverless/elastic-entity-model.asciidoc b/docs/en/serverless/elastic-entity-model.asciidoc index 9412ffe4fd..11d8e87941 100644 --- a/docs/en/serverless/elastic-entity-model.asciidoc +++ b/docs/en/serverless/elastic-entity-model.asciidoc @@ -1,8 +1,8 @@ [[observability-elastic-entity-model]] = Elastic Entity Model -:description: Learn about the model that empowers entity-centric Elastic solution features and workflows. -:keywords: serverless, observability, overview +// :description: Learn about the model that empowers entity-centric Elastic solution features and workflows. +// :keywords: serverless, observability, overview preview:[] diff --git a/docs/en/serverless/infra-monitoring/analyze-hosts.asciidoc b/docs/en/serverless/infra-monitoring/analyze-hosts.asciidoc index b3d15797ef..462b42e662 100644 --- a/docs/en/serverless/infra-monitoring/analyze-hosts.asciidoc +++ b/docs/en/serverless/infra-monitoring/analyze-hosts.asciidoc @@ -1,8 +1,8 @@ [[observability-analyze-hosts]] = Analyze and compare hosts -:description: Get a metrics-driven view of your hosts backed by an easy-to-use interface called Lens. -:keywords: serverless, observability, how to +// :description: Get a metrics-driven view of your hosts backed by an easy-to-use interface called Lens. +// :keywords: serverless, observability, how to preview:[] diff --git a/docs/en/serverless/infra-monitoring/aws-metrics.asciidoc b/docs/en/serverless/infra-monitoring/aws-metrics.asciidoc index 16faa322b1..2554415b28 100644 --- a/docs/en/serverless/infra-monitoring/aws-metrics.asciidoc +++ b/docs/en/serverless/infra-monitoring/aws-metrics.asciidoc @@ -1,8 +1,8 @@ [[observability-aws-metrics]] = AWS metrics -:description: Learn about key metrics used for AWS monitoring. -:keywords: serverless, observability, reference +// :description: Learn about key metrics used for AWS monitoring. +// :keywords: serverless, observability, reference preview:[] diff --git a/docs/en/serverless/infra-monitoring/configure-infra-settings.asciidoc b/docs/en/serverless/infra-monitoring/configure-infra-settings.asciidoc index 15c9f6c2d5..c1b19a05b0 100644 --- a/docs/en/serverless/infra-monitoring/configure-infra-settings.asciidoc +++ b/docs/en/serverless/infra-monitoring/configure-infra-settings.asciidoc @@ -1,8 +1,8 @@ [[observability-configure-intra-settings]] = Configure settings -:description: Learn how to configure infrastructure UI settings. -:keywords: serverless, observability, how to +// :description: Learn how to configure infrastructure UI settings. +// :keywords: serverless, observability, how to preview:[] diff --git a/docs/en/serverless/infra-monitoring/container-metrics.asciidoc b/docs/en/serverless/infra-monitoring/container-metrics.asciidoc index 7905b0d7e7..43c2bc1dc0 100644 --- a/docs/en/serverless/infra-monitoring/container-metrics.asciidoc +++ b/docs/en/serverless/infra-monitoring/container-metrics.asciidoc @@ -1,8 +1,8 @@ [[observability-container-metrics]] = Container metrics -:description: Learn about key container metrics used for container monitoring. -:keywords: serverless, observability, reference +// :description: Learn about key container metrics used for container monitoring. +// :keywords: serverless, observability, reference preview:[] diff --git a/docs/en/serverless/infra-monitoring/detect-metric-anomalies.asciidoc b/docs/en/serverless/infra-monitoring/detect-metric-anomalies.asciidoc index 93a97b7ad8..02738b691f 100644 --- a/docs/en/serverless/infra-monitoring/detect-metric-anomalies.asciidoc +++ b/docs/en/serverless/infra-monitoring/detect-metric-anomalies.asciidoc @@ -1,8 +1,8 @@ [[observability-detect-metric-anomalies]] = Detect metric anomalies -:description: Detect and inspect memory usage and network traffic anomalies for hosts and Kubernetes pods. -:keywords: serverless, observability, how to +// :description: Detect and inspect memory usage and network traffic anomalies for hosts and Kubernetes pods. +// :keywords: serverless, observability, how to preview:[] diff --git a/docs/en/serverless/infra-monitoring/get-started-with-metrics.asciidoc b/docs/en/serverless/infra-monitoring/get-started-with-metrics.asciidoc index a9e9f6ef82..7304619b60 100644 --- a/docs/en/serverless/infra-monitoring/get-started-with-metrics.asciidoc +++ b/docs/en/serverless/infra-monitoring/get-started-with-metrics.asciidoc @@ -1,8 +1,8 @@ [[observability-get-started-with-metrics]] = Get started with system metrics -:description: Learn how to onboard your system metrics data quickly. -:keywords: serverless, observability, how-to +// :description: Learn how to onboard your system metrics data quickly. +// :keywords: serverless, observability, how-to preview:[] diff --git a/docs/en/serverless/infra-monitoring/handle-no-results-found-message.asciidoc b/docs/en/serverless/infra-monitoring/handle-no-results-found-message.asciidoc index 16caed5b0c..5c3624aa86 100644 --- a/docs/en/serverless/infra-monitoring/handle-no-results-found-message.asciidoc +++ b/docs/en/serverless/infra-monitoring/handle-no-results-found-message.asciidoc @@ -1,8 +1,8 @@ [[observability-handle-no-results-found-message]] = Understanding "no results found" message -:description: Learn about the reasons for "no results found" messages and how to fix them. -:keywords: serverless, observability, how to +// :description: Learn about the reasons for "no results found" messages and how to fix them. +// :keywords: serverless, observability, how to preview:[] diff --git a/docs/en/serverless/infra-monitoring/host-metrics.asciidoc b/docs/en/serverless/infra-monitoring/host-metrics.asciidoc index aba070fcb2..27e3e16e16 100644 --- a/docs/en/serverless/infra-monitoring/host-metrics.asciidoc +++ b/docs/en/serverless/infra-monitoring/host-metrics.asciidoc @@ -1,8 +1,8 @@ [[observability-host-metrics]] = Host metrics -:description: Learn about key host metrics used for host monitoring. -:keywords: serverless, observability, reference +// :description: Learn about key host metrics used for host monitoring. +// :keywords: serverless, observability, reference preview:[] diff --git a/docs/en/serverless/infra-monitoring/infra-monitoring.asciidoc b/docs/en/serverless/infra-monitoring/infra-monitoring.asciidoc index 359ae9345f..8027837bbd 100644 --- a/docs/en/serverless/infra-monitoring/infra-monitoring.asciidoc +++ b/docs/en/serverless/infra-monitoring/infra-monitoring.asciidoc @@ -1,8 +1,8 @@ [[observability-infrastructure-monitoring]] = Infrastructure monitoring -:description: Monitor metrics from your servers, Docker, Kubernetes, Prometheus, and other services and applications. -:keywords: serverless, observability, overview +// :description: Monitor metrics from your servers, Docker, Kubernetes, Prometheus, and other services and applications. +// :keywords: serverless, observability, overview preview:[] diff --git a/docs/en/serverless/infra-monitoring/kubernetes-pod-metrics.asciidoc b/docs/en/serverless/infra-monitoring/kubernetes-pod-metrics.asciidoc index 49bcdf2970..ae946c6102 100644 --- a/docs/en/serverless/infra-monitoring/kubernetes-pod-metrics.asciidoc +++ b/docs/en/serverless/infra-monitoring/kubernetes-pod-metrics.asciidoc @@ -1,8 +1,8 @@ [[observability-kubernetes-pod-metrics]] = Kubernetes pod metrics -:description: Learn about key metrics used for Kubernetes monitoring. -:keywords: serverless, observability, reference +// :description: Learn about key metrics used for Kubernetes monitoring. +// :keywords: serverless, observability, reference preview:[] diff --git a/docs/en/serverless/infra-monitoring/metrics-app-fields.asciidoc b/docs/en/serverless/infra-monitoring/metrics-app-fields.asciidoc index 7757a177f7..758b4e7367 100644 --- a/docs/en/serverless/infra-monitoring/metrics-app-fields.asciidoc +++ b/docs/en/serverless/infra-monitoring/metrics-app-fields.asciidoc @@ -1,8 +1,8 @@ [[observability-infrastructure-monitoring-required-fields]] = Required fields -:description: Learn about the fields required to display data in the Infrastructure UI. -:keywords: serverless, observability, reference +// :description: Learn about the fields required to display data in the Infrastructure UI. +// :keywords: serverless, observability, reference preview:[] diff --git a/docs/en/serverless/infra-monitoring/metrics-reference.asciidoc b/docs/en/serverless/infra-monitoring/metrics-reference.asciidoc index 616a033c02..0b3ce231f9 100644 --- a/docs/en/serverless/infra-monitoring/metrics-reference.asciidoc +++ b/docs/en/serverless/infra-monitoring/metrics-reference.asciidoc @@ -1,8 +1,8 @@ [[observability-metrics-reference]] = Metrics reference -:description: Learn about key metrics used for infrastructure monitoring. -:keywords: serverless, observability, reference +// :description: Learn about key metrics used for infrastructure monitoring. +// :keywords: serverless, observability, reference preview:[] diff --git a/docs/en/serverless/infra-monitoring/troubleshooting-infra.asciidoc b/docs/en/serverless/infra-monitoring/troubleshooting-infra.asciidoc index b6af5f8a7d..8b66523c31 100644 --- a/docs/en/serverless/infra-monitoring/troubleshooting-infra.asciidoc +++ b/docs/en/serverless/infra-monitoring/troubleshooting-infra.asciidoc @@ -1,8 +1,8 @@ [[observability-troubleshooting-infrastructure-monitoring]] = Troubleshooting -:description: Learn how to troubleshoot issues with infrastructure monitoring. -:keywords: serverless, observability, how to +// :description: Learn how to troubleshoot issues with infrastructure monitoring. +// :keywords: serverless, observability, how to preview:[] diff --git a/docs/en/serverless/infra-monitoring/view-infrastructure-metrics.asciidoc b/docs/en/serverless/infra-monitoring/view-infrastructure-metrics.asciidoc index 5095f3b590..8a06aa4334 100644 --- a/docs/en/serverless/infra-monitoring/view-infrastructure-metrics.asciidoc +++ b/docs/en/serverless/infra-monitoring/view-infrastructure-metrics.asciidoc @@ -1,8 +1,8 @@ [[observability-view-infrastructure-metrics]] = View infrastructure metrics by resource type -:description: Get a metrics-driven view of your infrastructure grouped by resource type. -:keywords: serverless, observability, how to +// :description: Get a metrics-driven view of your infrastructure grouped by resource type. +// :keywords: serverless, observability, how to preview:[] diff --git a/docs/en/serverless/inventory.asciidoc b/docs/en/serverless/inventory.asciidoc index 5d18aa9d79..8339fbdad0 100644 --- a/docs/en/serverless/inventory.asciidoc +++ b/docs/en/serverless/inventory.asciidoc @@ -1,8 +1,8 @@ [[observability-inventory]] = Inventory -:description: Learn about the new Inventory experience that enables you to monitor all your entities from one single place. -:keywords: serverless, observability, inventory +// :description: Learn about the new Inventory experience that enables you to monitor all your entities from one single place. +// :keywords: serverless, observability, inventory preview:[] diff --git a/docs/en/serverless/logging/add-logs-service-name.asciidoc b/docs/en/serverless/logging/add-logs-service-name.asciidoc index 908cbb9c55..408198c127 100644 --- a/docs/en/serverless/logging/add-logs-service-name.asciidoc +++ b/docs/en/serverless/logging/add-logs-service-name.asciidoc @@ -1,8 +1,8 @@ [[observability-add-logs-service-name]] = Add a service name to logs -:description: Learn how to add a service name field to your logs. -:keywords: serverless, observability, overview +// :description: Learn how to add a service name field to your logs. +// :keywords: serverless, observability, overview Adding the `service.name` field to your logs associates them with the services that generate them. You can use this field to view and manage logs for distributed services located on multiple hosts. diff --git a/docs/en/serverless/logging/correlate-application-logs.asciidoc b/docs/en/serverless/logging/correlate-application-logs.asciidoc index c8e05e441a..a4b515df7b 100644 --- a/docs/en/serverless/logging/correlate-application-logs.asciidoc +++ b/docs/en/serverless/logging/correlate-application-logs.asciidoc @@ -1,8 +1,8 @@ [[observability-correlate-application-logs]] = Stream application logs -:description: Learn about application logs and options for ingesting them. -:keywords: serverless, observability, overview +// :description: Learn about application logs and options for ingesting them. +// :keywords: serverless, observability, overview preview:[] diff --git a/docs/en/serverless/logging/ecs-application-logs.asciidoc b/docs/en/serverless/logging/ecs-application-logs.asciidoc index ac73eaba3d..52a373c157 100644 --- a/docs/en/serverless/logging/ecs-application-logs.asciidoc +++ b/docs/en/serverless/logging/ecs-application-logs.asciidoc @@ -1,8 +1,8 @@ [[observability-ecs-application-logs]] = ECS formatted application logs -:description: Use an ECS logger or an {apm-agent} to format your logs in ECS format. -:keywords: serverless, observability, how-to +// :description: Use an ECS logger or an {apm-agent} to format your logs in ECS format. +// :keywords: serverless, observability, how-to preview:[] diff --git a/docs/en/serverless/logging/filter-and-aggregate-logs.asciidoc b/docs/en/serverless/logging/filter-and-aggregate-logs.asciidoc index 0eec3c4553..11f28086b5 100644 --- a/docs/en/serverless/logging/filter-and-aggregate-logs.asciidoc +++ b/docs/en/serverless/logging/filter-and-aggregate-logs.asciidoc @@ -1,7 +1,7 @@ [[observability-filter-and-aggregate-logs]] = Filter and aggregate logs -:keywords: serverless, observability, how-to +// :keywords: serverless, observability, how-to preview:[] diff --git a/docs/en/serverless/logging/get-started-with-logs.asciidoc b/docs/en/serverless/logging/get-started-with-logs.asciidoc index a857cca2cf..7a3adfd25e 100644 --- a/docs/en/serverless/logging/get-started-with-logs.asciidoc +++ b/docs/en/serverless/logging/get-started-with-logs.asciidoc @@ -1,8 +1,8 @@ [[observability-get-started-with-logs]] = Get started with system logs -:description: Learn how to onboard your system log data quickly. -:keywords: serverless, observability, how-to +// :description: Learn how to onboard your system log data quickly. +// :keywords: serverless, observability, how-to preview:[] diff --git a/docs/en/serverless/logging/log-monitoring.asciidoc b/docs/en/serverless/logging/log-monitoring.asciidoc index 7e028f715e..dbbeba23ec 100644 --- a/docs/en/serverless/logging/log-monitoring.asciidoc +++ b/docs/en/serverless/logging/log-monitoring.asciidoc @@ -1,8 +1,8 @@ [[observability-log-monitoring]] = Log monitoring -:description: Use Elastic to deploy and manage logs at a petabyte scale, and get insights from your logs in minutes. -:keywords: serverless, observability, overview +// :description: Use Elastic to deploy and manage logs at a petabyte scale, and get insights from your logs in minutes. +// :keywords: serverless, observability, overview preview:[] diff --git a/docs/en/serverless/logging/parse-log-data.asciidoc b/docs/en/serverless/logging/parse-log-data.asciidoc index a32d63d84c..330c45d370 100644 --- a/docs/en/serverless/logging/parse-log-data.asciidoc +++ b/docs/en/serverless/logging/parse-log-data.asciidoc @@ -1,7 +1,7 @@ [[observability-parse-log-data]] = Parse and route logs -:keywords: serverless, observability, how-to +// :keywords: serverless, observability, how-to preview:[] diff --git a/docs/en/serverless/logging/plaintext-application-logs.asciidoc b/docs/en/serverless/logging/plaintext-application-logs.asciidoc index a6c4081ee5..a4a8f96758 100644 --- a/docs/en/serverless/logging/plaintext-application-logs.asciidoc +++ b/docs/en/serverless/logging/plaintext-application-logs.asciidoc @@ -1,8 +1,8 @@ [[observability-plaintext-application-logs]] = Plaintext application logs -:description: Parse and ingest raw, plain-text application logs using a log shipper like Filebeat. -:keywords: serverless, observability, how-to +// :description: Parse and ingest raw, plain-text application logs using a log shipper like Filebeat. +// :keywords: serverless, observability, how-to preview:[] diff --git a/docs/en/serverless/logging/run-log-pattern-analysis.asciidoc b/docs/en/serverless/logging/run-log-pattern-analysis.asciidoc index 6caeb4500b..b6b54a4749 100644 --- a/docs/en/serverless/logging/run-log-pattern-analysis.asciidoc +++ b/docs/en/serverless/logging/run-log-pattern-analysis.asciidoc @@ -1,8 +1,8 @@ [[observability-run-log-pattern-analysis]] = Run a pattern analysis on log data -:description: Find patterns in unstructured log messages. -:keywords: serverless, observability, how-to +// :description: Find patterns in unstructured log messages. +// :keywords: serverless, observability, how-to preview:[] diff --git a/docs/en/serverless/logging/send-application-logs.asciidoc b/docs/en/serverless/logging/send-application-logs.asciidoc index 9ae9a7804c..445c645620 100644 --- a/docs/en/serverless/logging/send-application-logs.asciidoc +++ b/docs/en/serverless/logging/send-application-logs.asciidoc @@ -1,8 +1,8 @@ [[observability-send-application-logs]] = {apm-agent} log sending -:description: Use the Java {apm-agent} to capture and send logs. -:keywords: serverless, observability, how-to +// :description: Use the Java {apm-agent} to capture and send logs. +// :keywords: serverless, observability, how-to preview:[] diff --git a/docs/en/serverless/logging/stream-log-files.asciidoc b/docs/en/serverless/logging/stream-log-files.asciidoc index 2717fc979f..b83d62e71f 100644 --- a/docs/en/serverless/logging/stream-log-files.asciidoc +++ b/docs/en/serverless/logging/stream-log-files.asciidoc @@ -1,8 +1,8 @@ [[observability-stream-log-files]] = Stream any log file -:description: Send a log file to your Observability project using the standalone {agent}. -:keywords: serverless, observability, how-to +// :description: Send a log file to your Observability project using the standalone {agent}. +// :keywords: serverless, observability, how-to preview:[] diff --git a/docs/en/serverless/logging/troubleshoot-logs.asciidoc b/docs/en/serverless/logging/troubleshoot-logs.asciidoc index ef99d95f47..2d025616f1 100644 --- a/docs/en/serverless/logging/troubleshoot-logs.asciidoc +++ b/docs/en/serverless/logging/troubleshoot-logs.asciidoc @@ -1,8 +1,8 @@ [[observability-troubleshoot-logs]] = Troubleshoot logs -:description: Find solutions to errors you might encounter while onboarding your logs. -:keywords: serverless, observability, troubleshooting +// :description: Find solutions to errors you might encounter while onboarding your logs. +// :keywords: serverless, observability, troubleshooting preview:[] diff --git a/docs/en/serverless/logging/view-and-monitor-logs.asciidoc b/docs/en/serverless/logging/view-and-monitor-logs.asciidoc index 351f65ff75..7047a727ea 100644 --- a/docs/en/serverless/logging/view-and-monitor-logs.asciidoc +++ b/docs/en/serverless/logging/view-and-monitor-logs.asciidoc @@ -1,8 +1,8 @@ [[observability-discover-and-explore-logs]] = Explore logs -:description: Visualize and analyze logs. -:keywords: serverless, observability, how-to +// :description: Visualize and analyze logs. +// :keywords: serverless, observability, how-to preview:[] diff --git a/docs/en/serverless/monitor-datasets.asciidoc b/docs/en/serverless/monitor-datasets.asciidoc index 3b4ed0c460..a6a17b7297 100644 --- a/docs/en/serverless/monitor-datasets.asciidoc +++ b/docs/en/serverless/monitor-datasets.asciidoc @@ -1,8 +1,8 @@ [[observability-monitor-datasets]] = Data set quality monitoring -:description: Monitor data sets to find degraded documents. -:keywords: serverless, observability, how-to +// :description: Monitor data sets to find degraded documents. +// :keywords: serverless, observability, how-to beta:[] diff --git a/docs/en/serverless/observability-overview.asciidoc b/docs/en/serverless/observability-overview.asciidoc index 0ba83bd2cc..d20354bda6 100644 --- a/docs/en/serverless/observability-overview.asciidoc +++ b/docs/en/serverless/observability-overview.asciidoc @@ -1,8 +1,8 @@ [[observability-serverless-observability-overview]] = Observability overview -:description: Learn how to accelerate problem resolution with open, flexible, and unified observability powered by advanced machine learning and analytics. -:keywords: serverless, observability, overview +// :description: Learn how to accelerate problem resolution with open, flexible, and unified observability powered by advanced machine learning and analytics. +// :keywords: serverless, observability, overview preview:[] diff --git a/docs/en/serverless/projects/billing.asciidoc b/docs/en/serverless/projects/billing.asciidoc index 1bf9c64fc3..a117dcfda3 100644 --- a/docs/en/serverless/projects/billing.asciidoc +++ b/docs/en/serverless/projects/billing.asciidoc @@ -1,8 +1,8 @@ [[observability-billing]] = Observability billing dimensions -:description: Learn about how Observability usage affects pricing. -:keywords: serverless, observability, overview +// :description: Learn about how Observability usage affects pricing. +// :keywords: serverless, observability, overview preview:[] diff --git a/docs/en/serverless/projects/create-an-observability-project.asciidoc b/docs/en/serverless/projects/create-an-observability-project.asciidoc index fb17cc270c..72229983c5 100644 --- a/docs/en/serverless/projects/create-an-observability-project.asciidoc +++ b/docs/en/serverless/projects/create-an-observability-project.asciidoc @@ -1,8 +1,8 @@ [[observability-create-an-observability-project]] = Create an {observability} project -:description: Create a fully-managed {observability} project to monitor the health of your applications. -:keywords: serverless, observability, how-to +// :description: Create a fully-managed {observability} project to monitor the health of your applications. +// :keywords: serverless, observability, how-to ++++ <titleabbrev>Create an Observability project</titleabbrev> diff --git a/docs/en/serverless/quickstarts/k8s-logs-metrics.asciidoc b/docs/en/serverless/quickstarts/k8s-logs-metrics.asciidoc index 1f64f4e633..e3f0fdfc0a 100644 --- a/docs/en/serverless/quickstarts/k8s-logs-metrics.asciidoc +++ b/docs/en/serverless/quickstarts/k8s-logs-metrics.asciidoc @@ -1,8 +1,8 @@ [[observability-quickstarts-k8s-logs-metrics]] = Monitor your Kubernetes cluster with Elastic Agent -:description: Learn how to monitor your cluster infrastructure running on Kubernetes. -:keywords: serverless, observability, how-to +// :description: Learn how to monitor your cluster infrastructure running on Kubernetes. +// :keywords: serverless, observability, how-to preview:[] diff --git a/docs/en/serverless/quickstarts/monitor-hosts-with-elastic-agent.asciidoc b/docs/en/serverless/quickstarts/monitor-hosts-with-elastic-agent.asciidoc index 98c1bfa958..b790e73474 100644 --- a/docs/en/serverless/quickstarts/monitor-hosts-with-elastic-agent.asciidoc +++ b/docs/en/serverless/quickstarts/monitor-hosts-with-elastic-agent.asciidoc @@ -1,8 +1,8 @@ [[observability-quickstarts-monitor-hosts-with-elastic-agent]] = Monitor hosts with {agent} -:description: Learn how to scan your hosts to detect and collect logs and metrics. -:keywords: serverless, observability, how-to +// :description: Learn how to scan your hosts to detect and collect logs and metrics. +// :keywords: serverless, observability, how-to preview:[] diff --git a/docs/en/serverless/quickstarts/overview.asciidoc b/docs/en/serverless/quickstarts/overview.asciidoc index cacb2a9513..dfe7452124 100644 --- a/docs/en/serverless/quickstarts/overview.asciidoc +++ b/docs/en/serverless/quickstarts/overview.asciidoc @@ -1,8 +1,8 @@ [[observability-quickstarts-overview]] = Quickstarts -:description: Learn how to ingest your observability data and get immediate value. -:keywords: serverless, observability, how-to +// :description: Learn how to ingest your observability data and get immediate value. +// :keywords: serverless, observability, how-to Our quickstarts dramatically reduce your time-to-value by offering a fast path to ingest and visualize your Observability data. Each quickstart provides: diff --git a/docs/en/serverless/slos/create-an-slo.asciidoc b/docs/en/serverless/slos/create-an-slo.asciidoc index 951cb8a63a..6c007d8cdd 100644 --- a/docs/en/serverless/slos/create-an-slo.asciidoc +++ b/docs/en/serverless/slos/create-an-slo.asciidoc @@ -1,8 +1,8 @@ [[observability-create-an-slo]] = Create an SLO -:description: Learn how to define a service-level indicator (SLI), set an objective, and create a service-level objective (SLO). -:keywords: serverless, observability, how-to +// :description: Learn how to define a service-level indicator (SLI), set an objective, and create a service-level objective (SLO). +// :keywords: serverless, observability, how-to preview:[] diff --git a/docs/en/serverless/slos/slos.asciidoc b/docs/en/serverless/slos/slos.asciidoc index 604e6efff0..98004edd0c 100644 --- a/docs/en/serverless/slos/slos.asciidoc +++ b/docs/en/serverless/slos/slos.asciidoc @@ -1,8 +1,8 @@ [[observability-slos]] = SLOs -:description: Set clear, measurable targets for your service performance with service-level objectives (SLOs). -:keywords: serverless, observability, overview +// :description: Set clear, measurable targets for your service performance with service-level objectives (SLOs). +// :keywords: serverless, observability, overview preview:[] diff --git a/docs/en/serverless/technical-preview-limitations.asciidoc b/docs/en/serverless/technical-preview-limitations.asciidoc index 78c2ef5515..6a93564ae2 100644 --- a/docs/en/serverless/technical-preview-limitations.asciidoc +++ b/docs/en/serverless/technical-preview-limitations.asciidoc @@ -1,8 +1,8 @@ [[observability-technical-preview-limitations]] = Technical preview limitations -:description: Review the limitations that apply to Elastic Observability projects in technical preview. -:keywords: serverless, observability +// :description: Review the limitations that apply to Elastic Observability projects in technical preview. +// :keywords: serverless, observability preview:[] diff --git a/docs/en/serverless/what-is-observability-serverless.asciidoc b/docs/en/serverless/what-is-observability-serverless.asciidoc index 74efe1046a..940948ae71 100644 --- a/docs/en/serverless/what-is-observability-serverless.asciidoc +++ b/docs/en/serverless/what-is-observability-serverless.asciidoc @@ -1,4 +1,4 @@ -:keywords: serverless, observability, overview +// :keywords: serverless, observability, overview preview:[]