Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
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
50 changes: 43 additions & 7 deletions .github/workflows/stackpacks-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,21 @@ concurrency:

jobs:

test-resource-identity:
name: Test OpenTelemetry resource identity
runs-on: ubuntu-24.04
steps:
- name: Check out repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false

- name: Evaluate mapping regression cases
run: |
python3 -m venv /tmp/otel-mapping-tests
/tmp/otel-mapping-tests/bin/pip install -r tests/open-telemetry/requirements.txt
/tmp/otel-mapping-tests/bin/python -m unittest discover -s tests/open-telemetry -v

discover-stackpacks:
name: Discover stackpacks
runs-on: ubuntu-24.04
Expand Down Expand Up @@ -80,20 +95,41 @@ jobs:
STACKPACK: ${{ matrix.stackpack }}
# Pinned snapshot of stackstate-server providing /opt/docker/bin/stack-pack-validator.
# Bumped manually when validating a newer stackstate-server release.
VALIDATOR_IMAGE: quay.io/stackstate/stackstate-server:b7c3604-2.5
VALIDATOR_IMAGE: quay.io/stackstate/stackstate-server:7.0.0-snapshot.20260919173254-master-5674676-2.5@sha256:237a6ffc5510c11b6e68aa0228365cac511b38a7d708df991e51bffa1f271b38
run: |
docker run --rm \
-v "${PWD}:/workspace" \
-w /workspace \
docker run --rm --network none \
--entrypoint /opt/docker/bin/stack-pack-validator \
-v "${PWD}:/workspace:ro" \
"${VALIDATOR_IMAGE}" \
/opt/docker/bin/stack-pack-validator -directory "/workspace/stackpacks/${STACKPACK}"
-directory "/workspace/stackpacks/${STACKPACK}"

- name: Verify invalid CEL is rejected
if: matrix.stackpack == 'open-telemetry'
env:
VALIDATOR_IMAGE: quay.io/stackstate/stackstate-server:7.0.0-snapshot.20260919173254-master-5674676-2.5@sha256:237a6ffc5510c11b6e68aa0228365cac511b38a7d708df991e51bffa1f271b38
run: |
probe=$(mktemp -d)
trap 'rm -rf "${probe}"' EXIT
cp -r stackpacks/open-telemetry "${probe}/stackpack"
sed -i 's/name: "vars.service"/name: "undeclared_otel_variable"/' \
"${probe}/stackpack/settings/component-mappings/services.sty"
if docker run --rm --network none \
--entrypoint /opt/docker/bin/stack-pack-validator \
-v "${probe}/stackpack:/stackpack:ro" \
"${VALIDATOR_IMAGE}" -directory /stackpack > "${probe}/validation.log" 2>&1; then
cat "${probe}/validation.log"
echo 'Validator accepted an invalid mapping expression' >&2
exit 1
fi
grep -F 'undeclared_otel_variable' "${probe}/validation.log"

package:
name: package (${{ matrix.stackpack }})
needs: [discover-stackpacks, validate]
needs: [discover-stackpacks, validate, test-resource-identity]
if: |
always() &&
needs.validate.result == 'success'
needs.validate.result == 'success' &&
needs.test-resource-identity.result == 'success'
runs-on: ubuntu-24.04
strategy:
fail-fast: false
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,24 @@
nodes:
- _type: "OtelComponentMapping"
name: "Kubernetes Namespace"
description: "Represents a logical service namespace in Kubernetes"
name: "OTel Service Namespace"
description: "Represents a logical service namespace"
identifier: "urn:stackpack:open-telemetry:otel-component-mapping:namespace"
input:
signal:
- "TRACES"
- "METRICS"
resource:
action: "'CREATE'"
condition: "'service.namespace' in resource.attributes"
condition: >-
('service.name' in resource.attributes && resource.attributes['service.name'] != '') ||
('service.namespace' in resource.attributes && resource.attributes['service.namespace'] != '')
vars:
- name: "namespace"
value: "resource.attributes['service.namespace']"
- name: "clusterName"
value: "resource.attributes['k8s.cluster.name']"
value: >-
'service.namespace' in resource.attributes &&
resource.attributes['service.namespace'] != '' ?
resource.attributes['service.namespace'] :
'default'
output:
identifier: "'urn:opentelemetry:namespace/' + vars.namespace"
name: "vars.namespace"
Expand All @@ -23,16 +27,26 @@ nodes:
tags:
- source: "'open-telemetry'"
target: "stackpack"
- source: "vars.clusterName"
target: "cluster-name"
optional:
tags:
- source: "resource.attributes['deployment.environment']"
target: "deployment-environment"
- source: "vars.clusterName + '/' + resource.attributes['k8s.namespace.name']"
target: "k8s-scope"
- source: "resource.attributes['k8s.namespace.name']"
target: "namespace"
- source: >-
'k8s.cluster.name' in resource.attributes && resource.attributes['k8s.cluster.name'] != '' ?
{'cluster-name': resource.attributes['k8s.cluster.name']} : {}
pattern: "(.*)"
target: "${1}"
- source: >-
'k8s.cluster.name' in resource.attributes && resource.attributes['k8s.cluster.name'] != '' &&
'k8s.namespace.name' in resource.attributes && resource.attributes['k8s.namespace.name'] != '' ?
{'k8s-scope': resource.attributes['k8s.cluster.name'] + '/' + resource.attributes['k8s.namespace.name']} : {}
pattern: "(.*)"
target: "${1}"
- source: >-
'k8s.namespace.name' in resource.attributes && resource.attributes['k8s.namespace.name'] != '' ?
{'namespace': resource.attributes['k8s.namespace.name']} : {}
pattern: "(.*)"
target: "${1}"
expireAfter: 900000
rank:
specificity: 100
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,16 @@ nodes:
- "METRICS"
resource:
action: "'CREATE'"
condition: "'service.instance.id' in resource.attributes"
condition: >-
'service.name' in resource.attributes && resource.attributes['service.name'] != '' &&
'service.instance.id' in resource.attributes && resource.attributes['service.instance.id'] != ''
vars:
- name: "namespace"
value: "resource.attributes['service.namespace']"
value: >-
'service.namespace' in resource.attributes &&
resource.attributes['service.namespace'] != '' ?
resource.attributes['service.namespace'] :
'default'
- name: "service"
value: "resource.attributes['service.name']"
- name: "version"
Expand All @@ -24,8 +30,6 @@ nodes:
value: "resource.attributes['service.instance.id']"
- name: "instanceName"
value: "resource.attributes['service.name'] + ' - ' + resource.attributes['service.instance.id']"
- name: "clusterName"
value: "resource.attributes['k8s.cluster.name']"
output:
identifier: >-
'urn:opentelemetry:namespace/' + vars.namespace + ':service/' + vars.service + ':serviceInstance/' + vars.instanceId
Expand All @@ -40,19 +44,29 @@ nodes:
target: "service.name"
- source: "vars.namespace"
target: "service.namespace"
- source: "vars.clusterName"
target: "cluster-name"
- source: "resource.attributes"
- source: "omit(resource.attributes, ['service.name', 'service.namespace'])"
pattern: "(.*)"
target: "${1}"
optional:
tags:
- source: "resource.attributes['deployment.environment']"
target: "deployment-environment"
- source: "vars.clusterName + '/' + resource.attributes['k8s.namespace.name']"
target: "k8s-scope"
- source: "resource.attributes['k8s.namespace.name']"
target: "namespace"
- source: >-
'k8s.cluster.name' in resource.attributes && resource.attributes['k8s.cluster.name'] != '' ?
{'cluster-name': resource.attributes['k8s.cluster.name']} : {}
pattern: "(.*)"
target: "${1}"
- source: >-
'k8s.cluster.name' in resource.attributes && resource.attributes['k8s.cluster.name'] != '' &&
'k8s.namespace.name' in resource.attributes && resource.attributes['k8s.namespace.name'] != '' ?
{'k8s-scope': resource.attributes['k8s.cluster.name'] + '/' + resource.attributes['k8s.namespace.name']} : {}
pattern: "(.*)"
target: "${1}"
- source: >-
'k8s.namespace.name' in resource.attributes && resource.attributes['k8s.namespace.name'] != '' ?
{'namespace': resource.attributes['k8s.namespace.name']} : {}
pattern: "(.*)"
target: "${1}"
expireAfter: 900000
rank:
specificity: 210
27 changes: 18 additions & 9 deletions stackpacks/open-telemetry/settings/component-mappings/services.sty
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,11 @@ nodes:
- "METRICS"
resource:
action: "'CREATE'"
condition: "'service.name' in resource.attributes"
condition: "'service.name' in resource.attributes && resource.attributes['service.name'] != ''"
vars:
- name: "namespace"
value: >-
'service.namespace' in resource.attributes &&
resource.attributes['service.namespace'] != '' ?
resource.attributes['service.namespace'] :
'default'
Expand All @@ -23,8 +24,6 @@ nodes:
'service.version' in resource.attributes ?
resource.attributes['service.version'] :
'undefined'
- name: "clusterName"
value: "resource.attributes['k8s.cluster.name']"
output:
identifier: >-
'urn:opentelemetry:namespace/' + vars.namespace + ':service/' + vars.service
Expand All @@ -41,19 +40,29 @@ nodes:
target: "service.namespace"
- source: "vars.version"
target: "service.version"
- source: "vars.clusterName"
target: "cluster-name"
- source: "resource.attributes"
pattern: "telemetry.sdk\\.(.*)"
target: "telemetry.sdk.${1}"
optional:
tags:
- source: "resource.attributes['deployment.environment']"
target: "deployment-environment"
- source: "vars.clusterName + '/' + resource.attributes['k8s.namespace.name']"
target: "k8s-scope"
- source: "resource.attributes['k8s.namespace.name']"
target: "namespace"
- source: >-
'k8s.cluster.name' in resource.attributes && resource.attributes['k8s.cluster.name'] != '' ?
{'cluster-name': resource.attributes['k8s.cluster.name']} : {}
pattern: "(.*)"
target: "${1}"
- source: >-
'k8s.cluster.name' in resource.attributes && resource.attributes['k8s.cluster.name'] != '' &&
'k8s.namespace.name' in resource.attributes && resource.attributes['k8s.namespace.name'] != '' ?
{'k8s-scope': resource.attributes['k8s.cluster.name'] + '/' + resource.attributes['k8s.namespace.name']} : {}
pattern: "(.*)"
target: "${1}"
- source: >-
'k8s.namespace.name' in resource.attributes && resource.attributes['k8s.namespace.name'] != '' ?
{'namespace': resource.attributes['k8s.namespace.name']} : {}
pattern: "(.*)"
target: "${1}"
expireAfter: 900000
rank:
specificity: 200
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,10 @@ nodes:
- "METRICS"
resource:
action: "'CREATE'"
condition: "'aws.ecs.task.id' in resource.attributes"
condition: >-
'aws.ecs.task.id' in resource.attributes && resource.attributes['aws.ecs.task.id'] != '' &&
'service.name' in resource.attributes && resource.attributes['service.name'] != '' &&
'service.instance.id' in resource.attributes && resource.attributes['service.instance.id'] != ''
vars:
- name: "awsEcsTaskId"
value: "resource.attributes['aws.ecs.task.id']"
Expand All @@ -22,11 +25,7 @@ nodes:
- name: "service"
value: "resource.attributes['service.name']"
- name: "instanceId"
value: >-
'service.instance.id' in resource.attributes &&
resource.attributes['service.instance.id'] != '' ?
resource.attributes['service.instance.id'] :
resource.attributes['service.name']
value: "resource.attributes['service.instance.id']"
output:
sourceId: "'urn:opentelemetry:task/' + vars.awsEcsTaskId"
targetId: >-
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,10 @@ nodes:
- "METRICS"
resource:
action: "'CREATE'"
condition: "'faas.id' in resource.attributes"
condition: >-
'faas.id' in resource.attributes && resource.attributes['faas.id'] != '' &&
'service.name' in resource.attributes && resource.attributes['service.name'] != '' &&
'service.instance.id' in resource.attributes && resource.attributes['service.instance.id'] != ''
vars:
- name: "faasId"
value: "resource.attributes['faas.id']"
Expand All @@ -22,11 +25,7 @@ nodes:
- name: "service"
value: "resource.attributes['service.name']"
- name: "instanceId"
value: >-
'service.instance.id' in resource.attributes &&
resource.attributes['service.instance.id'] != '' ?
resource.attributes['service.instance.id'] :
resource.attributes['service.name']
value: "resource.attributes['service.instance.id']"
output:
sourceId: "'urn:opentelemetry:function/' + vars.faasId"
targetId: >-
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,10 @@ nodes:
- "METRICS"
resource:
action: "'CREATE'"
condition: "'host.id' in resource.attributes"
condition: >-
'host.id' in resource.attributes && resource.attributes['host.id'] != '' &&
'service.name' in resource.attributes && resource.attributes['service.name'] != '' &&
'service.instance.id' in resource.attributes && resource.attributes['service.instance.id'] != ''
vars:
- name: "hostId"
value: "resource.attributes['host.id']"
Expand All @@ -22,11 +25,7 @@ nodes:
- name: "service"
value: "resource.attributes['service.name']"
- name: "instanceId"
value: >-
'service.instance.id' in resource.attributes &&
resource.attributes['service.instance.id'] != '' ?
resource.attributes['service.instance.id'] :
resource.attributes['service.name']
value: "resource.attributes['service.instance.id']"
output:
sourceId: "'urn:opentelemetry:host/' + vars.hostId"
targetId: >-
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,11 @@ nodes:
resource:
action: "'CREATE'"
condition: >-
'k8s.cluster.name' in resource.attributes &&
'k8s.namespace.name' in resource.attributes &&
'k8s.pod.name' in resource.attributes
'k8s.cluster.name' in resource.attributes && resource.attributes['k8s.cluster.name'] != '' &&
'k8s.namespace.name' in resource.attributes && resource.attributes['k8s.namespace.name'] != '' &&
'k8s.pod.name' in resource.attributes && resource.attributes['k8s.pod.name'] != '' &&
'service.name' in resource.attributes && resource.attributes['service.name'] != '' &&
'service.instance.id' in resource.attributes && resource.attributes['service.instance.id'] != ''
vars:
- name: "clusterName"
value: "resource.attributes['k8s.cluster.name']"
Expand All @@ -27,15 +29,9 @@ nodes:
resource.attributes['service.namespace'] :
'default'
- name: "service"
value: >-
'service.name' in resource.attributes ?
resource.attributes['service.name'] :
''
value: "resource.attributes['service.name']"
- name: "instanceId"
value: >-
'service.instance.id' in resource.attributes ?
resource.attributes['service.instance.id'] :
resource.attributes['service.name']
value: "resource.attributes['service.instance.id']"
output:
sourceId: >-
'urn:opentelemetry:kubernetes:/' + vars.clusterName + ':' + vars.namespaceName + ':pod/' + vars.podName
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@ nodes:
- "METRICS"
resource:
action: "'CREATE'"
condition: "'service.name' in resource.attributes"
condition: >-
'service.name' in resource.attributes && resource.attributes['service.name'] != '' &&
'service.instance.id' in resource.attributes && resource.attributes['service.instance.id'] != ''
vars:
- name: "namespace"
value: >-
Expand All @@ -20,10 +22,7 @@ nodes:
- name: "service"
value: "resource.attributes['service.name']"
- name: "instanceId"
value: >-
'service.instance.id' in resource.attributes ?
resource.attributes['service.instance.id'] :
resource.attributes['service.name']
value: "resource.attributes['service.instance.id']"
output:
sourceId: >-
'urn:opentelemetry:namespace/' + vars.namespace + ':service/' + vars.service
Expand Down
2 changes: 1 addition & 1 deletion stackpacks/open-telemetry/stackpack.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name: "open-telemetry"
version: "0.1.5"
version: "0.1.6"
schemaVersion: "2.0"
displayName: "Open Telemetry"
categories: [ "Open Telemetry" ]
Expand Down
2 changes: 2 additions & 0 deletions tests/open-telemetry/requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
cel-python==0.4.0
PyYAML==6.0.3
Loading