Skip to content

Commit 25e33a6

Browse files
authored
examples: Add CSM Observability example (#7302) (#7318)
1 parent 04a5f46 commit 25e33a6

File tree

7 files changed

+294
-2
lines changed

7 files changed

+294
-2
lines changed

Diff for: examples/features/csm_observability/README.md

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# CSM Observability
2+
3+
This examples shows how to configure CSM Observability for gRPC client and
4+
server applications (configured once per binary), and shows what type of
5+
telemetry data it can produce for certain RPCs with additional CSM Labels. The
6+
gRPC Client accepts configuration from an xDS Control plane as the default
7+
address that it connects to is "xds:///helloworld:50051", but this can be
8+
overridden with the command line flag --server_addr. This can be plugged into
9+
the steps outlined in the CSM Observability User Guide.
10+
11+
## Try it (locally if overwritten xDS Address)
12+
13+
```
14+
go run server/main.go
15+
```
16+
17+
```
18+
go run client/main.go
19+
```
20+
21+
Curl to the port where Prometheus exporter is outputting metrics data:
22+
```
23+
curl localhost:9464/metrics
24+
```
25+
26+
# Building
27+
From the grpc-go directory:
28+
29+
Client:
30+
docker build -t <TAG> -f examples/features/csm_observability/client/Dockerfile .
31+
32+
Server:
33+
docker build -t <TAG> -f examples/features/csm_observability/server/Dockerfile .
34+
35+
Note that this example will not work by default, as the client uses an xDS
36+
Scheme and thus needs xDS Resources to connect to the server. Deploy the built
37+
client and server containers within Cloud Service Mesh in order for this example
38+
to work, or overwrite target to point to :<server serving port>.
+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# Copyright 2024 gRPC authors.
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+
# Dockerfile for building the example client. To build the image, run the
16+
# following command from grpc-go directory:
17+
# docker build -t <TAG> -f examples/features/csm_observability/client/Dockerfile .
18+
FROM golang:1.21-alpine as build
19+
20+
RUN apk --no-cache add curl
21+
22+
# Make a grpc-go directory and copy the repo into it.
23+
WORKDIR /go/src/grpc-go
24+
COPY . .
25+
26+
# Build a static binary without cgo so that we can copy just the binary in the
27+
# final image, and can get rid of the Go compiler and gRPC-Go dependencies.
28+
RUN cd examples/features/csm_observability/client && go build -tags osusergo,netgo .
29+
30+
FROM alpine
31+
RUN apk --no-cache add curl
32+
COPY --from=build /go/src/grpc-go/examples/features/csm_observability/client/client .
33+
ENV GRPC_GO_LOG_VERBOSITY_LEVEL=99
34+
ENV GRPC_GO_LOG_SEVERITY_LEVEL="info"
35+
ENTRYPOINT ["./client"]

Diff for: examples/features/csm_observability/client/main.go

+77
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
/*
2+
*
3+
* Copyright 2024 gRPC authors.
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+
*/
18+
19+
package main
20+
21+
import (
22+
"context"
23+
"flag"
24+
"fmt"
25+
"log"
26+
"net/http"
27+
"time"
28+
29+
"google.golang.org/grpc"
30+
"google.golang.org/grpc/credentials/insecure"
31+
"google.golang.org/grpc/examples/features/proto/echo"
32+
"google.golang.org/grpc/stats/opentelemetry"
33+
"google.golang.org/grpc/stats/opentelemetry/csm"
34+
_ "google.golang.org/grpc/xds" // To install the xds resolvers and balancers.
35+
36+
"github.com/prometheus/client_golang/prometheus/promhttp"
37+
"go.opentelemetry.io/otel/exporters/prometheus"
38+
"go.opentelemetry.io/otel/sdk/metric"
39+
)
40+
41+
var (
42+
target = flag.String("target", "xds:///helloworld:50051", "the server address to connect to")
43+
prometheusEndpoint = flag.String("prometheus_endpoint", ":9464", "the Prometheus exporter endpoint")
44+
)
45+
46+
func main() {
47+
flag.Parse()
48+
exporter, err := prometheus.New()
49+
if err != nil {
50+
log.Fatalf("Failed to start prometheus exporter: %v", err)
51+
}
52+
provider := metric.NewMeterProvider(metric.WithReader(exporter))
53+
go http.ListenAndServe(*prometheusEndpoint, promhttp.Handler())
54+
55+
cleanup := csm.EnableObservability(context.Background(), opentelemetry.Options{MetricsOptions: opentelemetry.MetricsOptions{MeterProvider: provider}})
56+
defer cleanup()
57+
58+
cc, err := grpc.NewClient(*target, grpc.WithTransportCredentials(insecure.NewCredentials()))
59+
if err != nil {
60+
log.Fatalf("Failed to start NewClient: %v", err)
61+
}
62+
defer cc.Close()
63+
c := echo.NewEchoClient(cc)
64+
65+
// Make a RPC every second. This should trigger telemetry to be emitted from
66+
// the client and the server.
67+
for {
68+
ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
69+
r, err := c.UnaryEcho(ctx, &echo.EchoRequest{Message: "this is examples/opentelemetry"})
70+
if err != nil {
71+
log.Printf("UnaryEcho failed: %v", err)
72+
}
73+
fmt.Println(r)
74+
time.Sleep(time.Second)
75+
cancel()
76+
}
77+
}
+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# Copyright 2024 gRPC authors.
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+
# Dockerfile for building the example server. To build the image, run the
16+
# following command from grpc-go directory:
17+
# docker build -t <TAG> -f examples/features/csm_observability/server/Dockerfile .
18+
19+
FROM golang:1.21-alpine as build
20+
RUN apk --no-cache add curl
21+
# Make a grpc-go directory and copy the repo into it.
22+
WORKDIR /go/src/grpc-go
23+
COPY . .
24+
25+
# Build a static binary without cgo so that we can copy just the binary in the
26+
# final image, and can get rid of the Go compiler and gRPC-Go dependencies.
27+
RUN cd examples/features/csm_observability/server && go build -tags osusergo,netgo .
28+
29+
FROM alpine
30+
RUN apk --no-cache add curl
31+
COPY --from=build /go/src/grpc-go/examples/features/csm_observability/server/server .
32+
ENV GRPC_GO_LOG_VERBOSITY_LEVEL=99
33+
ENV GRPC_GO_LOG_SEVERITY_LEVEL="info"
34+
ENTRYPOINT ["./server"]

Diff for: examples/features/csm_observability/server/main.go

+77
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
/*
2+
*
3+
* Copyright 2024 gRPC authors.
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+
*/
18+
19+
package main
20+
21+
import (
22+
"context"
23+
"flag"
24+
"fmt"
25+
"log"
26+
"net"
27+
"net/http"
28+
29+
"google.golang.org/grpc"
30+
pb "google.golang.org/grpc/examples/features/proto/echo"
31+
"google.golang.org/grpc/stats/opentelemetry"
32+
"google.golang.org/grpc/stats/opentelemetry/csm"
33+
34+
"github.com/prometheus/client_golang/prometheus/promhttp"
35+
"go.opentelemetry.io/otel/exporters/prometheus"
36+
"go.opentelemetry.io/otel/sdk/metric"
37+
)
38+
39+
var (
40+
port = flag.String("port", "50051", "the server address to connect to")
41+
prometheusEndpoint = flag.String("prometheus_endpoint", ":9464", "the Prometheus exporter endpoint")
42+
)
43+
44+
type echoServer struct {
45+
pb.UnimplementedEchoServer
46+
addr string
47+
}
48+
49+
func (s *echoServer) UnaryEcho(ctx context.Context, req *pb.EchoRequest) (*pb.EchoResponse, error) {
50+
return &pb.EchoResponse{Message: fmt.Sprintf("%s (from %s)", req.Message, s.addr)}, nil
51+
}
52+
53+
func main() {
54+
flag.Parse()
55+
exporter, err := prometheus.New()
56+
if err != nil {
57+
log.Fatalf("Failed to start prometheus exporter: %v", err)
58+
}
59+
provider := metric.NewMeterProvider(metric.WithReader(exporter))
60+
go http.ListenAndServe(*prometheusEndpoint, promhttp.Handler())
61+
62+
cleanup := csm.EnableObservability(context.Background(), opentelemetry.Options{MetricsOptions: opentelemetry.MetricsOptions{MeterProvider: provider}})
63+
defer cleanup()
64+
65+
lis, err := net.Listen("tcp", ":"+*port)
66+
if err != nil {
67+
log.Fatalf("Failed to listen: %v", err)
68+
}
69+
s := grpc.NewServer()
70+
pb.RegisterEchoServer(s, &echoServer{addr: ":" + *port})
71+
72+
log.Printf("Serving on %s\n", *port)
73+
74+
if err := s.Serve(lis); err != nil {
75+
log.Fatalf("Failed to serve: %v", err)
76+
}
77+
}

Diff for: examples/go.mod

+13
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,14 @@ go 1.21
44

55
require (
66
github.com/cncf/xds/go v0.0.0-20240423153145-555b57ec207b
7+
github.com/prometheus/client_golang v1.19.1
8+
go.opentelemetry.io/otel/exporters/prometheus v0.49.0
9+
go.opentelemetry.io/otel/sdk/metric v1.27.0
710
golang.org/x/oauth2 v0.20.0
811
google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157
912
google.golang.org/grpc v1.64.0
1013
google.golang.org/grpc/gcp/observability v1.0.1
14+
google.golang.org/grpc/stats/opentelemetry v0.0.0-20240604165302-6d236200ea68
1115
google.golang.org/protobuf v1.34.1
1216
)
1317

@@ -22,6 +26,7 @@ require (
2226
cloud.google.com/go/monitoring v1.19.0 // indirect
2327
cloud.google.com/go/trace v1.10.7 // indirect
2428
contrib.go.opencensus.io/exporter/stackdriver v0.13.15-0.20230702191903-2de6d2748484 // indirect
29+
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.23.0 // indirect
2530
github.com/aws/aws-sdk-go-v2 v1.27.0 // indirect
2631
github.com/aws/aws-sdk-go-v2/config v1.27.16 // indirect
2732
github.com/aws/aws-sdk-go-v2/credentials v1.17.16 // indirect
@@ -35,6 +40,7 @@ require (
3540
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.3 // indirect
3641
github.com/aws/aws-sdk-go-v2/service/sts v1.28.10 // indirect
3742
github.com/aws/smithy-go v1.20.2 // indirect
43+
github.com/beorn7/perks v1.0.1 // indirect
3844
github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect
3945
github.com/cespare/xxhash/v2 v2.3.0 // indirect
4046
github.com/envoyproxy/go-control-plane v0.12.0 // indirect
@@ -48,11 +54,16 @@ require (
4854
github.com/google/uuid v1.6.0 // indirect
4955
github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect
5056
github.com/googleapis/gax-go/v2 v2.12.4 // indirect
57+
github.com/prometheus/client_model v0.6.1 // indirect
58+
github.com/prometheus/common v0.53.0 // indirect
59+
github.com/prometheus/procfs v0.15.0 // indirect
5160
go.opencensus.io v0.24.0 // indirect
61+
go.opentelemetry.io/contrib/detectors/gcp v1.27.0 // indirect
5262
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 // indirect
5363
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect
5464
go.opentelemetry.io/otel v1.27.0 // indirect
5565
go.opentelemetry.io/otel/metric v1.27.0 // indirect
66+
go.opentelemetry.io/otel/sdk v1.27.0 // indirect
5667
go.opentelemetry.io/otel/trace v1.27.0 // indirect
5768
golang.org/x/crypto v0.23.0 // indirect
5869
golang.org/x/net v0.25.0 // indirect
@@ -67,3 +78,5 @@ require (
6778
)
6879

6980
replace google.golang.org/grpc => ../
81+
82+
replace google.golang.org/grpc/stats/opentelemetry => ../stats/opentelemetry

Diff for: examples/go.sum

+20-2
Original file line numberDiff line numberDiff line change
@@ -774,6 +774,8 @@ gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zum
774774
git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=
775775
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
776776
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
777+
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.23.0 h1:yRhWveg9NbJcJYoJL4FoSauT2dxnt4N9MIAJ7tvU/mQ=
778+
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.23.0/go.mod h1:p2puVVSKjQ84Qb1gzw2XHLs34WQyHTYFZLaVxypAFYs=
777779
github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk=
778780
github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=
779781
github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=
@@ -811,6 +813,8 @@ github.com/aws/aws-sdk-go-v2/service/sts v1.28.10 h1:69tpbPED7jKPyzMcrwSvhWcJ9bP
811813
github.com/aws/aws-sdk-go-v2/service/sts v1.28.10/go.mod h1:0Aqn1MnEuitqfsCNyKsdKLhDUOr4txD/g19EfiUqgws=
812814
github.com/aws/smithy-go v1.20.2 h1:tbp628ireGtzcHDDmLT/6ADHidqnwgF57XOXZe6tp4Q=
813815
github.com/aws/smithy-go v1.20.2/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E=
816+
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
817+
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
814818
github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
815819
github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
816820
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
@@ -1041,10 +1045,18 @@ github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZ
10411045
github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg=
10421046
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
10431047
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
1048+
github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE=
1049+
github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho=
10441050
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
10451051
github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
10461052
github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=
10471053
github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=
1054+
github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
1055+
github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
1056+
github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE=
1057+
github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U=
1058+
github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek=
1059+
github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk=
10481060
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
10491061
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
10501062
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
@@ -1089,16 +1101,22 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
10891101
go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
10901102
go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
10911103
go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
1104+
go.opentelemetry.io/contrib/detectors/gcp v1.27.0 h1:eVfDeFAPnMFZUhNdDZ/BbpEmC7/xxDKTSba5NhJH88s=
1105+
go.opentelemetry.io/contrib/detectors/gcp v1.27.0/go.mod h1:amd+4uZxqJAUx7zI1JvygUtAc2EVWtQeyz8D+3161SQ=
10921106
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 h1:vS1Ao/R55RNV4O7TA2Qopok8yN+X0LIP6RVWLFkprck=
10931107
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0/go.mod h1:BMsdeOxN04K0L5FNUBfjFdvwWGNe/rkmSwH4Aelu/X0=
10941108
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 h1:9l89oX4ba9kHbBol3Xin3leYJ+252h0zszDtBwyKe2A=
10951109
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0/go.mod h1:XLZfZboOJWHNKUv7eH0inh0E9VV6eWDFB/9yJyTLPp0=
10961110
go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg=
10971111
go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ=
1112+
go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ=
1113+
go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM=
10981114
go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik=
10991115
go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak=
1100-
go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw=
1101-
go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg=
1116+
go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI=
1117+
go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A=
1118+
go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI=
1119+
go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw=
11021120
go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw=
11031121
go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4=
11041122
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=

0 commit comments

Comments
 (0)