Skip to content

Commit 5dffbc3

Browse files
committed
Send metrics to cloudwatch
1 parent e513ab2 commit 5dffbc3

File tree

7 files changed

+237
-74
lines changed

7 files changed

+237
-74
lines changed

Diff for: archives/archives.go

+87
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ import (
1414
"path/filepath"
1515
"time"
1616

17+
"github.com/aws/aws-sdk-go-v2/aws"
18+
"github.com/aws/aws-sdk-go-v2/service/cloudwatch/types"
1719
"github.com/jmoiron/sqlx"
1820
"github.com/lib/pq"
1921
"github.com/nyaruka/gocommon/analytics"
@@ -966,6 +968,91 @@ func ArchiveActiveOrgs(rt *runtime.Runtime) error {
966968
timeTaken := dates.Now().Sub(start)
967969
slog.Info("archiving of active orgs complete", "time_taken", timeTaken, "num_orgs", len(orgs))
968970

971+
dims := []types.Dimension{
972+
{Name: aws.String("App"), Value: aws.String("archiver")},
973+
}
974+
975+
metrics := []types.MetricDatum{
976+
{
977+
MetricName: aws.String("ArchiveElapsed"),
978+
Dimensions: dims,
979+
Value: aws.Float64(timeTaken.Seconds()),
980+
Unit: types.StandardUnitSeconds,
981+
},
982+
{
983+
MetricName: aws.String("OrgsArchived"),
984+
Dimensions: dims,
985+
Value: aws.Float64(float64(len(orgs))),
986+
Unit: types.StandardUnitCount,
987+
},
988+
{
989+
MetricName: aws.String("MsgsRecordsArchived"),
990+
Dimensions: dims,
991+
Value: aws.Float64(float64(totalMsgsRecordsArchived)),
992+
Unit: types.StandardUnitCount,
993+
},
994+
{
995+
MetricName: aws.String("MsgsArchivedsCreated"),
996+
Dimensions: dims,
997+
Value: aws.Float64(float64(totalMsgsArchivesCreated)),
998+
Unit: types.StandardUnitCount,
999+
},
1000+
1001+
{
1002+
MetricName: aws.String("MsgsArchivedsFailed"),
1003+
Dimensions: dims,
1004+
Value: aws.Float64(float64(totalMsgsArchivesFailed)),
1005+
Unit: types.StandardUnitCount,
1006+
},
1007+
1008+
{
1009+
MetricName: aws.String("MsgsRollupsCreated"),
1010+
Dimensions: dims,
1011+
Value: aws.Float64(float64(totalMsgsRollupsCreated)),
1012+
Unit: types.StandardUnitCount,
1013+
},
1014+
{
1015+
MetricName: aws.String("MsgsRollupsFailed"),
1016+
Dimensions: dims,
1017+
Value: aws.Float64(float64(totalMsgsRollupsFailed)),
1018+
Unit: types.StandardUnitCount,
1019+
},
1020+
{
1021+
MetricName: aws.String("RunsRecordsArchived"),
1022+
Dimensions: dims,
1023+
Value: aws.Float64(float64(totalRunsRecordsArchived)),
1024+
Unit: types.StandardUnitCount,
1025+
},
1026+
{
1027+
MetricName: aws.String("RunsArchivedsCreated"),
1028+
Dimensions: dims,
1029+
Value: aws.Float64(float64(totalRunsArchivesCreated)),
1030+
Unit: types.StandardUnitCount,
1031+
},
1032+
{
1033+
MetricName: aws.String("RunsArchivedsFailed"),
1034+
Dimensions: dims,
1035+
Value: aws.Float64(float64(totalRunsArchivesFailed)),
1036+
Unit: types.StandardUnitCount,
1037+
},
1038+
{
1039+
MetricName: aws.String("RunsRollupsCreated"),
1040+
Dimensions: dims,
1041+
Value: aws.Float64(float64(totalRunsRollupsCreated)),
1042+
Unit: types.StandardUnitCount,
1043+
},
1044+
{
1045+
MetricName: aws.String("RunsRollupsFailed"),
1046+
Dimensions: dims,
1047+
Value: aws.Float64(float64(totalRunsRollupsFailed)),
1048+
Unit: types.StandardUnitCount,
1049+
},
1050+
}
1051+
1052+
if err = rt.CW.Send(ctx, metrics...); err != nil {
1053+
slog.Error("error putting metrics", "error", err)
1054+
}
1055+
9691056
analytics.Gauge("archiver.archive_elapsed", timeTaken.Seconds())
9701057
analytics.Gauge("archiver.orgs_archived", float64(len(orgs)))
9711058
analytics.Gauge("archiver.msgs_records_archived", float64(totalMsgsRecordsArchived))

Diff for: archives/archives_test.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"github.com/jmoiron/sqlx"
1313
_ "github.com/lib/pq"
1414
"github.com/nyaruka/gocommon/analytics"
15+
"github.com/nyaruka/gocommon/aws/cwatch"
1516
"github.com/nyaruka/gocommon/dates"
1617
"github.com/nyaruka/rp-archiver/runtime"
1718
"github.com/stretchr/testify/assert"
@@ -28,6 +29,7 @@ func setup(t *testing.T) (context.Context, *runtime.Runtime) {
2829
config.AWSSecretAccessKey = "tembatemba"
2930
config.S3Endpoint = "http://localhost:9000"
3031
config.S3Minio = true
32+
config.DeploymentID = "test"
3133

3234
testDB, err := os.ReadFile("../testdb.sql")
3335
require.NoError(t, err)
@@ -43,7 +45,10 @@ func setup(t *testing.T) (context.Context, *runtime.Runtime) {
4345

4446
slog.SetDefault(slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelDebug})))
4547

46-
return ctx, &runtime.Runtime{Config: config, DB: db, S3: s3Client}
48+
CW, err := cwatch.NewService(config.AWSAccessKeyID, config.AWSSecretAccessKey, config.AWSRegion, config.CloudwatchNamespace, config.DeploymentID)
49+
require.NoError(t, err)
50+
51+
return ctx, &runtime.Runtime{Config: config, DB: db, S3: s3Client, CW: CW}
4752
}
4853

4954
func TestGetMissingDayArchives(t *testing.T) {

Diff for: cmd/rp-archiver/main.go

+8
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
_ "github.com/lib/pq"
1414
"github.com/nyaruka/ezconf"
1515
"github.com/nyaruka/gocommon/analytics"
16+
"github.com/nyaruka/gocommon/aws/cwatch"
1617
"github.com/nyaruka/gocommon/dates"
1718
"github.com/nyaruka/rp-archiver/archives"
1819
"github.com/nyaruka/rp-archiver/runtime"
@@ -126,6 +127,13 @@ func main() {
126127
analytics.RegisterBackend(analytics.NewLibrato(config.LibratoUsername, config.LibratoToken, config.InstanceName, time.Second, wg))
127128
}
128129

130+
rt.CW, err = cwatch.NewService(config.AWSAccessKeyID, config.AWSSecretAccessKey, config.AWSRegion, config.CloudwatchNamespace, config.DeploymentID)
131+
if err != nil {
132+
logger.Error("unable to create cloudwatch service", "error", err)
133+
} else {
134+
logger.Info("cloudwatch service ok", "state", "starting")
135+
}
136+
129137
analytics.Start()
130138

131139
if config.Once {

Diff for: go.mod

+30-25
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,56 @@
11
module github.com/nyaruka/rp-archiver
22

3-
go 1.22
3+
go 1.23
4+
5+
toolchain go1.23.1
46

57
require (
6-
github.com/aws/aws-sdk-go-v2 v1.30.4
8+
github.com/aws/aws-sdk-go-v2 v1.32.6
79
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.12
8-
github.com/aws/aws-sdk-go-v2/service/s3 v1.60.0
9-
github.com/aws/smithy-go v1.20.4
10+
github.com/aws/aws-sdk-go-v2/service/s3 v1.69.0
11+
github.com/aws/smithy-go v1.22.1
1012
github.com/getsentry/sentry-go v0.28.1
1113
github.com/jmoiron/sqlx v1.4.0
1214
github.com/lib/pq v1.10.9
1315
github.com/nyaruka/ezconf v0.3.0
14-
github.com/nyaruka/gocommon v1.58.0
16+
github.com/nyaruka/gocommon v1.60.3
1517
github.com/samber/slog-multi v1.2.0
1618
github.com/samber/slog-sentry v1.2.2
17-
github.com/stretchr/testify v1.9.0
19+
github.com/stretchr/testify v1.10.0
1820
)
1921

2022
require (
21-
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.4 // indirect
22-
github.com/aws/aws-sdk-go-v2/config v1.27.28 // indirect
23-
github.com/aws/aws-sdk-go-v2/credentials v1.17.28 // indirect
24-
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.12 // indirect
25-
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.16 // indirect
26-
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.16 // indirect
23+
github.com/aws/aws-sdk-go v1.55.5
24+
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7 // indirect
25+
github.com/aws/aws-sdk-go-v2/config v1.28.5 // indirect
26+
github.com/aws/aws-sdk-go-v2/credentials v1.17.46 // indirect
27+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.20 // indirect
28+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.25 // indirect
29+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.25 // indirect
2730
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect
28-
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.16 // indirect
29-
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 // indirect
30-
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.18 // indirect
31-
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.18 // indirect
32-
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.16 // indirect
33-
github.com/aws/aws-sdk-go-v2/service/sso v1.22.5 // indirect
34-
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.5 // indirect
35-
github.com/aws/aws-sdk-go-v2/service/sts v1.30.4 // indirect
31+
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.24 // indirect
32+
github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.43.3 // indirect
33+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 // indirect
34+
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.5 // indirect
35+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.5 // indirect
36+
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.5 // indirect
37+
github.com/aws/aws-sdk-go-v2/service/sso v1.24.6 // indirect
38+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.5 // indirect
39+
github.com/aws/aws-sdk-go-v2/service/sts v1.33.1 // indirect
3640
github.com/davecgh/go-spew v1.1.1 // indirect
3741
github.com/fatih/structs v1.1.0 // indirect
42+
github.com/jmespath/go-jmespath v0.4.0 // indirect
3843
github.com/kylelemons/godebug v1.1.0 // indirect
3944
github.com/naoina/go-stringutil v0.1.0 // indirect
4045
github.com/naoina/toml v0.1.1 // indirect
4146
github.com/nyaruka/librato v1.1.1 // indirect
4247
github.com/nyaruka/null/v2 v2.0.3 // indirect
43-
github.com/nyaruka/phonenumbers v1.4.0 // indirect
48+
github.com/nyaruka/phonenumbers v1.4.3 // indirect
4449
github.com/pmezard/go-difflib v1.0.0 // indirect
4550
github.com/samber/lo v1.46.0 // indirect
46-
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect
47-
golang.org/x/sys v0.22.0 // indirect
48-
golang.org/x/text v0.16.0 // indirect
49-
google.golang.org/protobuf v1.34.2 // indirect
51+
golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f // indirect
52+
golang.org/x/sys v0.27.0 // indirect
53+
golang.org/x/text v0.20.0 // indirect
54+
google.golang.org/protobuf v1.35.2 // indirect
5055
gopkg.in/yaml.v3 v3.0.1 // indirect
5156
)

0 commit comments

Comments
 (0)