package weather import ( "context" "gitea.libretechconsulting.com/rmcguire/go-app/pkg/config" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/metric" semconv "go.opentelemetry.io/otel/semconv/v1.26.0" ) var MetricPrefix = "weather" type WeatherMetrics struct { // Weather Metrics TempOutdoorF metric.Float64Gauge TempIndoorF metric.Float64Gauge HumidityOudoor metric.Int64Gauge HumidityIndoor metric.Int64Gauge WindSpeedMPH metric.Float64Gauge WindGustMPH metric.Float64Gauge MaxDailyGust metric.Float64Gauge WindDir metric.Int64Gauge WindDirAvg10m metric.Int64Gauge UV metric.Int64Gauge SolarRadiation metric.Float64Gauge HourlyRainIn metric.Float64Gauge EventRainIn metric.Float64Gauge DailyRainIn metric.Float64Gauge WeeklyRainIn metric.Float64Gauge MonthlyRainIn metric.Float64Gauge YearlyRainIn metric.Float64Gauge TotalRainIn metric.Float64Gauge BatteryStatus metric.Int64Gauge BaromRelativeIn metric.Float64Gauge BaromAbsoluteIn metric.Float64Gauge DewPointF metric.Float64Gauge WindChillF metric.Float64Gauge // Temp and Humidity Sensors SensorTempF metric.Float64Gauge SensorHumidity metric.Int64Gauge // Internal Telemetry UpdatesReceived metric.Int64Counter appCtx context.Context cfg *config.AppConfig meter metric.Meter recorder *MetricRecorder } func (wm *WeatherMetrics) Update(u *WeatherUpdate) { attributes := wm.GetAttributes(u) wm.recorder.Record(&RecordOpts{Float64Gauge: wm.TempOutdoorF, FloatVal: u.TempOutdoorF, Field: FieldTempOutdoorF, Attributes: attributes, Station: u.StationConfig}) wm.recorder.Record(&RecordOpts{Float64Gauge: wm.TempIndoorF, FloatVal: u.TempIndoorF, Field: FieldTempIndoorF, Attributes: attributes, Station: u.StationConfig}) wm.recorder.Record(&RecordOpts{Int64Gauge: wm.HumidityOudoor, IntVal: u.HumidityOudoor, Field: FieldHumidityOudoor, Attributes: attributes, Station: u.StationConfig}) wm.recorder.Record(&RecordOpts{Int64Gauge: wm.HumidityIndoor, IntVal: u.HumidityIndoor, Field: FieldHumidityIndoor, Attributes: attributes, Station: u.StationConfig}) wm.recorder.Record(&RecordOpts{Float64Gauge: wm.WindSpeedMPH, FloatVal: u.WindSpeedMPH, Field: FieldWindSpeedMPH, Attributes: attributes, Station: u.StationConfig}) wm.recorder.Record(&RecordOpts{Float64Gauge: wm.WindGustMPH, FloatVal: u.WindGustMPH, Field: FieldWindGustMPH, Attributes: attributes, Station: u.StationConfig}) wm.recorder.Record(&RecordOpts{Float64Gauge: wm.MaxDailyGust, FloatVal: u.MaxDailyGust, Field: FieldMaxDailyGust, Attributes: attributes, Station: u.StationConfig}) wm.recorder.Record(&RecordOpts{Int64Gauge: wm.WindDir, IntVal: u.WindDir, Field: FieldWindDir, Attributes: attributes, Station: u.StationConfig}) wm.recorder.Record(&RecordOpts{Int64Gauge: wm.WindDirAvg10m, IntVal: u.WindDirAvg10m, Field: FieldWindDirAvg10m, Attributes: attributes, Station: u.StationConfig}) wm.recorder.Record(&RecordOpts{Int64Gauge: wm.UV, IntVal: u.UV, Field: FieldUV, Attributes: attributes, Station: u.StationConfig}) wm.recorder.Record(&RecordOpts{Float64Gauge: wm.SolarRadiation, FloatVal: u.SolarRadiation, Field: FieldSolarRadiation, Attributes: attributes, Station: u.StationConfig}) wm.recorder.Record(&RecordOpts{Float64Gauge: wm.HourlyRainIn, FloatVal: u.HourlyRainIn, Field: FieldHourlyRainIn, Attributes: attributes, Station: u.StationConfig}) wm.recorder.Record(&RecordOpts{Float64Gauge: wm.EventRainIn, FloatVal: u.EventRainIn, Field: FieldEventRainIn, Attributes: attributes, Station: u.StationConfig}) wm.recorder.Record(&RecordOpts{Float64Gauge: wm.DailyRainIn, FloatVal: u.DailyRainIn, Field: FieldDailyRainIn, Attributes: attributes, Station: u.StationConfig}) wm.recorder.Record(&RecordOpts{Float64Gauge: wm.WeeklyRainIn, FloatVal: u.WeeklyRainIn, Field: FieldWeeklyRainIn, Attributes: attributes, Station: u.StationConfig}) wm.recorder.Record(&RecordOpts{Float64Gauge: wm.MonthlyRainIn, FloatVal: u.MonthlyRainIn, Field: FieldMonthlyRainIn, Attributes: attributes, Station: u.StationConfig}) wm.recorder.Record(&RecordOpts{Float64Gauge: wm.YearlyRainIn, FloatVal: u.YearlyRainIn, Field: FieldYearlyRainIn, Attributes: attributes, Station: u.StationConfig}) wm.recorder.Record(&RecordOpts{Float64Gauge: wm.TotalRainIn, FloatVal: u.TotalRainIn, Field: FieldTotalRainIn, Attributes: attributes, Station: u.StationConfig}) wm.recorder.Record(&RecordOpts{Float64Gauge: wm.BaromRelativeIn, FloatVal: u.BaromRelativeIn, Field: FieldBaromRelativeIn, Attributes: attributes, Station: u.StationConfig}) wm.recorder.Record(&RecordOpts{Float64Gauge: wm.BaromAbsoluteIn, FloatVal: u.BaromAbsoluteIn, Field: FieldBaromAbsoluteIn, Attributes: attributes, Station: u.StationConfig}) wm.recorder.Record(&RecordOpts{Float64Gauge: wm.DewPointF, FloatVal: u.DewPointF, Field: FieldDewPointF, Attributes: attributes, Station: u.StationConfig}) wm.recorder.Record(&RecordOpts{Float64Gauge: wm.WindChillF, FloatVal: u.WindChillF, Field: FieldWindChillF, Attributes: attributes, Station: u.StationConfig}) wm.RecordBatteries(u, attributes) wm.RecordTempHumiditySensors(u, attributes) wm.UpdatesReceived.Add(wm.appCtx, 1) } func (wm *WeatherMetrics) RecordBatteries(u *WeatherUpdate, attr []attribute.KeyValue) { for _, battery := range u.Batteries { batAttr := attr batAttr = append(batAttr, attribute.String("component", battery.Component)) wm.recorder.Record(&RecordOpts{ Int64Gauge: wm.BatteryStatus, IntVal: battery.Status, Field: FieldBatteries, Attributes: batAttr, Station: u.StationConfig, }) } } func (wm *WeatherMetrics) RecordTempHumiditySensors(u *WeatherUpdate, attr []attribute.KeyValue) { if u == nil || u.TempHumiditySensors == nil { return } for _, sensor := range u.TempHumiditySensors { sensorAttr := attr sensorAttr = append(sensorAttr, attribute.String("sensorName", sensor.Name)) wm.recorder.Record(&RecordOpts{ Float64Gauge: wm.SensorTempF, FloatVal: sensor.TempF, Field: FieldSensorTempF, Attributes: sensorAttr, Station: u.StationConfig, }) wm.recorder.Record(&RecordOpts{ Int64Gauge: wm.SensorHumidity, IntVal: sensor.Humidity, Field: FieldSensorHumidity, Attributes: sensorAttr, Station: u.StationConfig, }) } } func (wm *WeatherMetrics) GetAttributes(u *WeatherUpdate) []attribute.KeyValue { attributes := []attribute.KeyValue{ semconv.ServiceVersion(wm.cfg.Version), semconv.ServiceName(wm.cfg.Name), semconv.DeploymentEnvironment(wm.cfg.Environment), } if u.StationType != nil { attributes = append(attributes, attribute.String("station_type", *u.StationType)) } if u.StationConfig != nil { if u.StationConfig.Name != "" { attributes = append(attributes, attribute.String("station_name", u.StationConfig.Name)) } if u.StationConfig.Equipment != "" { attributes = append(attributes, attribute.String("station_equipment", u.StationConfig.Equipment)) } } return attributes }