From d28730164bd3fa19b07a1622ee24ecb892bdb56b Mon Sep 17 00:00:00 2001 From: Ruslan Mustaev Date: Fri, 20 Dec 2024 10:42:33 +1300 Subject: [PATCH] Add auto-discovery for Directory Services(MicrosoftAD) Signed-off-by: Ruslan Mustaev --- README.md | 1 + examples/ds.yml | 19 +++++ pkg/config/services.go | 10 +++ .../associator_directoryservice_test.go | 73 +++++++++++++++++++ 4 files changed, 103 insertions(+) create mode 100644 examples/ds.yml create mode 100644 pkg/job/maxdimassociator/associator_directoryservice_test.go diff --git a/README.md b/README.md index d715fbabd..d58bb2e89 100644 --- a/README.md +++ b/README.md @@ -68,6 +68,7 @@ Only the latest version gets security updates. We won't support older versions. * `AWS/Cognito` - Cognito * `AWS/DataSync` - DataSync * `AWS/DDoSProtection` - Distributed Denial of Service (DDoS) protection service + * `AWS/DirectoryService` - Directory Services (MicrosoftAD) * `AWS/DMS` - Database Migration Service * `AWS/DocDB` - DocumentDB (with MongoDB compatibility) * `AWS/DX` - Direct Connect diff --git a/examples/ds.yml b/examples/ds.yml new file mode 100644 index 000000000..e68495558 --- /dev/null +++ b/examples/ds.yml @@ -0,0 +1,19 @@ +apiVersion: v1alpha1 +discovery: + jobs: + - type: AWS/DirectoryService + regions: + - us-east-1 + period: 300 + length: 300 + metrics: + - name: "Bytes Sent/sec" + statistics: [Average] + - name: "% Processor Time" + statistics: [Average] + - name: "DS Directory Searches/Sec" + statistics: [Average] + - name: "Database Cache % Hit" + statistics: [Average] + - name: "% Free Space" + statistics: [Sum] diff --git a/pkg/config/services.go b/pkg/config/services.go index 3361e72fe..28e51c9bd 100644 --- a/pkg/config/services.go +++ b/pkg/config/services.go @@ -255,6 +255,16 @@ var SupportedServices = serviceConfigs{ regexp.MustCompile(":agent/(?P[^/]+)"), }, }, + { + Namespace: "AWS/DirectoryService", + Alias: "ds", + ResourceFilters: []*string{ + aws.String("ds:directory"), + }, + DimensionRegexps: []*regexp.Regexp{ + regexp.MustCompile(":directory/(?P[^/]+)"), + }, + }, { Namespace: "AWS/DMS", Alias: "dms", diff --git a/pkg/job/maxdimassociator/associator_directoryservice_test.go b/pkg/job/maxdimassociator/associator_directoryservice_test.go new file mode 100644 index 000000000..4f7975483 --- /dev/null +++ b/pkg/job/maxdimassociator/associator_directoryservice_test.go @@ -0,0 +1,73 @@ +// Copyright 2024 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +package maxdimassociator + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/prometheus-community/yet-another-cloudwatch-exporter/pkg/config" + "github.com/prometheus-community/yet-another-cloudwatch-exporter/pkg/logging" + "github.com/prometheus-community/yet-another-cloudwatch-exporter/pkg/model" +) + +var directory = &model.TaggedResource{ + ARN: "arn:aws:ds::012345678901:directory/d-abc123", + Namespace: "AWS/DirectoryService", +} + +func TestAssociatorDirectoryService(t *testing.T) { + type args struct { + dimensionRegexps []model.DimensionsRegexp + resources []*model.TaggedResource + metric *model.Metric + } + + type testCase struct { + name string + args args + expectedSkip bool + expectedResource *model.TaggedResource + } + + testcases := []testCase{ + { + name: "should match directory id with Directory ID dimension", + args: args{ + dimensionRegexps: config.SupportedServices.GetService("AWS/DirectoryService").ToModelDimensionsRegexp(), + resources: []*model.TaggedResource{directory}, + metric: &model.Metric{ + MetricName: "Current Bandwidth", + Namespace: "AWS/DirectoryService", + Dimensions: []model.Dimension{ + {Name: "Metric Category", Value: "NTDS"}, + {Name: "Domain Controller IP", Value: "123.123.123.123"}, + {Name: "Directory ID", Value: "d-abc123"}, + }, + }, + }, + expectedSkip: false, + expectedResource: directory, + }, + } + + for _, tc := range testcases { + t.Run(tc.name, func(t *testing.T) { + associator := NewAssociator(logging.NewNopLogger(), tc.args.dimensionRegexps, tc.args.resources) + res, skip := associator.AssociateMetricToResource(tc.args.metric) + require.Equal(t, tc.expectedSkip, skip) + require.Equal(t, tc.expectedResource, res) + }) + } +}