Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions otel-ecs-ec2/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# Changelog

### v0.0.37 / 2026-06-30

- [Breaking] eBPF profiler profiles are now sent through the node-local agent `profilesCollection` pipeline enrichment and Coralogix export. Previously, the profiler sent profiles directly to Coralogix, so installations that customize the profiler or agent profile pipeline should update their configuration to route profiles through the agent.

### v0.0.36 / 2026-06-30

- [Change] Update Helm dependency `opentelemetry-agent` to chart version `0.134.2`.
Expand Down
2 changes: 1 addition & 1 deletion otel-ecs-ec2/Chart.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
apiVersion: v2
name: ecs-ec2-integration
description: ECS-EC2 OpenTelemetry Integration
version: 0.0.36
version: 0.0.37
keywords:
- OpenTelemetry Collector
- OpenTelemetry Agent
Expand Down
174 changes: 95 additions & 79 deletions otel-ecs-ec2/examples/otel-config-ebpf.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,38 @@ processors:
traces:
span:
- span.attributes["db.system"] == nil
k8sattributes/profiles:
extract:
labels:
- from: pod
key: app.kubernetes.io/name
tag_name: k8s.label.name
- from: pod
key: app.kubernetes.io/instance
tag_name: k8s.label.instance
metadata:
- k8s.namespace.name
- k8s.replicaset.name
- k8s.statefulset.name
- k8s.daemonset.name
- k8s.deployment.name
- k8s.cronjob.name
- k8s.job.name
- k8s.pod.name
- k8s.node.name
- container.id
- k8s.container.name
- service.version
otel_annotations: true
filter:
node_from_env_var: K8S_NODE_NAME
passthrough: false
pod_association:
- sources:
- from: resource_attribute
name: container.id
- sources:
- from: connection
memory_limiter:
check_interval: 5s
limit_percentage: 80
Expand Down Expand Up @@ -307,6 +339,50 @@ processors:
- context: resource
statements:
- keep_keys(resource.attributes, [""])
transform/profiles:
profile_statements:
- set(resource.attributes["service.name"], resource.attributes["k8s.label.instance"])
where resource.attributes["service.name"] == nil and resource.attributes["k8s.label.instance"]
!= nil
- set(resource.attributes["service.name"], resource.attributes["k8s.label.name"])
where resource.attributes["service.name"] == nil and resource.attributes["k8s.label.name"]
!= nil
- set(resource.attributes["service.name"], resource.attributes["k8s.deployment.name"])
where resource.attributes["service.name"] == nil and resource.attributes["k8s.deployment.name"]
!= nil
- set(resource.attributes["service.name"], resource.attributes["k8s.replicaset.name"])
where resource.attributes["service.name"] == nil and resource.attributes["k8s.replicaset.name"]
!= nil
- set(resource.attributes["service.name"], resource.attributes["k8s.statefulset.name"])
where resource.attributes["service.name"] == nil and resource.attributes["k8s.statefulset.name"]
!= nil
- set(resource.attributes["service.name"], resource.attributes["k8s.daemonset.name"])
where resource.attributes["service.name"] == nil and resource.attributes["k8s.daemonset.name"]
!= nil
- set(resource.attributes["service.name"], resource.attributes["k8s.cronjob.name"])
where resource.attributes["service.name"] == nil and resource.attributes["k8s.cronjob.name"]
!= nil
- set(resource.attributes["service.name"], resource.attributes["k8s.job.name"])
where resource.attributes["service.name"] == nil and resource.attributes["k8s.job.name"]
!= nil
- set(resource.attributes["service.name"], resource.attributes["k8s.pod.name"])
where resource.attributes["service.name"] == nil and resource.attributes["k8s.pod.name"]
!= nil
- set(resource.attributes["service.name"], resource.attributes["k8s.container.name"])
where resource.attributes["service.name"] == nil and resource.attributes["k8s.container.name"]
!= nil
transform/profiles-ecs-service-name:
profile_statements:
- context: resource
statements:
- set(resource.attributes["service.name"], resource.attributes["aws.ecs.task.definition.family"])
where (resource.attributes["service.name"] == nil or resource.attributes["service.name"]
== "") and resource.attributes["aws.ecs.task.definition.family"] != nil and
resource.attributes["aws.ecs.task.definition.family"] != ""
- set(resource.attributes["service.name"], resource.attributes["aws.ecs.container.name"])
where (resource.attributes["service.name"] == nil or resource.attributes["service.name"]
== "") and resource.attributes["aws.ecs.container.name"] != nil and resource.attributes["aws.ecs.container.name"]
!= ""
transform/prometheus:
error_mode: ignore
metric_statements:
Expand Down Expand Up @@ -692,6 +768,20 @@ service:
- batch
receivers:
- spanmetrics/db_compact
profiles:
exporters:
- coralogix
processors:
- memory_limiter
- resourcedetection/region
- resourcedetection/env
- ecsattributes/container-logs
- k8sattributes/profiles
- resource/metadata
- transform/profiles
- transform/profiles-ecs-service-name
receivers:
- otlp
traces:
exporters:
- spanmetrics
Expand Down Expand Up @@ -759,48 +849,10 @@ service:

---
exporters:
coralogix:
application_name: otel
application_name_attributes:
- aws.ecs.cluster.name
- aws.ecs.task.definition.family
domain: coralogix.com
domain_settings:
keepalive:
enabled: true
permit_without_stream: false
time: 30s
timeout: 10s
logs:
headers:
X-Coralogix-Distribution: ecs-ec2-integration/0.0.36
metrics:
headers:
X-Coralogix-Distribution: ecs-ec2-integration/0.0.36
private_key: ${env:CORALOGIX_PRIVATE_KEY}
profiles:
headers:
X-Coralogix-Distribution: ecs-ec2-integration/0.0.36
x-coralogix-ingress: otlp/v1.10.0
sending_queue:
batch:
flush_timeout: 250ms
max_size: 2097152
min_size: 1048576
sizer: bytes
enabled: true
num_consumers: 20
queue_size: 209715200
sizer: bytes
subsystem_name: integration
subsystem_name_attributes:
- aws.ecs.container.name
- aws.ecs.docker.name
- docker.name
timeout: 30s
traces:
headers:
X-Coralogix-Distribution: ecs-ec2-integration/0.0.36
otlp:
endpoint: localhost:4317
tls:
insecure: true
extensions:
health_check:
endpoint: ${env:MY_POD_IP}:13133
Expand All @@ -818,11 +870,6 @@ extensions:
Authorization: Bearer ${env:CORALOGIX_PRIVATE_KEY}
polling_interval: 2m
processors:
ecsattributes/container-logs:
container_id:
sources:
- log.file.path
- container.id
memory_limiter:
check_interval: 5s
limit_percentage: 80
Expand All @@ -835,33 +882,6 @@ processors:
- action: upsert
key: cx.otel_integration.name
value: coralogix-integration-ecs-ec2
resourcedetection/env:
detectors:
- system
- env
override: false
system:
resource_attributes:
host.id:
enabled: true
timeout: 2s
resourcedetection/region:
detectors:
- ec2
override: true
timeout: 2s
transform/profiles-ecs-service-name:
profile_statements:
- context: resource
statements:
- set(resource.attributes["service.name"], resource.attributes["aws.ecs.task.definition.family"])
where (resource.attributes["service.name"] == nil or resource.attributes["service.name"]
== "") and resource.attributes["aws.ecs.task.definition.family"] != nil and
resource.attributes["aws.ecs.task.definition.family"] != ""
- set(resource.attributes["service.name"], resource.attributes["aws.ecs.container.name"])
where (resource.attributes["service.name"] == nil or resource.attributes["service.name"]
== "") and resource.attributes["aws.ecs.container.name"] != nil and resource.attributes["aws.ecs.container.name"]
!= ""
receivers:
profiling:
off_cpu_threshold: 0
Expand All @@ -878,13 +898,9 @@ service:
pipelines:
profiles:
exporters:
- coralogix
- otlp
processors:
- memory_limiter
- resourcedetection/region
- resourcedetection/env
- ecsattributes/container-logs
- transform/profiles-ecs-service-name
receivers:
- profiling
telemetry:
Expand Down
90 changes: 90 additions & 0 deletions otel-ecs-ec2/examples/otel-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,38 @@ processors:
traces:
span:
- span.attributes["db.system"] == nil
k8sattributes/profiles:
extract:
labels:
- from: pod
key: app.kubernetes.io/name
tag_name: k8s.label.name
- from: pod
key: app.kubernetes.io/instance
tag_name: k8s.label.instance
metadata:
- k8s.namespace.name
- k8s.replicaset.name
- k8s.statefulset.name
- k8s.daemonset.name
- k8s.deployment.name
- k8s.cronjob.name
- k8s.job.name
- k8s.pod.name
- k8s.node.name
- container.id
- k8s.container.name
- service.version
otel_annotations: true
filter:
node_from_env_var: K8S_NODE_NAME
Comment thread
douglascamata marked this conversation as resolved.
Outdated
passthrough: false
pod_association:
- sources:
- from: resource_attribute
name: container.id
- sources:
- from: connection
memory_limiter:
check_interval: 5s
limit_percentage: 80
Expand Down Expand Up @@ -307,6 +339,50 @@ processors:
- context: resource
statements:
- keep_keys(resource.attributes, [""])
transform/profiles:
profile_statements:
- set(resource.attributes["service.name"], resource.attributes["k8s.label.instance"])
where resource.attributes["service.name"] == nil and resource.attributes["k8s.label.instance"]
!= nil
- set(resource.attributes["service.name"], resource.attributes["k8s.label.name"])
where resource.attributes["service.name"] == nil and resource.attributes["k8s.label.name"]
!= nil
- set(resource.attributes["service.name"], resource.attributes["k8s.deployment.name"])
where resource.attributes["service.name"] == nil and resource.attributes["k8s.deployment.name"]
!= nil
- set(resource.attributes["service.name"], resource.attributes["k8s.replicaset.name"])
where resource.attributes["service.name"] == nil and resource.attributes["k8s.replicaset.name"]
!= nil
- set(resource.attributes["service.name"], resource.attributes["k8s.statefulset.name"])
where resource.attributes["service.name"] == nil and resource.attributes["k8s.statefulset.name"]
!= nil
- set(resource.attributes["service.name"], resource.attributes["k8s.daemonset.name"])
where resource.attributes["service.name"] == nil and resource.attributes["k8s.daemonset.name"]
!= nil
- set(resource.attributes["service.name"], resource.attributes["k8s.cronjob.name"])
where resource.attributes["service.name"] == nil and resource.attributes["k8s.cronjob.name"]
!= nil
- set(resource.attributes["service.name"], resource.attributes["k8s.job.name"])
where resource.attributes["service.name"] == nil and resource.attributes["k8s.job.name"]
!= nil
- set(resource.attributes["service.name"], resource.attributes["k8s.pod.name"])
where resource.attributes["service.name"] == nil and resource.attributes["k8s.pod.name"]
!= nil
- set(resource.attributes["service.name"], resource.attributes["k8s.container.name"])
where resource.attributes["service.name"] == nil and resource.attributes["k8s.container.name"]
!= nil
transform/profiles-ecs-service-name:
profile_statements:
- context: resource
statements:
- set(resource.attributes["service.name"], resource.attributes["aws.ecs.task.definition.family"])
where (resource.attributes["service.name"] == nil or resource.attributes["service.name"]
== "") and resource.attributes["aws.ecs.task.definition.family"] != nil and
resource.attributes["aws.ecs.task.definition.family"] != ""
- set(resource.attributes["service.name"], resource.attributes["aws.ecs.container.name"])
where (resource.attributes["service.name"] == nil or resource.attributes["service.name"]
== "") and resource.attributes["aws.ecs.container.name"] != nil and resource.attributes["aws.ecs.container.name"]
!= ""
transform/prometheus:
error_mode: ignore
metric_statements:
Expand Down Expand Up @@ -692,6 +768,20 @@ service:
- batch
receivers:
- spanmetrics/db_compact
profiles:
exporters:
- coralogix
processors:
- memory_limiter
- resourcedetection/region
- resourcedetection/env
- ecsattributes/container-logs
- k8sattributes/profiles
- resource/metadata
- transform/profiles
- transform/profiles-ecs-service-name
receivers:
- otlp
traces:
exporters:
- spanmetrics
Expand Down
19 changes: 9 additions & 10 deletions otel-ecs-ec2/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,8 @@ opentelemetry-agent:

ecsAttributesContainerLogs:
enabled: true
profilesServiceName:
enabled: true
ecsLogsCollection:
enabled: true
forceFlushPeriod: "0"
Expand Down Expand Up @@ -265,6 +267,8 @@ opentelemetry-agent:
# Adds the OTLP receiver to the traces, metrics, and logs pipelines.
otlpReceiver:
enabled: true
profilesCollection:
enabled: true
# Configures the collector to receive StatsD metrics.
# Adds the statsd receiver to the metrics pipeline.
statsdReceiver:
Expand Down Expand Up @@ -360,20 +364,15 @@ opentelemetry-ebpf-profiler:
otlpReceiver:
enabled: false

ecsAttributesContainerLogs:
enabled: true
profilesServiceName:
enabled: true

reduceResourceAttributes:
enabled: false

coralogixExporter:
enabled: true
privateKey: ${env:CORALOGIX_PRIVATE_KEY}

resourceDetection:
otlpExporter:
enabled: true
endpoint: localhost:4317
Comment thread
douglascamata marked this conversation as resolved.
Outdated
Comment thread
douglascamata marked this conversation as resolved.
Outdated
pipelines: ["profiles"]
tls:
insecure: true

config:
exporters:
Expand Down
Loading