Skip to content

Commit

Permalink
Merge pull request #279 from gibertoni/add_event_to_statsd_interface
Browse files Browse the repository at this point in the history
Add SimpleEvent() method to Reporter interface
  • Loading branch information
reinaldooli committed Sep 2, 2022
2 parents b9563a6 + 4118222 commit b12ce00
Show file tree
Hide file tree
Showing 7 changed files with 340 additions and 63 deletions.
50 changes: 35 additions & 15 deletions metrics/mocks/reporter.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

42 changes: 31 additions & 11 deletions metrics/mocks/statsd_reporter.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions metrics/prometheus_reporter.go
Original file line number Diff line number Diff line change
Expand Up @@ -344,6 +344,11 @@ func (p *PrometheusReporter) ReportGauge(metric string, labels map[string]string
return constants.ErrMetricNotKnown
}

// ReportEvent is not implemented by PrometheusReporter
func (p *PrometheusReporter) ReportEvent(title string, text string) error {
return constants.ErrNotImplemented
}

// ensureLabels checks if labels contains the additionalLabels values,
// otherwise adds them with the default values
func (p *PrometheusReporter) ensureLabels(labels map[string]string) map[string]string {
Expand Down
176 changes: 176 additions & 0 deletions metrics/prometheus_reporter_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,176 @@
package metrics

import (
"github.com/golang/mock/gomock"
"github.com/stretchr/testify/assert"
"github.com/topfreegames/pitaya/config"
"github.com/topfreegames/pitaya/constants"
"testing"
)

func TestGetPrometheusReporter(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()

cfg := config.NewConfig()
label := "constLabel"
labelValue := "value"

prometheus, err := GetPrometheusReporter("svType", cfg, map[string]string{label: labelValue})
assert.NoError(t, err)
assert.Equal(t, "svType", prometheus.serverType)
assert.Equal(t, 1, len(prometheus.countReportersMap))
assert.Equal(t, 2, len(prometheus.summaryReportersMap))
assert.Equal(t, 10, len(prometheus.gaugeReportersMap))
}

func TestPrometheusReportSummary(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()

cfg := config.NewConfig()
value := 1.0
responseTimeLabels := map[string]string{"route": "myRoute", "status": "myStatus", "type": "myType", "code": "200"}
processDelayLabels := map[string]string{"route": "myRoute", "type": "myType"}

prometheus, _ := GetPrometheusReporter("svType", cfg, map[string]string{})

err := prometheus.ReportSummary(ResponseTime, responseTimeLabels, value)
assert.Nil(t, err)
err = prometheus.ReportSummary(ProcessDelay, processDelayLabels, value)
assert.Nil(t, err)
}

func TestPrometheusReportSummaryError(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()

cfg := config.NewConfig()
metric := "unknownMetric"
value := 1.0

prometheus, err := GetPrometheusReporter("svType", cfg, map[string]string{})
prometheus.ReportSummary(metric, map[string]string{}, value)
assert.Error(t, constants.ErrMetricNotKnown, err)
}

func TestPrometheusReportCount(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()

cfg := config.NewConfig()
value := 1.0

prometheus, _ := GetPrometheusReporter("svType", cfg, map[string]string{})
err := prometheus.ReportCount(ExceededRateLimiting, map[string]string{}, value)
assert.Nil(t, err)
}

func TestPrometheusReportCountError(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()

cfg := config.NewConfig()
metric := "unknownMetric"
value := 1.0

prometheus, err := GetPrometheusReporter("svType", cfg, map[string]string{})
prometheus.ReportCount(metric, map[string]string{}, value)
assert.Error(t, constants.ErrMetricNotKnown, err)
}

func TestPrometheusReportGauge(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()

cfg := config.NewConfig()
value := 1.0
emptyLabels := map[string]string{}

prometheus, _ := GetPrometheusReporter("svType", cfg, map[string]string{})

err := prometheus.ReportGauge(ConnectedClients, emptyLabels, value)
assert.Nil(t, err)
err = prometheus.ReportGauge(CountServers, map[string]string{"type": "label"}, value)
assert.Nil(t, err)
err = prometheus.ReportGauge(ChannelCapacity, map[string]string{"channel": "label"}, value)
assert.Nil(t, err)
err = prometheus.ReportGauge(DroppedMessages, emptyLabels, value)
assert.Nil(t, err)
err = prometheus.ReportGauge(Goroutines, emptyLabels, value)
assert.Nil(t, err)
err = prometheus.ReportGauge(HeapSize, emptyLabels, value)
assert.Nil(t, err)
err = prometheus.ReportGauge(HeapObjects, emptyLabels, value)
assert.Nil(t, err)
err = prometheus.ReportGauge(WorkerJobsRetry, emptyLabels, value)
assert.Nil(t, err)
err = prometheus.ReportGauge(WorkerQueueSize, map[string]string{"queue": "label"}, value)
assert.Nil(t, err)
err = prometheus.ReportGauge(WorkerJobsTotal, map[string]string{"status": "label"}, value)
assert.Nil(t, err)
}

func TestPrometheusReportGaugeError(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()

cfg := config.NewConfig()
metric := "unknownMetric"
value := 1.0

prometheus, err := GetPrometheusReporter("svType", cfg, map[string]string{})
prometheus.ReportGauge(metric, map[string]string{}, value)
assert.Error(t, constants.ErrMetricNotKnown, err)
}

func TestPrometheusReportEventError(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()

cfg := config.NewConfig()

prometheus, err := GetPrometheusReporter("svType", cfg, map[string]string{})
prometheus.ReportEvent("eventTitle", "eventDescription")
assert.Error(t, constants.ErrNotImplemented, err)
}

func TestPrometheusGetMetricWithLabel(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()

cfg := config.NewConfig()
value := 1.0
responseTimeLabels := map[string]string{"route": "myRoute", "status": "myStatus", "type": "myType", "code": "200"}
processDelayLabels := map[string]string{"route": "myRoute", "type": "myType"}

prometheus, _ := GetPrometheusReporter("svType", cfg, map[string]string{})

prometheus.ReportSummary(ResponseTime, responseTimeLabels, value)
prometheus.ReportSummary(ProcessDelay, processDelayLabels, value)

obs, err := prometheus.summaryReportersMap[ResponseTime].GetMetricWith(responseTimeLabels)
assert.NotNil(t, obs)
assert.Nil(t, err)

obs, err = prometheus.summaryReportersMap[ProcessDelay].GetMetricWith(processDelayLabels)
assert.NotNil(t, obs)
assert.Nil(t, err)
}

func TestPrometheusGetMetricWithInvalidLabel(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()

cfg := config.NewConfig()
value := 1.0
processDelayLabels := map[string]string{"route": "myRoute", "type": "myType"}
invalidLabels := map[string]string{"customLabel": "value"}

prometheus, _ := GetPrometheusReporter("svType", cfg, map[string]string{})
prometheus.ReportSummary(ProcessDelay, processDelayLabels, value)

obs, err := prometheus.summaryReportersMap[ProcessDelay].GetMetricWith(invalidLabels)
assert.Nil(t, obs)
assert.NotNil(t, err)
}
1 change: 1 addition & 0 deletions metrics/reporter_interfaces.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,5 @@ type Reporter interface {
ReportCount(metric string, tags map[string]string, count float64) error
ReportSummary(metric string, tags map[string]string, value float64) error
ReportGauge(metric string, tags map[string]string, value float64) error
ReportEvent(title string, text string) error
}
Loading

0 comments on commit b12ce00

Please sign in to comment.