Quickstart for hosts and VMs on Elastic Cloud Hosted
Learn how to set up the Elastic Agent and EDOT SDKs on hosts and VMs with Elastic Cloud Hosted (ECH) to collect host metrics, logs, and application traces. This quickstart uses the Elastic Cloud Managed OTLP Endpoint — the recommended ingestion path for ECH.
Use the Add data screen in Elastic Observability to generate install commands that are already configured with the values you need.
- Open Elastic Observability.
- Go to Add data.
- Select what you want to monitor.
- Follow the instructions.
- An Elastic Cloud Hosted deployment running version 9.0 or later.
- The host or VM running a supported operating system (Linux, macOS, or Windows).
Follow these steps to deploy the Elastic Agent and EDOT SDKs with ECH.
-
Download the Elastic Agent
Download the Elastic Agent for your operating system.
-
Find your endpoint and create an API key
Find your endpoint
- Log in to the Elastic Cloud Console.
- From the home page, 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
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:
{ "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. -
Configure the Elastic Agent
Replace
<ELASTIC_OTLP_ENDPOINT>and<ELASTIC_API_KEY>before applying the following commands.ELASTIC_OTLP_ENDPOINT=<ELASTIC_OTLP_ENDPOINT> && \ ELASTIC_API_KEY=<ELASTIC_API_KEY> && \ cp ./otel_samples/managed_otlp/logs_metrics_traces.yml ./otel.yml && \ mkdir -p ./data/otelcol && \ sed -i "s#\${env:STORAGE_DIR}#${PWD}/data/otelcol#g" ./otel.yml && \ sed -i "s#\${env:ELASTIC_OTLP_ENDPOINT}#${ELASTIC_OTLP_ENDPOINT}#g" ./otel.yml && \ sed -i "s#\${env:ELASTIC_API_KEY}#${ELASTIC_API_KEY}#g" ./otel.ymlELASTIC_OTLP_ENDPOINT=<ELASTIC_OTLP_ENDPOINT> && \ ELASTIC_API_KEY=<ELASTIC_API_KEY> && \ cp ./otel_samples/managed_otlp/logs_metrics_traces.yml ./otel.yml && \ mkdir -p ./data/otelcol && \ sed -i '' "s#\${env:STORAGE_DIR}#${PWD}/data/otelcol#g" ./otel.yml && \ sed -i '' "s#\${env:ELASTIC_OTLP_ENDPOINT}#${ELASTIC_OTLP_ENDPOINT}#g" ./otel.yml && \ sed -i '' "s#\${env:ELASTIC_API_KEY}#${ELASTIC_API_KEY}#g" ./otel.ymlRemove-Item -Path .\otel.yml -ErrorAction SilentlyContinue Copy-Item .\otel_samples\managed_otlp\logs_metrics_traces.yml .\otel.yml New-Item -ItemType Directory -Force -Path .\data\otelcol | Out-Null $content = Get-Content .\otel.yml $content = $content -replace '\${env:STORAGE_DIR}', "$PWD\data\otelcol" $content = $content -replace '\${env:ELASTIC_OTLP_ENDPOINT}', "<ELASTIC_OTLP_ENDPOINT>" $content = $content -replace '\${env:ELASTIC_API_KEY}', "<ELASTIC_API_KEY>" $content | Set-Content .\otel.ymlFor more details, refer to the configuration reference.
-
Run the Elastic Agent
Use the following command to start the Elastic Agent.
sudo ./otelcol --config otel.yml.\elastic-agent.exe otel --config otel.ymlNoteBy default, the Collector opens ports
4317and4318to receive application data from locally running OTel SDKs. -
(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). -
Explore your data
Go to Kibana and select Dashboards to explore your newly collected data.
If you need to write telemetry directly to Elasticsearch using the elasticsearch exporter — for example, for pipeline customizations not yet supported through Elastic Cloud Managed OTLP Endpoint — follow these steps.
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.
Replace <ELASTICSEARCH_ENDPOINT> and <ELASTIC_API_KEY> before applying the following commands.
ELASTICSEARCH_ENDPOINT=<ELASTICSEARCH_ENDPOINT> && \
ELASTIC_API_KEY=<ELASTIC_API_KEY> && \
cp ./otel_samples/logs_metrics_traces.yml ./otel.yml && \
mkdir -p ./data/otelcol && \
sed -i "s#\${env:STORAGE_DIR}#${PWD}/data/otelcol#g" ./otel.yml && \
sed -i "s#\${env:ELASTIC_ENDPOINT}#${ELASTICSEARCH_ENDPOINT}#g" ./otel.yml && \
sed -i "s#\${env:ELASTIC_API_KEY}#${ELASTIC_API_KEY}#g" ./otel.yml
ELASTICSEARCH_ENDPOINT=<ELASTICSEARCH_ENDPOINT> && \
ELASTIC_API_KEY=<ELASTIC_API_KEY> && \
cp ./otel_samples/logs_metrics_traces.yml ./otel.yml && \
mkdir -p ./data/otelcol && \
sed -i '' "s#\${env:STORAGE_DIR}#${PWD}/data/otelcol#g" ./otel.yml && \
sed -i '' "s#\${env:ELASTIC_ENDPOINT}#${ELASTICSEARCH_ENDPOINT}#g" ./otel.yml && \
sed -i '' "s#\${env:ELASTIC_API_KEY}#${ELASTIC_API_KEY}#g" ./otel.yml
Remove-Item -Path .\otel.yml -ErrorAction SilentlyContinue
Copy-Item .\otel_samples\logs_metrics_traces.yml .\otel.yml
New-Item -ItemType Directory -Force -Path .\data\otelcol | Out-Null
$content = Get-Content .\otel.yml
$content = $content -replace '\${env:STORAGE_DIR}', "$PWD\data\otelcol"
$content = $content -replace '\${env:ELASTIC_ENDPOINT}', "<ELASTICSEARCH_ENDPOINT>"
$content = $content -replace '\${env:ELASTIC_API_KEY}', "<ELASTIC_API_KEY>"
$content | Set-Content .\otel.yml
The following issues might occur.
The following error is due to an improperly formatted API key:
Exporting failed. Dropping data.
{"kind": "exporter", "data_type": }
"Unauthenticated desc = ApiKey prefix not found"
Format your API key as "Authorization": "ApiKey <api-key-value-here>" or "Authorization=ApiKey <api-key>" depending on whether you're using a Collector or SDK.
For additional troubleshooting, refer to Troubleshooting common issues with the Elastic Agent and Troubleshooting the EDOT SDKs.