Compare commits

..

3 Commits

Author SHA1 Message Date
82ae3e4ba4 add counter support, add lightning time
All checks were successful
Build and Publish / check-chart (push) Successful in 11s
Build and Publish / helm-release (push) Has been skipped
Build and Publish / release (push) Successful in 3m49s
2025-04-03 15:16:42 -04:00
f0bda0a3bd bump helm chart
All checks were successful
Build and Publish / check-chart (push) Successful in 14s
Build and Publish / helm-release (push) Successful in 34s
Build and Publish / release (push) Successful in 3m48s
2025-04-03 13:49:11 -04:00
1ee231fe30 Fix embedded lightning data
All checks were successful
Build and Publish / release (push) Has been skipped
Build and Publish / check-chart (push) Successful in 10s
Build and Publish / helm-release (push) Has been skipped
2025-04-03 13:48:41 -04:00
7 changed files with 40 additions and 18 deletions

View File

@ -15,13 +15,13 @@ type: application
# This is the chart version. This version number should be incremented each time you make changes
# to the chart and its templates, including the app version.
# Versions are expected to follow Semantic Versioning (https://semver.org/)
version: 0.1.9
version: 0.1.10
# This is the version number of the application being deployed. This version number should be
# incremented each time you make changes to the application. Versions are not expected to
# follow Semantic Versioning. They should reflect the version the application is using.
# It is recommended to use it with quotes.
appVersion: "v0.15.4"
appVersion: "v0.15.6"
dependencies:
- name: hull

View File

@ -52,10 +52,8 @@ var mockUpdate = &weather.WeatherUpdate{
TempHumiditySensors: []*weather.TempHumiditySensor{
{Name: "sensor1", TempF: ptr.To(99.999), Humidity: nil},
},
LightningData: &weather.LightningData{
LightningDay: ptr.To(1),
LightningDistance: ptr.To(20),
},
LightningDay: ptr.To(1),
LightningDistance: ptr.To(20),
}
func TestUpdateToPbUpdate(t *testing.T) {

View File

@ -143,11 +143,9 @@ func MapAwnUpdate(awnUpdate *AmbientWeatherUpdate) *weather.WeatherUpdate {
{Name: THSensor + "7", TempF: awnUpdate.Temp7F, Humidity: awnUpdate.Humidity7},
{Name: THSensor + "8", TempF: awnUpdate.Temp8F, Humidity: awnUpdate.Humidity8},
},
LightningData: &weather.LightningData{
LightningDay: awnUpdate.LightningDay,
LightningDistance: awnUpdate.LightningDistance,
LightningTime: awnUpdate.LightningTime,
},
LightningDay: awnUpdate.LightningDay,
LightningDistance: awnUpdate.LightningDistance,
LightningTime: awnUpdate.LightningTime,
}
}

View File

@ -40,6 +40,7 @@ type WeatherMetrics struct {
// Lightning Sensor
LightningCountDay metric.Int64Gauge
LightningLastDistance metric.Int64Gauge
LightningLastTime metric.Int64Gauge
// Temp and Humidity Sensors
SensorTempF metric.Float64Gauge
@ -79,9 +80,9 @@ func (wm *WeatherMetrics) Update(u *WeatherUpdate) {
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})
lightningAttributes := append(attributes, attribute.String("unit", "km"))
wm.recorder.Record(&RecordOpts{Int64Gauge: wm.LightningLastDistance, IntVal: u.LightningDistance, Field: FieldLightningDistance, Attributes: lightningAttributes, Station: u.StationConfig})
wm.recorder.Record(&RecordOpts{Int64Gauge: wm.LightningLastDistance, IntVal: u.LightningDistance, Field: FieldLightningDistance, Attributes: attributes, Station: u.StationConfig})
wm.recorder.Record(&RecordOpts{Int64Gauge: wm.LightningCountDay, IntVal: u.LightningDay, Field: FieldLightningDay, Attributes: attributes, Station: u.StationConfig})
wm.recorder.Record(&RecordOpts{Int64Gauge: wm.LightningLastTime, IntVal: u.LightningTime, Field: FieldLightningLastTime, Attributes: attributes, Station: u.StationConfig})
wm.RecordBatteries(u, attributes)
wm.RecordTempHumiditySensors(u, attributes)

View File

@ -70,7 +70,11 @@ func MustInitMetrics(appCtx context.Context) *WeatherMetrics {
wm.LightningCountDay, _ = wm.meter.Int64Gauge(MetricPrefix+"_lightning_day",
metric.WithDescription("Count of lightning strikes for current day"))
wm.LightningLastDistance, _ = wm.meter.Int64Gauge(MetricPrefix+"_lightning_last_distance",
metric.WithDescription("Last measured lightning distance"))
metric.WithDescription("Last measured lightning distance"),
metric.WithUnit("kph"))
wm.LightningLastTime, _ = wm.meter.Int64Gauge(MetricPrefix+"_lightning_last_time",
metric.WithDescription("Last lightning time (epoch)"),
metric.WithUnit("s"))
// Temp and Humidity Sensors
wm.SensorTempF, _ = wm.meter.Float64Gauge(MetricPrefix+"_sensor_temp_f",

View File

@ -20,6 +20,7 @@ type MetricRecorder struct {
type RecordOpts struct {
Float64Gauge metric.Float64Gauge
Int64Gauge metric.Int64Gauge
Int64Counter metric.Int64Counter
IntVal *int
FloatVal *float64
Attributes []attribute.KeyValue
@ -59,6 +60,16 @@ func (r *MetricRecorder) Record(opts *RecordOpts) {
return
}
r.recordFloat(opts.Float64Gauge, *opts.FloatVal, opts.Attributes...)
} else if opts.Int64Counter != nil {
if opts.IntVal == nil {
log := r.l.Trace().Str("field", string(opts.Field))
if opts.Station != nil {
log = log.Str("station", opts.Station.Name)
}
log.Msg("Dropping nil float metric")
return
}
r.recordCounter(opts.Int64Counter, *opts.IntVal, opts.Attributes...)
}
}
@ -71,6 +82,19 @@ func (o *RecordOpts) keep() bool {
return !slices.Contains(o.Station.DropMetrics, o.Field)
}
func (r *MetricRecorder) recordCounter(
m metric.Int64Counter, value int, attributes ...attribute.KeyValue,
) {
// Prepare metric attributes
options := make([]metric.AddOption, 0, len(attributes))
if len(attributes) > 0 {
options = append(options, metric.WithAttributes(attributes...))
}
val := int64(value)
m.Add(r.ctx, val, options...)
}
func (r *MetricRecorder) recordInt(
m metric.Int64Gauge, value int, attributes ...attribute.KeyValue,
) {

View File

@ -41,10 +41,6 @@ type WeatherUpdate struct {
// Extra Temp+Humidity Sensors
TempHumiditySensors []*TempHumiditySensor `json:"tempHumiditySensors,omitempty"`
// Lightning Data
*LightningData
}
type LightningData struct {
LightningDay *int `json:"lightningDay,omitempty"` // Count of detections
LightningDistance *int `json:"lightningDistance,omitempty"` // Last detection distance [kilometers]
LightningTime *int `json:"lightningTime,omitempty"` // Last detection time
@ -94,6 +90,7 @@ const (
FieldSensorHumidity = "SensorHumidity"
FieldLightningDay = "LightningDay"
FieldLightningDistance = "LightningDistance"
FieldLightningLastTime = "LightningLastTime"
)
func (u *WeatherUpdate) GetStationName() string {