Data Ingestion
IceGate accepts observability data via the OpenTelemetry Protocol (OTLP). This guide covers how to ingest logs, traces, and metrics.
Supported Protocols
| Protocol | Port | Description |
|---|---|---|
| OTLP HTTP | 4318 | HTTP/JSON or HTTP/Protobuf |
| OTLP gRPC | 4317 | gRPC/Protobuf |
Ingesting Logs
OTLP HTTP
Send logs using the OTLP HTTP endpoint:
curl -X POST http://localhost:4318/v1/logs \
-H "Content-Type: application/json" \
-H "X-Scope-OrgID: my-tenant" \
-d '{
"resourceLogs": [{
"resource": {
"attributes": [
{"key": "service.name", "value": {"stringValue": "api-service"}}
]
},
"scopeLogs": [{
"logRecords": [{
"timeUnixNano": "1704067200000000000",
"body": {"stringValue": "Request processed successfully"},
"severityText": "INFO",
"severityNumber": 9,
"attributes": [
{"key": "http.method", "value": {"stringValue": "GET"}},
{"key": "http.status_code", "value": {"intValue": "200"}}
]
}]
}]
}]
}'
Using OpenTelemetry SDKs
Configure your OpenTelemetry SDK to send logs to IceGate:
# Python example
from opentelemetry.sdk._logs import LoggerProvider
from opentelemetry.sdk._logs.export import BatchLogRecordProcessor
from opentelemetry.exporter.otlp.proto.http._log_exporter import OTLPLogExporter
logger_provider = LoggerProvider()
logger_provider.add_log_record_processor(
BatchLogRecordProcessor(
OTLPLogExporter(
endpoint="http://localhost:4318/v1/logs",
headers={"X-Scope-OrgID": "my-tenant"}
)
)
)
Ingesting Traces
Send distributed trace spans to IceGate:
curl -X POST http://localhost:4318/v1/traces \
-H "Content-Type: application/json" \
-H "X-Scope-OrgID: my-tenant" \
-d '{
"resourceSpans": [{
"resource": {
"attributes": [
{"key": "service.name", "value": {"stringValue": "api-service"}}
]
},
"scopeSpans": [{
"spans": [{
"traceId": "5B8EFFF798038103D269B633813FC60C",
"spanId": "EEE19B7EC3C1B174",
"name": "GET /api/users",
"kind": 2,
"startTimeUnixNano": "1704067200000000000",
"endTimeUnixNano": "1704067200100000000",
"status": {"code": 1}
}]
}]
}]
}'
Ingesting Metrics
Send metrics using OTLP:
curl -X POST http://localhost:4318/v1/metrics \
-H "Content-Type: application/json" \
-H "X-Scope-OrgID: my-tenant" \
-d '{
"resourceMetrics": [{
"resource": {
"attributes": [
{"key": "service.name", "value": {"stringValue": "api-service"}}
]
},
"scopeMetrics": [{
"metrics": [{
"name": "http_requests_total",
"sum": {
"dataPoints": [{
"startTimeUnixNano": "1704067200000000000",
"timeUnixNano": "1704067260000000000",
"asInt": "1234"
}],
"aggregationTemporality": 2,
"isMonotonic": true
}
}]
}]
}]
}'
Tenant Identification
IceGate is multi-tenant. Specify the tenant using the X-Scope-OrgID header:
curl -X POST http://localhost:4318/v1/logs \
-H "X-Scope-OrgID: tenant-123" \
-H "Content-Type: application/json" \
-d '...'
Data Flow
- Ingest Service receives OTLP data
- Data is written to WAL (Write-Ahead Log) as Parquet files
- Maintain Service compacts WAL into optimized Iceberg tables
- Query Service reads from both WAL (real-time) and Iceberg (historical)
Delivery Guarantees
IceGate provides exactly-once delivery semantics:
- Data is durably written to object storage before acknowledgment
- Idempotent writes prevent duplicates
- WAL ensures no data loss during compaction
Next Steps
- Learn how to Query Data
- Set up Multi-Tenancy
- Explore the Loki API for querying
Previous
Next