|
30 | 30 | package gax |
31 | 31 |
|
32 | 32 | import ( |
| 33 | + "context" |
| 34 | + |
33 | 35 | "go.opentelemetry.io/otel" |
34 | 36 | "go.opentelemetry.io/otel/attribute" |
35 | 37 | "go.opentelemetry.io/otel/metric" |
36 | 38 | ) |
37 | 39 |
|
| 40 | +// TransportTelemetryData contains mutable telemetry information that the transport |
| 41 | +// layer (e.g. gRPC or HTTP) populates during an RPC. This allows gax.Invoke to |
| 42 | +// correctly emit metric data without directly importing those transport layers. |
| 43 | +// This is an EXPERIMENTAL struct and should not be used by external consumers. |
| 44 | +type TransportTelemetryData struct { |
| 45 | + serverAddress string |
| 46 | + serverPort int |
| 47 | + responseStatusCode int |
| 48 | +} |
| 49 | + |
| 50 | +// SetServerAddress sets the server address. |
| 51 | +func (d *TransportTelemetryData) SetServerAddress(addr string) { d.serverAddress = addr } |
| 52 | + |
| 53 | +// ServerAddress returns the server address. |
| 54 | +func (d *TransportTelemetryData) ServerAddress() string { return d.serverAddress } |
| 55 | + |
| 56 | +// SetServerPort sets the server port. |
| 57 | +func (d *TransportTelemetryData) SetServerPort(port int) { d.serverPort = port } |
| 58 | + |
| 59 | +// ServerPort returns the server port. |
| 60 | +func (d *TransportTelemetryData) ServerPort() int { return d.serverPort } |
| 61 | + |
| 62 | +// SetResponseStatusCode sets the response status code. |
| 63 | +func (d *TransportTelemetryData) SetResponseStatusCode(code int) { d.responseStatusCode = code } |
| 64 | + |
| 65 | +// ResponseStatusCode returns the response status code. |
| 66 | +func (d *TransportTelemetryData) ResponseStatusCode() int { return d.responseStatusCode } |
| 67 | + |
| 68 | +// transportTelemetryKey is the private context key used to inject TransportTelemetryData |
| 69 | +type transportTelemetryKey struct{} |
| 70 | + |
| 71 | +// InjectTransportTelemetry injects a mutable TransportTelemetryData pointer into the context. |
| 72 | +// Experimental: This function is subject to breaking changes. |
| 73 | +func InjectTransportTelemetry(ctx context.Context, data *TransportTelemetryData) context.Context { |
| 74 | + return context.WithValue(ctx, transportTelemetryKey{}, data) |
| 75 | +} |
| 76 | + |
| 77 | +// ExtractTransportTelemetry retrieves a mutable TransportTelemetryData pointer from the context. |
| 78 | +func ExtractTransportTelemetry(ctx context.Context) *TransportTelemetryData { |
| 79 | + data, _ := ctx.Value(transportTelemetryKey{}).(*TransportTelemetryData) |
| 80 | + return data |
| 81 | +} |
| 82 | + |
38 | 83 | const ( |
39 | 84 | metricName = "gcp.client.request.duration" |
40 | 85 | metricDescription = "Duration of the request to the Google Cloud API" |
|
0 commit comments