Skip to content

OpenTelemetry

New here? Start with the Quickstart to launch Icelake + Grafana locally and send your first telemetry in 5 minutes.

Icelake speaks OTLP protobuf natively for logs, metrics, and traces. Ship observability data from any OTel-instrumented application or from the OpenTelemetry Collector — no adapters in between.

All OTLP endpoints authenticate via HTTP Basic auth — username is your client ID, password is your API key (ilk_ + 64 hex characters).

Point your OTel Collector’s otlphttp exporter at Icelake:

otel-collector-config.yaml
exporters:
otlphttp:
endpoint: "https://api.icelake.eu"
auth:
authenticator: basicauth/icelake
extensions:
basicauth/icelake:
client_auth:
username: "your-client-id"
password: "ilk_your-api-key-here"
service:
extensions: [basicauth/icelake]
pipelines:
logs:
receivers: [otlp]
processors: [batch]
exporters: [otlphttp]
metrics:
receivers: [otlp]
processors: [batch]
exporters: [otlphttp]
traces:
receivers: [otlp]
processors: [batch]
exporters: [otlphttp]

Check that data is flowing:

Terminal window
# Health check
curl https://api.icelake.eu/health
# Query ingested OTel logs via the Loki-compatible API
curl -u "your-client-id:ilk_your-api-key-here" \
"https://api.icelake.eu/loki/api/v1/query?query={source=\"otel\"}"

All three endpoints accept OTLP/HTTP protobuf payloads with Basic auth.

POST /v1/logs
Content-Type: application/x-protobuf
Authorization: Basic <base64("client_id:api_key")>

OTel log records are mapped to Icelake’s log storage with:

  • body → log message
  • resource.attributes → labels
  • timestamp → nanosecond precision timestamp
  • severity → log level label
POST /v1/metrics
Content-Type: application/x-protobuf
Authorization: Basic <base64("client_id:api_key")>

OTel metrics are converted to Prometheus-compatible format:

  • Gauge → Prometheus gauge
  • Sum (monotonic) → Prometheus counter
  • Histogram → Prometheus histogram
  • Attributes → Prometheus labels
POST /v1/traces
Content-Type: application/x-protobuf
Authorization: Basic <base64("client_id:api_key")>

For simple setups, export directly from your application:

Python Example
import base64
from opentelemetry.exporter.otlp.proto.http.log_exporter import OTLPLogExporter
creds = base64.b64encode(b"your-client-id:ilk_your-api-key-here").decode()
exporter = OTLPLogExporter(
endpoint="https://api.icelake.eu/v1/logs",
headers={"Authorization": f"Basic {creds}"},
)
Node.js Example
const { OTLPLogExporter } = require('@opentelemetry/exporter-logs-otlp-http');
const creds = Buffer.from('your-client-id:ilk_your-api-key-here').toString('base64');
const exporter = new OTLPLogExporter({
url: 'https://api.icelake.eu/v1/logs',
headers: {
Authorization: `Basic ${creds}`,
},
});

OTel data is stored alongside Prometheus and Loki data in Parquet format on S3:

S3 Storage Layout
s3://icelake-data/
├── metrics/ # Prometheus + OTel metrics
├── logs/ # Loki + OTel logs
└── traces/ # OTel traces
└── tenant=default/
└── 2026/02/20/
├── traces_001.parquet
└── compacted_001.parquet
EndpointMethodContent-TypeDescription
/v1/logsPOSTapplication/x-protobufOTLP log ingestion
/v1/metricsPOSTapplication/x-protobufOTLP metric ingestion
/v1/tracesPOSTapplication/x-protobufOTLP trace ingestion

Pro tip: use the OpenTelemetry Collector as a gateway to batch, filter, and route data before sending to Icelake.

  • Use the batch processor in your OTel Collector for efficient ingestion
  • Map resource attributes to meaningful labels for queryability
  • Set up separate pipelines for logs, metrics, and traces
  • Monitor collector health alongside Icelake ingestion rates
  • Quickstart — end-to-end Icelake + Grafana setup in 5 minutes
  • Prometheus — remote write path for metrics-only pipelines
  • Loki & LogQL — log-shipping alternative if you’re not on OTEL