Skip to content

Commit e60a6ef

Browse files
committed
Add prometheus metrics
1 parent 77c8684 commit e60a6ef

File tree

6 files changed

+192
-17
lines changed

6 files changed

+192
-17
lines changed

Docker-Compose.yaml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
services:
22
fleet-telemetry-consumer:
3-
platform: linux/amd64
43
build:
54
context: .
65
dockerfile: Dockerfile
76
volumes:
8-
- ./examples/consumer_config.json:/etc/fleet-telemetry-consumer/config.json:ro
9-
command: ["/fleet-telemetry-consumer", "-config", "/etc/fleet-telemetry-consumer/config.json"]
7+
- ./examples/config.json:/etc/fleet-telemetry-consumer/config.json:ro
8+
command: ["/fleet-telemetry-consumer", "-config", "/etc/fleet-telemetry-consumer/config.json"]
9+
ports:
10+
- "2112:2112" # Expose Prometheus metrics port

Dockerfile

Lines changed: 49 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,55 @@
1-
FROM golang:1.22.5-bullseye as build
1+
# syntax=docker/dockerfile:1
2+
3+
FROM golang:1.22.5-bullseye AS build
4+
5+
# Install build dependencies and librdkafka dependencies
6+
RUN apt-get update && apt-get install -y \
7+
build-essential \
8+
wget \
9+
libssl-dev \
10+
libsasl2-dev \
11+
libzstd-dev \
12+
pkg-config \
13+
liblz4-dev \
14+
&& rm -rf /var/lib/apt/lists/*
15+
16+
# Build and install librdkafka from source
17+
ENV LIBRDKAFKA_VERSION=1.9.2
18+
RUN wget https://github.com/edenhill/librdkafka/archive/refs/tags/v${LIBRDKAFKA_VERSION}.tar.gz && \
19+
tar -xzf v${LIBRDKAFKA_VERSION}.tar.gz && \
20+
cd librdkafka-${LIBRDKAFKA_VERSION} && \
21+
./configure --prefix=/usr && \
22+
make && make install && \
23+
ldconfig
24+
225
WORKDIR /go/src/fleet-telemetry-consumer
26+
27+
COPY go.mod go.sum ./
28+
RUN go mod download
29+
330
COPY . .
4-
RUN go build -o /go/bin/fleet-telemetry-consumer
531

6-
FROM gcr.io/distroless/cc-debian11
32+
# Build with dynamic linking
33+
RUN go build -tags dynamic -o /go/bin/fleet-telemetry-consumer
34+
35+
# Use a minimal base image
36+
FROM debian:bullseye-slim
37+
738
WORKDIR /
39+
40+
# Install runtime dependencies
41+
RUN apt-get update && apt-get install -y \
42+
libssl1.1 \
43+
libsasl2-2 \
44+
libzstd1 \
45+
liblz4-1 \
46+
&& rm -rf /var/lib/apt/lists/*
47+
48+
# Copy the built binary and shared libraries
849
COPY --from=build /go/bin/fleet-telemetry-consumer /
50+
COPY --from=build /usr/lib/librdkafka*.so* /usr/lib/
51+
52+
# Expose Prometheus metrics port
53+
EXPOSE 2112
54+
955
CMD ["/fleet-telemetry-consumer", "-config", "/etc/fleet-telemetry-consumer/config.json"]

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
build:
2-
docker build . --platform linux/amd64 --no-cache
2+
docker buildx build --platform linux/amd64 --load -t fleet-telemetry-consumer .
33

44
run:
55
docker compose up --build

go.mod

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,21 @@
11
module github.com/rajsinghtech/fleet-telemetry-consumer
22

3-
go 1.22.5
3+
go 1.22
44

55
require (
66
github.com/confluentinc/confluent-kafka-go v1.9.2
7+
github.com/prometheus/client_golang v1.15.0
78
github.com/teslamotors/fleet-telemetry v0.3.2
89
google.golang.org/protobuf v1.33.0
910
)
11+
12+
require (
13+
github.com/beorn7/perks v1.0.1 // indirect
14+
github.com/cespare/xxhash/v2 v2.2.0 // indirect
15+
github.com/golang/protobuf v1.5.3 // indirect
16+
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
17+
github.com/prometheus/client_model v0.3.0 // indirect
18+
github.com/prometheus/common v0.42.0 // indirect
19+
github.com/prometheus/procfs v0.9.0 // indirect
20+
golang.org/x/sys v0.18.0 // indirect
21+
)

go.sum

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,12 @@ github.com/actgardner/gogen-avro/v10 v10.1.0/go.mod h1:o+ybmVjEa27AAr35FRqU98DJu
55
github.com/actgardner/gogen-avro/v10 v10.2.1/go.mod h1:QUhjeHPchheYmMDni/Nx7VB0RsT/ee8YIgGY/xpEQgQ=
66
github.com/actgardner/gogen-avro/v9 v9.1.0/go.mod h1:nyTj6wPqDJoxM3qdnjcLv+EnMDSDFqE0qDpva2QRmKc=
77
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
8+
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
9+
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
810
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
911
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
12+
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
13+
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
1014
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
1115
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
1216
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
@@ -22,6 +26,8 @@ github.com/confluentinc/confluent-kafka-go v1.9.2/go.mod h1:ptXNqsuDfYbAE/LBW6pn
2226
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
2327
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
2428
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
29+
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
30+
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
2531
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
2632
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
2733
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
@@ -39,6 +45,7 @@ github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfb
3945
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
4046
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
4147
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
48+
github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
4249
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
4350
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
4451
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
@@ -49,6 +56,8 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw
4956
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
5057
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
5158
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
59+
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
60+
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
5261
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
5362
github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
5463
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
@@ -90,14 +99,24 @@ github.com/linkedin/goavro v2.1.0+incompatible/go.mod h1:bBCwI2eGYpUI/4820s67MEl
9099
github.com/linkedin/goavro/v2 v2.10.0/go.mod h1:UgQUb2N/pmueQYH9bfqFioWxzYCZXSfF8Jw03O5sjqA=
91100
github.com/linkedin/goavro/v2 v2.10.1/go.mod h1:UgQUb2N/pmueQYH9bfqFioWxzYCZXSfF8Jw03O5sjqA=
92101
github.com/linkedin/goavro/v2 v2.11.1/go.mod h1:UgQUb2N/pmueQYH9bfqFioWxzYCZXSfF8Jw03O5sjqA=
102+
github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo=
103+
github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
93104
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
94105
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
95106
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
96107
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
97108
github.com/nrwiersma/avro-benchmarks v0.0.0-20210913175520-21aec48c8f76/go.mod h1:iKyFMidsk/sVYONJRE372sJuX/QTRPacU7imPqqsu7g=
98109
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
99110
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
111+
github.com/prometheus/client_golang v1.15.0 h1:5fCgGYogn0hFdhyhLbw7hEsWxufKtY9klyvdNfFlFhM=
112+
github.com/prometheus/client_golang v1.15.0/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk=
100113
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
114+
github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4=
115+
github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=
116+
github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM=
117+
github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc=
118+
github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI=
119+
github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY=
101120
github.com/rogpeppe/clock v0.0.0-20190514195947-2896927a307a/go.mod h1:4r5QyqhjIWCcK8DO4KMclc5Iknq5qVBAlbYYzAbUScQ=
102121
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
103122
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
@@ -152,6 +171,8 @@ golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7w
152171
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
153172
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
154173
golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
174+
golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
175+
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
155176
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
156177
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
157178
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=

main.go

Lines changed: 104 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,12 @@ import (
66
"fmt"
77
"os"
88
"log"
9+
"net/http"
910
"github.com/confluentinc/confluent-kafka-go/kafka"
10-
"google.golang.org/protobuf/proto"
1111
"github.com/teslamotors/fleet-telemetry/protos"
12+
"github.com/prometheus/client_golang/prometheus"
13+
"github.com/prometheus/client_golang/prometheus/promhttp"
14+
"google.golang.org/protobuf/proto"
1215
)
1316

1417
func main() {
@@ -51,13 +54,31 @@ func main() {
5154
for topic := range metadata.Topics {
5255
fmt.Println(topic)
5356
}
54-
57+
5558
// Subscribe to the topic
5659
err = consumer.Subscribe("tesla_V", nil)
5760
if err != nil {
5861
log.Fatalf("Failed to subscribe to topic: %s", err)
5962
}
6063

64+
// Initialize Prometheus metrics
65+
vehicleDataGauge := prometheus.NewGaugeVec(
66+
prometheus.GaugeOpts{
67+
Name: "vehicle_data",
68+
Help: "Vehicle data metrics",
69+
},
70+
[]string{"field", "vin"},
71+
)
72+
73+
// Register the metric
74+
prometheus.MustRegister(vehicleDataGauge)
75+
76+
// Start HTTP server for Prometheus metrics
77+
go func() {
78+
http.Handle("/metrics", promhttp.Handler())
79+
log.Fatal(http.ListenAndServe(":2112", nil))
80+
}()
81+
6182
// Consume messages
6283
fmt.Println("Waiting for messages...")
6384

@@ -70,18 +91,92 @@ func main() {
7091
}
7192

7293
// Deserialize the Protobuf message
73-
vehicleData := &protos.Payload{} // Use the correct message type
94+
vehicleData := &protos.Payload{}
7495
if err := proto.Unmarshal(msg.Value, vehicleData); err != nil {
7596
log.Printf("Failed to unmarshal Protobuf message: %v\n", err)
7697
continue
7798
}
7899

79-
// Output the message to console
80-
vehicleDataJSON, err := json.MarshalIndent(vehicleData, "", " ")
81-
if err != nil {
82-
log.Printf("Failed to marshal vehicle data to JSON: %v\n", err)
83-
continue
100+
// Process each Datum in the Payload
101+
for _, datum := range vehicleData.Data {
102+
fieldName := datum.Key.String() // Get the field name from the enum
103+
value := datum.Value
104+
105+
var numericValue float64
106+
107+
switch v := value.Value.(type) {
108+
case *protos.Value_DoubleValue:
109+
numericValue = v.DoubleValue
110+
case *protos.Value_FloatValue:
111+
numericValue = float64(v.FloatValue)
112+
case *protos.Value_IntValue:
113+
numericValue = float64(v.IntValue)
114+
case *protos.Value_LongValue:
115+
numericValue = float64(v.LongValue)
116+
case *protos.Value_BooleanValue:
117+
if v.BooleanValue {
118+
numericValue = 1.0
119+
} else {
120+
numericValue = 0.0
121+
}
122+
case *protos.Value_ChargingValue:
123+
numericValue = float64(v.ChargingValue.Number())
124+
case *protos.Value_ShiftStateValue:
125+
numericValue = float64(v.ShiftStateValue.Number())
126+
case *protos.Value_LaneAssistLevelValue:
127+
numericValue = float64(v.LaneAssistLevelValue.Number())
128+
case *protos.Value_ScheduledChargingModeValue:
129+
numericValue = float64(v.ScheduledChargingModeValue.Number())
130+
case *protos.Value_SentryModeStateValue:
131+
numericValue = float64(v.SentryModeStateValue.Number())
132+
case *protos.Value_SpeedAssistLevelValue:
133+
numericValue = float64(v.SpeedAssistLevelValue.Number())
134+
case *protos.Value_BmsStateValue:
135+
numericValue = float64(v.BmsStateValue.Number())
136+
case *protos.Value_BuckleStatusValue:
137+
numericValue = float64(v.BuckleStatusValue.Number())
138+
case *protos.Value_CarTypeValue:
139+
numericValue = float64(v.CarTypeValue.Number())
140+
case *protos.Value_ChargePortValue:
141+
numericValue = float64(v.ChargePortValue.Number())
142+
case *protos.Value_ChargePortLatchValue:
143+
numericValue = float64(v.ChargePortLatchValue.Number())
144+
case *protos.Value_CruiseStateValue:
145+
numericValue = float64(v.CruiseStateValue.Number())
146+
case *protos.Value_DriveInverterStateValue:
147+
numericValue = float64(v.DriveInverterStateValue.Number())
148+
case *protos.Value_HvilStatusValue:
149+
numericValue = float64(v.HvilStatusValue.Number())
150+
case *protos.Value_WindowStateValue:
151+
numericValue = float64(v.WindowStateValue.Number())
152+
case *protos.Value_SeatFoldPositionValue:
153+
numericValue = float64(v.SeatFoldPositionValue.Number())
154+
case *protos.Value_TractorAirStatusValue:
155+
numericValue = float64(v.TractorAirStatusValue.Number())
156+
case *protos.Value_FollowDistanceValue:
157+
numericValue = float64(v.FollowDistanceValue.Number())
158+
case *protos.Value_ForwardCollisionSensitivityValue:
159+
numericValue = float64(v.ForwardCollisionSensitivityValue.Number())
160+
case *protos.Value_GuestModeMobileAccessValue:
161+
numericValue = float64(v.GuestModeMobileAccessValue.Number())
162+
case *protos.Value_TrailerAirStatusValue:
163+
numericValue = float64(v.TrailerAirStatusValue.Number())
164+
case *protos.Value_DetailedChargeStateValue:
165+
numericValue = float64(v.DetailedChargeStateValue.Number())
166+
case *protos.Value_LocationValue:
167+
// Handle LocationValue separately
168+
lat := v.LocationValue.Latitude
169+
lon := v.LocationValue.Longitude
170+
vehicleDataGauge.WithLabelValues(fieldName+"_latitude", vehicleData.Vin).Set(lat)
171+
vehicleDataGauge.WithLabelValues(fieldName+"_longitude", vehicleData.Vin).Set(lon)
172+
continue // Skip the rest since we've handled this case
173+
default:
174+
// Skip non-numeric or unsupported types
175+
continue
176+
}
177+
178+
// Update the metric
179+
vehicleDataGauge.WithLabelValues(fieldName, vehicleData.Vin).Set(numericValue)
84180
}
85-
fmt.Printf("Received message: %s\n", vehicleDataJSON)
86181
}
87182
}

0 commit comments

Comments
 (0)