Quickstart for Docker on Elastic Cloud Hosted
Learn how to set up the Elastic Agent and EDOT SDKs in a Docker environment with Elastic Cloud Hosted (ECH) to collect host metrics, logs, and application traces. This quickstart uses the Elastic Cloud Managed OTLP Endpoint, which is the recommended ingestion path for ECH.
- An Elastic Cloud Hosted deployment running version 9.0 or later.
- Docker and Docker Compose installed on the host.
The fastest way to get started is the Add data screen in Elastic Observability. It generates install commands with your endpoint and API key already included.
- Open Elastic Observability.
- Go to Add data.
- Select what you want to monitor.
- Follow the instructions.
If you need to manage credentials manually, for example, to use them in automation or to configure multiple environments, follow the steps in the Manual installation section.
Follow these steps to deploy the Elastic Agent and EDOT SDKs in Docker with ECH:
-
Create the config file
Create an Elastic Agent configuration file for the Elastic Cloud Managed OTLP Endpoint. This example uses the filename
otel-collector-config.yml.Start from the logs, metrics, and traces sample for the Elastic Cloud Managed OTLP Endpoint. The sample is written for a host process, so adapt it for the Compose mounts in this quickstart:
In
file_log/platformlogs, setincludeto[/hostfs/var/log/*.log].In
hostmetrics/system, setroot_path: /hostfs.Add a
docker_statsreceiver and a pipeline that exports those metrics:receivers: docker_stats: {} service: pipelines: metrics/docker: receivers: [docker_stats] processors: [resourcedetection] exporters: [otlp_grpc/ingest_metrics_traces]
Keep the other receivers, processors, exporters, and pipelines from the sample. The result is a Docker-specific configuration, as the adaptations replace host paths with
/hostfsmount paths and add Docker metrics collection. For details about the pipelines, refer to Using the Managed OTLP Endpoint. -
Find your endpoint and create an API key
Find your endpoint
The easiest way to get your endpoint and API key is from the Add data screen in Kibana:
- Go to Add data.
- In the Connect directly to the endpoint section, select the OpenTelemetry tab.
- Copy the Endpoint value.
- Click Create key to generate an API key with the required privileges.
Alternatively, retrieve the endpoint from the Elastic Cloud Console and create an API key manually:
- Log in to the Elastic Cloud Console.
- Find your deployment in Hosted deployments, and select Manage.
- In the Application endpoints, cluster and component IDs section, select Managed OTLP.
- Copy the public endpoint value.
Create an API key
NoteThe Elastic Cloud Managed OTLP Endpoint validates API keys using APM application privileges. Index-level privilege scoping is not yet supported, meaning that API keys with custom index-level role descriptors return a
PermissionDeniederror.Using KibanaGo to Stack Management → API keys.
Click Create API key, enter a name, and enable Control security privileges.
In the role descriptors box, enter the following privileges:
{ "otlp_writer": { "applications": [ { "application": "apm", "resources": ["*"], "privileges": ["event:write"] } ] } }Click Create API key and copy the encoded value.
Using the Elasticsearch APIUse the Create API key API:
POST /_security/api_key{ "name": "otlp-writer", "role_descriptors": { "otlp_writer": { "applications": [ { "application": "apm", "resources": ["*"], "privileges": ["event:write"] } ] } } }The
event:writeprivilege for theapmapplication is the minimum required to send data through the Elastic Cloud Managed OTLP Endpoint. -
Create the .env file
Create a
.envfile with the following content. Replace the placeholders with your Elastic Cloud credentials and the path to the configuration file you created:HOST_FILESYSTEM=/ DOCKER_SOCK=/var/run/docker.sock ELASTIC_AGENT_OTEL=true COLLECTOR_CONTRIB_IMAGE=elastic/elastic-agent:9.5.3 ELASTIC_API_KEY=<your_api_key_here> ELASTIC_OTLP_ENDPOINT=<your_motlp_endpoint_here> OTEL_COLLECTOR_CONFIG=/path/to/otel-collector-config.yml -
Create the compose file
Create a
compose.ymlfile with the following content:services: otel-collector: image: ${COLLECTOR_CONTRIB_IMAGE} container_name: otel-collector deploy: resources: limits: memory: 1.5G restart: unless-stopped command: ["--config", "/etc/otelcol-config.yml" ] network_mode: host user: "0:0" volumes: - ${HOST_FILESYSTEM}:/hostfs:ro - ${DOCKER_SOCK}:/var/run/docker.sock:ro - ${OTEL_COLLECTOR_CONFIG}:/etc/otelcol-config.yml environment: - HOST_FILESYSTEM - ELASTIC_AGENT_OTEL - ELASTIC_API_KEY - ELASTIC_OTLP_ENDPOINT - STORAGE_DIR=/usr/share/elastic-agent -
Start the Collector
To start the Collector, run:
docker compose up -d -
(Optional) Instrument your applications
To collect telemetry from applications and use the Elastic Agent as a gateway, instrument your target applications following the setup instructions:
Configure your SDKs to send the data to the local Elastic Agent using OTLP/gRPC (
http://localhost:4317) or OTLP/HTTP (http://localhost:4318).TipEnable Central Configuration to configure your EDOT SDKs from within Kibana. Refer to EDOT SDKs Central Configuration.
-
Install the content packs
Install the System OpenTelemetry Assets integration and the Docker OpenTelemetry Assets integration in Kibana.
-
Explore your data
Go to Kibana and select Dashboards to explore your newly collected data.
If you need to write telemetry directly to Elasticsearch (for example, for pipeline customizations not yet supported through Elastic Cloud Managed OTLP Endpoint), use a different Collector configuration, .env file, and compose file. For a full list of features and limitations that apply to each path, refer to Elastic features available with Elastic OpenTelemetry.
Start from the logs, metrics, and traces sample for direct ingestion into Elasticsearch. The sample is written for a host process, so adapt it for the Compose mounts in this quickstart:
In
file_log/platformlogs, setincludeto[/hostfs/var/log/*.log].In
hostmetrics/system, setroot_path: /hostfs.Add a
docker_statsreceiver and a pipeline that exports those metrics:receivers: docker_stats: {} service: pipelines: metrics/docker: receivers: [docker_stats] processors: [resourcedetection] exporters: [elasticsearch/otel]
Keep the other receivers, processors, exporters, and pipelines from the sample. For details about the pipelines, refer to Direct ingestion into Elasticsearch.
Retrieve your Elasticsearch URL and your API key:
Retrieve the Elasticsearch URL for your Elastic Cloud deployment:
- Go to the Elastic Cloud console.
- Next to your deployment, select Manage.
- Under Applications next to Elasticsearch, select Copy endpoint.
Create an API Key following these instructions.
Create a .env file with your Elasticsearch endpoint, credentials, and the path to the configuration file:
HOST_FILESYSTEM=/
DOCKER_SOCK=/var/run/docker.sock
ELASTIC_AGENT_OTEL=true
COLLECTOR_CONTRIB_IMAGE=elastic/elastic-agent:9.5.3
ELASTIC_API_KEY=<your_api_key_here>
ELASTIC_ENDPOINT=<your_elasticsearch_endpoint_here>
OTEL_COLLECTOR_CONFIG=/path/to/otel-collector-config.yml
Use the following compose file, which passes ELASTIC_ENDPOINT instead of ELASTIC_OTLP_ENDPOINT:
services:
otel-collector:
image: ${COLLECTOR_CONTRIB_IMAGE}
container_name: otel-collector
deploy:
resources:
limits:
memory: 1.5G
restart: unless-stopped
command: ["--config", "/etc/otelcol-config.yml" ]
network_mode: host
user: "0:0"
volumes:
- ${HOST_FILESYSTEM}:/hostfs:ro
- ${DOCKER_SOCK}:/var/run/docker.sock:ro
- ${OTEL_COLLECTOR_CONFIG}:/etc/otelcol-config.yml
environment:
- HOST_FILESYSTEM
- ELASTIC_AGENT_OTEL
- ELASTIC_API_KEY
- ELASTIC_ENDPOINT
- STORAGE_DIR=/usr/share/elastic-agent
The following issues might occur.
The following error is due to an improperly formatted API key, and typically occurs when credentials are configured manually:
Exporting failed. Dropping data.
{"kind": "exporter", "data_type": }
"Unauthenticated desc = ApiKey prefix not found"
For a Collector, format the header as "Authorization": "ApiKey <api-key>". For an SDK, format it as "Authorization=ApiKey <api-key>".
For additional troubleshooting, refer to Troubleshooting common issues with the Elastic Agent and Troubleshooting the EDOT SDKs.