Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor integration tests and add metrics coverage #2432

Merged
merged 2 commits into from
Dec 17, 2024
Merged
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
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ jobs:
if: hashFiles('Cargo.lock') == ''
run: cargo generate-lockfile
- name: cargo llvm-cov
run: cargo llvm-cov --locked --all-features --workspace --lcov --output-path lcov.info
run: cargo llvm-cov --locked --all-features --workspace --lcov --lib --output-path lcov.info
- name: Upload to codecov.io
uses: codecov/codecov-action@v4
env:
Expand Down
2 changes: 2 additions & 0 deletions opentelemetry-otlp/tests/integration_test/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
lcov.info
actual/*.json
25 changes: 15 additions & 10 deletions opentelemetry-otlp/tests/integration_test/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,27 +4,32 @@ version = "0.1.0"
edition = "2021"
publish = false


[dependencies]
opentelemetry = { path = "../../../opentelemetry", features = ["metrics", "logs"] }
opentelemetry_sdk = { path = "../../../opentelemetry-sdk", features = ["rt-tokio", "logs", "testing"] }
opentelemetry-proto = { path = "../../../opentelemetry-proto", features = ["gen-tonic-messages", "trace", "logs", "with-serde"] }
opentelemetry = { path = "../../../opentelemetry", features = [] }
scottgerring marked this conversation as resolved.
Show resolved Hide resolved
opentelemetry_sdk = { path = "../../../opentelemetry-sdk", features = ["rt-tokio", "testing"] }
opentelemetry-proto = { path = "../../../opentelemetry-proto", features = ["gen-tonic-messages", "trace", "logs", "metrics", "with-serde"] }
log = { workspace = true }
tokio = { version = "1.0", features = ["full"] }
serde_json = "1"
testcontainers = "0.15.0"
testcontainers = { version = "0.23.1", features = ["http_wait"]}
once_cell.workspace = true
anyhow = "1.0.94"
ctor = "0.2.9"
tracing-subscriber = "0.3.19"
tracing = "0.1.41"

[target.'cfg(unix)'.dependencies]
opentelemetry-appender-log = { path = "../../../opentelemetry-appender-log", default-features = false}
opentelemetry-otlp = { path = "../../../opentelemetry-otlp", default-features = false }
opentelemetry-semantic-conventions = { path = "../../../opentelemetry-semantic-conventions" }

[features]
hyper-client = ["opentelemetry-otlp/hyper-client", "opentelemetry-otlp/http-proto", "opentelemetry-otlp/trace", "opentelemetry-otlp/logs", "opentelemetry-otlp/metrics"]
reqwest-client = ["opentelemetry-otlp/reqwest-client", "opentelemetry-otlp/http-proto", "opentelemetry-otlp/trace","opentelemetry-otlp/logs", "opentelemetry-otlp/metrics"]
reqwest-blocking-client = ["opentelemetry-otlp/reqwest-blocking-client", "opentelemetry-otlp/http-proto", "opentelemetry-otlp/trace","opentelemetry-otlp/logs", "opentelemetry-otlp/metrics"]
tonic-client = ["opentelemetry-otlp/grpc-tonic", "opentelemetry-otlp/trace", "opentelemetry-otlp/logs", "opentelemetry-otlp/metrics"]
hyper-client = ["opentelemetry-otlp/hyper-client", "opentelemetry-otlp/http-proto", "opentelemetry-otlp/trace", "opentelemetry-otlp/logs", "opentelemetry-otlp/metrics", "internal-logs"]
reqwest-client = ["opentelemetry-otlp/reqwest-client", "opentelemetry-otlp/http-proto", "opentelemetry-otlp/trace","opentelemetry-otlp/logs", "opentelemetry-otlp/metrics", "internal-logs"]
reqwest-blocking-client = ["opentelemetry-otlp/reqwest-blocking-client", "opentelemetry-otlp/http-proto", "opentelemetry-otlp/trace","opentelemetry-otlp/logs", "opentelemetry-otlp/metrics", "internal-logs"]
tonic-client = ["opentelemetry-otlp/grpc-tonic", "opentelemetry-otlp/trace", "opentelemetry-otlp/logs", "opentelemetry-otlp/metrics", "internal-logs"]
internal-logs = []

# Keep tonic as the default client
default = ["tonic-client"]
default = ["tonic-client", "internal-logs"]

10 changes: 10 additions & 0 deletions opentelemetry-otlp/tests/integration_test/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# OTLP - Integration Tests
scottgerring marked this conversation as resolved.
Show resolved Hide resolved
This directory contains integration tests for `opentelemetry-otlp`. It uses
[testcontainers](https://testcontainers.com/) to start an instance of the OTEL collector using [otel-collector-config.yaml](otel-collector-config.yaml), which then uses a file exporter per signal to write the output it receives back to the host machine.

The tests connect directly to the collector on `localhost:4317` and `localhost:4318`, push data through, and then check that what they expect
has popped back out into the files output by the collector.

For this to work, you need a couple of things:
* Docker, for the test container
* TCP/4317 and TCP/4318 free on your local machine. If you are running another collector, you'll need to stop it for the tests to run
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Output from the otel-collector goes here.
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
{
"resourceMetrics": [
{
"resource": {
"attributes": [
{
"key": "service.name",
"value": {
"stringValue": "metrics-integration-test"
}
}
]
},
"scopeMetrics": [
{
"scope": {
"name": "meter"
},
"metrics": [
{
"name": "counter_u64",
"sum": {
"dataPoints": [
{
"attributes": [
{
"key": "mykey1",
"value": {
"stringValue": "mydifferentval"
}
},
{
"key": "mykey2",
"value": {
"stringValue": "myvalue2"
}
}
],
"startTimeUnixNano": "1734094309366798000",
"timeUnixNano": "1734094317871514000",
"asInt": "15"
}
],
"aggregationTemporality": 2,
"isMonotonic": true
}
},
{
"name": "example_histogram",
"histogram": {
"dataPoints": [
{
"attributes": [
{
"key": "mykey3",
"value": {
"stringValue": "myvalue4"
}
}
],
"startTimeUnixNano": "1734094309366875000",
"timeUnixNano": "1734094317871537000",
"count": "1",
"sum": 42,
"bucketCounts": [
"0",
"0",
"0",
"0",
"1",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0"
],
"explicitBounds": [
0,
5,
10,
25,
50,
75,
100,
250,
500,
750,
1000,
2500,
5000,
7500,
10000
],
"min": 42,
"max": 42
}
],
"aggregationTemporality": 2
}
},
{
"name": "example_up_down_counter",
"sum": {
"dataPoints": [
{
"attributes": [
{
"key": "mykey5",
"value": {
"stringValue": "myvalue5"
}
}
],
"startTimeUnixNano": "1734094309366941000",
"timeUnixNano": "1734094317871548000",
"asInt": "-1"
}
],
"aggregationTemporality": 2
}
}
]
}
]
}
]
}
138 changes: 76 additions & 62 deletions opentelemetry-otlp/tests/integration_test/expected/metrics.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,114 +6,128 @@
{
"key": "service.name",
"value": {
"stringValue": "my.service"
"stringValue": "metrics-integration-test"
}
}
]
},
"scopeMetrics": [
{
"scope": {
"name": "my.library",
"version": "1.0.0",
"attributes": [
{
"key": "my.scope.attribute",
"value": {
"stringValue": "some scope attribute"
}
}
]
"name": "meter"
},
"metrics": [
{
"name": "my.counter",
"unit": "1",
"description": "I am a Counter",
"metadata": [],
"name": "counter_u64",
"sum": {
"aggregationTemporality": 1,
"isMonotonic": true,
"dataPoints": [
{
"asDouble": 5,
"startTimeUnixNano": "1544712660300000000",
"timeUnixNano": "1544712660300000000",
"attributes": [
{
"key": "my.counter.attr",
"key": "mykey1",
"value": {
"stringValue": "some value"
"stringValue": "myvalue1"
}
},
{
"key": "mykey2",
"value": {
"stringValue": "myvalue2"
}
}
],
"exemplars": [],
"flags": 0
"startTimeUnixNano": "1734094309366798000",
"timeUnixNano": "1734094317871514000",
"asInt": "10"
}
]
],
"aggregationTemporality": 2,
"isMonotonic": true
}
},
{
"name": "my.gauge",
"unit": "1",
"description": "I am a Gauge",
"metadata": [],
"gauge": {
"name": "example_histogram",
"histogram": {
"dataPoints": [
{
"asDouble": 10,
"startTimeUnixNano": "1544712660300000000",
"timeUnixNano": "1544712660300000000",
"attributes": [
{
"key": "my.gauge.attr",
"key": "mykey3",
"value": {
"stringValue": "some value"
"stringValue": "myvalue4"
}
}
],
"exemplars": [],
"flags": 0
"startTimeUnixNano": "1734094309366875000",
"timeUnixNano": "1734094317871537000",
"count": "1",
"sum": 42,
"bucketCounts": [
"0",
"0",
"0",
"0",
"1",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0"
],
"explicitBounds": [
0,
5,
10,
25,
50,
75,
100,
250,
500,
750,
1000,
2500,
5000,
7500,
10000
],
"min": 42,
"max": 42
}
]
],
"aggregationTemporality": 2
}
},
{
"name": "my.histogram",
"unit": "1",
"description": "I am a Histogram",
"metadata": [],
"histogram": {
"aggregationTemporality": 1,
"name": "example_up_down_counter",
"sum": {
"dataPoints": [
{
"startTimeUnixNano": "1544712660300000000",
"timeUnixNano": "1544712660300000000",
"count": 2,
"sum": 2,
"bucketCounts": [1,1],
"explicitBounds": [1],
"min": 0,
"max": 2,
"attributes": [
{
"key": "my.histogram.attr",
"key": "mykey5",
"value": {
"stringValue": "some value"
"stringValue": "myvalue5"
}
}
],
"exemplars": [],
"flags": 0
"startTimeUnixNano": "1734094309366941000",
"timeUnixNano": "1734094317871548000",
"asInt": "-1"
}
]
],
"aggregationTemporality": 2
}
}
],
"schemaUrl": "whatever"
]
}
],
"schemaUrl": "whatever"
]
}
]
}
}
Loading
Loading