Skip to content

Commit e5c657d

Browse files
authored
Add OTel Logging sample (#1055)
* Add OTel Logging sample * Add missing license headers * Udpate comments * Fix lint issues * Remove unnecessary comments
1 parent 214376d commit e5c657d

File tree

7 files changed

+385
-0
lines changed

7 files changed

+385
-0
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,6 @@ coverage.*
1717
/example/trace/otlpgrpc/otlpgrpc
1818
/example/metric/exponential_histogram/exponential_histogram
1919
/example/trace/otlphttp/otlphttp
20+
/example/log/slogbridge/otel_logs
2021
go.work
2122
go.work.sum

example/log/slogbridge/README.md

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
# Google Cloud Logging exporter example with OpenTelemetry Collector
2+
3+
This example shows how to use [`go.opentelemetry.io/otel`](https://pkg.go.dev/go.opentelemetry.io/otel/) to instrument a simple Go application with OpenTelemetry logs and export the logs to [Google Cloud Logging](https://cloud.google.com/logging/) using the [Google-Built OpenTelemetry Collector](https://cloud.google.com/stackdriver/docs/instrumentation/google-built-otel).
4+
5+
## Setup environment
6+
7+
Before sending metrics to Google Cloud Logging, confirm the Cloud Logging API is enabled for the project you will use to access the API as described in [this document](https://cloud.google.com/logging/docs/api/enable-api).
8+
9+
You can find your current project ID using the command:
10+
11+
```
12+
$ gcloud config get-value project
13+
Your active configuration is: [example]
14+
foo-project-214354
15+
```
16+
17+
In this case, the project ID is `foo-project-214354`.
18+
19+
Next, set this project ID to the environment variable `GOOGLE_CLOUD_PROJECT` using the following command:
20+
21+
```
22+
export GOOGLE_CLOUD_PROJECT=$(gcloud config get-value project)
23+
export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318
24+
```
25+
26+
## Build and run the application
27+
28+
> [!IMPORTANT]
29+
> For running this example, you need to have a locally running OpenTelemetry Collector, configured using the provided [sample config](./collector/config.yaml).
30+
> Instructions for running OpenTelemetry Collector on your system can be found [here](https://opentelemetry.io/docs/collector/getting-started/#local),
31+
> but a convenience script has been provided that can run the collector using `Docker`.
32+
33+
Once you ensure the API is enabled, then build the example application and run the executable.
34+
Change the current directory to the example using `cd examples/log/slogbridge`, and then run the example using following commands:
35+
36+
```
37+
// From the exmaples/log/slogbridge directory
38+
// Start the collector with the provided config
39+
$ ./collector/run_collector.sh ./collector/config.yaml
40+
// From a separate terminal window - build & run the application
41+
$ go build -o otel_logs
42+
$ ./otel_logs
43+
...
44+
```
45+
46+
The application emits logs to the endpoint `http://localhost:4318` and the collector is configured to listen at this port.
47+
48+
> [!TIP]
49+
> The endpoint to which logs are emitted can be changed by using the environment variable `OTEL_EXPORTER_OTLP_ENDPOINT`.
50+
> If you switch the endpoint, remember to configure the collector to listen to the newly configured endpoint.
51+
52+
## Visualize exported logs
53+
54+
Once the application has run successfully, it should have sent structured logs with OpenTelemetry attributes to Google Cloud Logging.\
55+
You should be able to search for these logs using [Logs Explorer](https://cloud.google.com/logging/docs/view/logs-explorer-interface).
56+
In the Logs Explorer, you can search logs by various attributes, for example, service name:
57+
```
58+
// Put in the following query in the logs explorer to show all logs from the current sample
59+
labels."service.name"="example-application"
60+
```
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
receivers:
2+
otlp:
3+
protocols:
4+
http:
5+
endpoint: "0.0.0.0:4318"
6+
7+
processors:
8+
memory_limiter:
9+
check_interval: 1s
10+
limit_percentage: 65
11+
spike_limit_percentage: 20
12+
13+
batch:
14+
15+
resourcedetection:
16+
detectors: [gcp]
17+
timeout: 10s
18+
19+
20+
exporters:
21+
googlecloud:
22+
project: ${GOOGLE_CLOUD_PROJECT}
23+
log:
24+
default_log_name: opentelemetry-collector
25+
26+
extensions:
27+
health_check:
28+
pprof:
29+
zpages:
30+
31+
service:
32+
extensions: [health_check, pprof, zpages]
33+
pipelines:
34+
logs:
35+
receivers: [otlp]
36+
processors: [resourcedetection, memory_limiter, batch]
37+
exporters: [googlecloud]
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
#!/bin/bash
2+
#
3+
# Copyright 2025 Google LLC
4+
#
5+
# Licensed under the Apache License, Version 2.0 (the "License");
6+
# you may not use this file except in compliance with the License.
7+
# You may obtain a copy of the License at
8+
#
9+
# http://www.apache.org/licenses/LICENSE-2.0
10+
#
11+
# Unless required by applicable law or agreed to in writing, software
12+
# distributed under the License is distributed on an "AS IS" BASIS,
13+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
# See the License for the specific language governing permissions and
15+
# limitations under the License.
16+
#
17+
# A script to run the Google Cloud OTel Collector Docker image locally,
18+
# mounting a local YAML configuration file.
19+
#
20+
# Usage: ./run_collector.sh <path_to_your_config.yaml>
21+
#
22+
23+
# --- Configuration ---
24+
# The full name of the Docker image to run.
25+
DOCKER_IMAGE="us-docker.pkg.dev/cloud-ops-agents-artifacts/google-cloud-opentelemetry-collector/otelcol-google:0.128.0"
26+
# The path inside the container where the config file will be mounted.
27+
CONFIG_FILE_CONTAINER="/tmp/otelcol-custom/config.yaml"
28+
29+
# --- Script ---
30+
# Exit immediately if a command fails.
31+
set -e
32+
33+
# Store the path to the host's config file from the first script argument.
34+
CONFIG_FILE_HOST="$1"
35+
36+
# 1. Validate that a config file was provided.
37+
if [ -z "${CONFIG_FILE_HOST}" ]; then
38+
echo "❌ Error: No config file supplied."
39+
echo "Usage: $0 <path_to_your_config.yaml>"
40+
exit 1
41+
fi
42+
43+
# 2. Validate that the provided file exists.
44+
if [ ! -f "${CONFIG_FILE_HOST}" ]; then
45+
echo "❌ Error: File not found at '${CONFIG_FILE_HOST}'"
46+
exit 1
47+
fi
48+
49+
# 3. Validate if the required environment variables were set.
50+
if [[ -z "${GOOGLE_CLOUD_PROJECT}" ]]; then
51+
echo "❌ Error: GOOGLE_CLOUD_PROJECT environment variable not set"
52+
exit 1
53+
fi
54+
55+
if [[ -z "${GOOGLE_APPLICATION_CREDENTIALS}" ]]; then
56+
echo "❌ Error: GOOGLE_APPLICATION_CREDENTIALS environment variable not set"
57+
exit 1
58+
fi
59+
60+
echo "🚀 Starting OpenTelemetry Collector..."
61+
echo " Environment variables verified"
62+
echo " Image: ${DOCKER_IMAGE}"
63+
echo " Config File (Host): $(readlink -f "${CONFIG_FILE_HOST}")"
64+
echo " Application Creds (Host): $(readlink -f "${GOOGLE_APPLICATION_CREDENTIALS}")"
65+
echo " Google Project ID (Host): ${GOOGLE_CLOUD_PROJECT}"
66+
echo " Press Ctrl+C to stop the collector."
67+
68+
# 3. Run the Docker container.
69+
# --rm : Automatically remove the container when it exits.
70+
# -it : Run in interactive mode to see logs and allow Ctrl+C to stop it.
71+
# -v : Mount the local config file into the container.
72+
# -e : Set the required environment variables in the container.
73+
# --config : Pass the path of the mounted config file to the collector's command.
74+
docker run --rm -it \
75+
--user "$(id -u)":"$(id -g)" \
76+
-e "GOOGLE_CLOUD_PROJECT=${GOOGLE_CLOUD_PROJECT}" \
77+
-e "GOOGLE_APPLICATION_CREDENTIALS=${GOOGLE_APPLICATION_CREDENTIALS}" \
78+
-v "$(readlink -f "${CONFIG_FILE_HOST}")":"${CONFIG_FILE_CONTAINER}":ro \
79+
-v "${GOOGLE_APPLICATION_CREDENTIALS}:${GOOGLE_APPLICATION_CREDENTIALS}:ro" \
80+
-v /var/run/docker.sock:/var/run/docker.sock \
81+
-p 4318:4318 \
82+
"${DOCKER_IMAGE}" \
83+
--config "${CONFIG_FILE_CONTAINER}"

example/log/slogbridge/example.go

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
// Copyright 2025 Google LLC
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package main
16+
17+
import (
18+
"context"
19+
"errors"
20+
"log"
21+
"log/slog"
22+
"runtime"
23+
24+
"go.opentelemetry.io/contrib/bridges/otelslog"
25+
"go.opentelemetry.io/contrib/detectors/gcp"
26+
"go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp"
27+
"go.opentelemetry.io/otel/exporters/stdout/stdoutlog"
28+
"go.opentelemetry.io/otel/log/global"
29+
otelsdklog "go.opentelemetry.io/otel/sdk/log"
30+
"go.opentelemetry.io/otel/sdk/resource"
31+
semconv "go.opentelemetry.io/otel/semconv/v1.24.0"
32+
)
33+
34+
const (
35+
name = "github.com/GoogleCloudPlatform/opentelemetry-operations-go/example/log/slogbridge/main"
36+
)
37+
38+
func main() {
39+
ctx := context.Background()
40+
41+
// Create OpenTelemetry Log exporter(s)
42+
// OTLP log exporter to export structuted logs to an OTLP endpoint
43+
otlpLogExporter, err := otlploghttp.New(ctx)
44+
if err != nil {
45+
log.Fatalf("failed to initialize OTLP log exporter")
46+
}
47+
// stdout log exporter to export structured logs to standard out
48+
stdoutLogExporter, err := stdoutlog.New()
49+
if err != nil {
50+
log.Fatalf("failed to initialize stdout log exporter")
51+
}
52+
53+
// Add resource attributes using GCP resource detector
54+
res, err := resource.New(
55+
ctx,
56+
// Use the GCP resource detector to detect information about the GCP platform
57+
resource.WithDetectors(gcp.NewDetector()),
58+
// Keep the default detectors
59+
resource.WithTelemetrySDK(),
60+
// Add attributes from environment variables
61+
resource.WithFromEnv(),
62+
// Add your own custom attributes to identify your application
63+
resource.WithAttributes(
64+
semconv.ServiceNameKey.String("example-application"),
65+
),
66+
)
67+
if errors.Is(err, resource.ErrPartialResource) || errors.Is(err, resource.ErrSchemaURLConflict) {
68+
log.Println(err)
69+
} else if err != nil {
70+
log.Fatalf("resource.New: %v", err)
71+
}
72+
73+
// Setup OpenTelemetry logger provider.
74+
// The logger provider is setup to export logs to both OTLP endpoint
75+
// and standard out.
76+
loggerProvider := otelsdklog.NewLoggerProvider(
77+
otelsdklog.WithProcessor(otelsdklog.NewBatchProcessor(otlpLogExporter)),
78+
otelsdklog.WithProcessor(otelsdklog.NewBatchProcessor(stdoutLogExporter)),
79+
otelsdklog.WithResource(res),
80+
)
81+
82+
// Esnure provider shutdown to flush all logs before exit
83+
defer func() {
84+
if err = loggerProvider.Shutdown(ctx); err != nil {
85+
log.Println(err)
86+
}
87+
}()
88+
89+
// Set global logger provider
90+
global.SetLoggerProvider(loggerProvider)
91+
92+
// emit structured logs to OTLP and standard out
93+
logger := otelslog.NewLogger(name)
94+
generateLogs(ctx, logger)
95+
}
96+
97+
func generateLogs(ctx context.Context, logger *slog.Logger) {
98+
logger.InfoContext(ctx, "Sample application log")
99+
logger.InfoContext(ctx, "Sample log with key-value", "OS Name: ", runtime.GOOS)
100+
}

example/log/slogbridge/go.mod

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
module github.com/GoogleCloudPlatform/opentelemetry-operations-go/example/log/slogbridge
2+
3+
go 1.23.8
4+
5+
require (
6+
go.opentelemetry.io/contrib/bridges/otelslog v0.12.0
7+
go.opentelemetry.io/contrib/detectors/gcp v1.37.0
8+
go.opentelemetry.io/otel v1.37.0
9+
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.13.0
10+
go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.13.0
11+
go.opentelemetry.io/otel/log v0.13.0
12+
go.opentelemetry.io/otel/sdk v1.37.0
13+
go.opentelemetry.io/otel/sdk/log v0.13.0
14+
)
15+
16+
require (
17+
cloud.google.com/go/compute/metadata v0.7.0 // indirect
18+
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0 // indirect
19+
github.com/cenkalti/backoff/v5 v5.0.2 // indirect
20+
github.com/go-logr/logr v1.4.3 // indirect
21+
github.com/go-logr/stdr v1.2.2 // indirect
22+
github.com/google/uuid v1.6.0 // indirect
23+
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 // indirect
24+
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
25+
go.opentelemetry.io/otel/metric v1.37.0 // indirect
26+
go.opentelemetry.io/otel/trace v1.37.0 // indirect
27+
go.opentelemetry.io/proto/otlp v1.7.0 // indirect
28+
golang.org/x/net v0.41.0 // indirect
29+
golang.org/x/sys v0.33.0 // indirect
30+
golang.org/x/text v0.26.0 // indirect
31+
google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 // indirect
32+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 // indirect
33+
google.golang.org/grpc v1.73.0 // indirect
34+
google.golang.org/protobuf v1.36.6 // indirect
35+
)

example/log/slogbridge/go.sum

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
cloud.google.com/go/compute/metadata v0.7.0 h1:PBWF+iiAerVNe8UCHxdOt6eHLVc3ydFeOCw78U8ytSU=
2+
cloud.google.com/go/compute/metadata v0.7.0/go.mod h1:j5MvL9PprKL39t166CoB1uVHfQMs4tFQZZcKwksXUjo=
3+
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0 h1:UQUsRi8WTzhZntp5313l+CHIAT95ojUI2lpP/ExlZa4=
4+
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0/go.mod h1:Cz6ft6Dkn3Et6l2v2a9/RpN7epQ1GtDlO6lj8bEcOvw=
5+
github.com/cenkalti/backoff/v5 v5.0.2 h1:rIfFVxEf1QsI7E1ZHfp/B4DF/6QBAUhmgkxc0H7Zss8=
6+
github.com/cenkalti/backoff/v5 v5.0.2/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw=
7+
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
8+
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
9+
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
10+
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
11+
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
12+
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
13+
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
14+
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
15+
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
16+
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
17+
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
18+
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
19+
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
20+
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 h1:X5VWvz21y3gzm9Nw/kaUeku/1+uBhcekkmy4IkffJww=
21+
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1/go.mod h1:Zanoh4+gvIgluNqcfMVTJueD4wSS5hT7zTt4Mrutd90=
22+
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
23+
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
24+
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
25+
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
26+
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
27+
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
28+
go.opentelemetry.io/contrib/bridges/otelslog v0.12.0 h1:lFM7SZo8Ce01RzRfnUFQZEYeWRf/MtOA3A5MobOqk2g=
29+
go.opentelemetry.io/contrib/bridges/otelslog v0.12.0/go.mod h1:Dw05mhFtrKAYu72Tkb3YBYeQpRUJ4quDgo2DQw3No5A=
30+
go.opentelemetry.io/contrib/detectors/gcp v1.37.0 h1:B+WbN9RPsvobe6q4vP6KgM8/9plR/HNjgGBrfcOlweA=
31+
go.opentelemetry.io/contrib/detectors/gcp v1.37.0/go.mod h1:K5zQ3TT7p2ru9Qkzk0bKtCql0RGkPj9pRjpXgZJZ+rU=
32+
go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ=
33+
go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I=
34+
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.13.0 h1:zUfYw8cscHHLwaY8Xz3fiJu+R59xBnkgq2Zr1lwmK/0=
35+
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.13.0/go.mod h1:514JLMCcFLQFS8cnTepOk6I09cKWJ5nGHBxHrMJ8Yfg=
36+
go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.13.0 h1:yEX3aC9KDgvYPhuKECHbOlr5GLwH6KTjLJ1sBSkkxkc=
37+
go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.13.0/go.mod h1:/GXR0tBmmkxDaCUGahvksvp66mx4yh5+cFXgSlhg0vQ=
38+
go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls=
39+
go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E=
40+
go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE=
41+
go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E=
42+
go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI=
43+
go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg=
44+
go.opentelemetry.io/otel/sdk/log v0.13.0 h1:I3CGUszjM926OphK8ZdzF+kLqFvfRY/IIoFq/TjwfaQ=
45+
go.opentelemetry.io/otel/sdk/log v0.13.0/go.mod h1:lOrQyCCXmpZdN7NchXb6DOZZa1N5G1R2tm5GMMTpDBw=
46+
go.opentelemetry.io/otel/sdk/log/logtest v0.13.0 h1:9yio6AFZ3QD9j9oqshV1Ibm9gPLlHNxurno5BreMtIA=
47+
go.opentelemetry.io/otel/sdk/log/logtest v0.13.0/go.mod h1:QOGiAJHl+fob8Nu85ifXfuQYmJTFAvcrxL6w5/tu168=
48+
go.opentelemetry.io/otel/sdk/metric v1.35.0 h1:1RriWBmCKgkeHEhM7a2uMjMUfP7MsOF5JpUCaEqEI9o=
49+
go.opentelemetry.io/otel/sdk/metric v1.35.0/go.mod h1:is6XYCUMpcKi+ZsOvfluY5YstFnhW0BidkR+gL+qN+w=
50+
go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4=
51+
go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0=
52+
go.opentelemetry.io/proto/otlp v1.7.0 h1:jX1VolD6nHuFzOYso2E73H85i92Mv8JQYk0K9vz09os=
53+
go.opentelemetry.io/proto/otlp v1.7.0/go.mod h1:fSKjH6YJ7HDlwzltzyMj036AJ3ejJLCgCSHGj4efDDo=
54+
golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=
55+
golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=
56+
golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
57+
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
58+
golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M=
59+
golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA=
60+
google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 h1:oWVWY3NzT7KJppx2UKhKmzPq4SRe0LdCijVRwvGeikY=
61+
google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822/go.mod h1:h3c4v36UTKzUiuaOKQ6gr3S+0hovBtUrXzTG/i3+XEc=
62+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 h1:fc6jSaCT0vBduLYZHYrBBNY4dsWuvgyff9noRNDdBeE=
63+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
64+
google.golang.org/grpc v1.73.0 h1:VIWSmpI2MegBtTuFt5/JWy2oXxtjJ/e89Z70ImfD2ok=
65+
google.golang.org/grpc v1.73.0/go.mod h1:50sbHOUqWoCQGI8V2HQLJM0B+LMlIUjNSZmow7EVBQc=
66+
google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
67+
google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
68+
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
69+
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

0 commit comments

Comments
 (0)