diff --git a/docs/LICENSE_OF_DEPENDENCIES.md b/docs/LICENSE_OF_DEPENDENCIES.md index 0a5958176..10408901d 100644 --- a/docs/LICENSE_OF_DEPENDENCIES.md +++ b/docs/LICENSE_OF_DEPENDENCIES.md @@ -12,7 +12,10 @@ following works: - github.com/Azure/azure-pipeline-go [MIT License](https://github.com/Azure/azure-pipeline-go/blob/master/LICENSE) - github.com/Azure/azure-sdk-for-go [MIT License](https://github.com/Azure/azure-sdk-for-go/blob/main/LICENSE.txt) - github.com/Azure/azure-sdk-for-go/sdk/azcore [MIT License](https://github.com/Azure/azure-sdk-for-go/blob/main/sdk/azcore/LICENSE.txt) +- github.com/Azure/azure-sdk-for-go/sdk/azidentity [MIT License](https://github.com/Azure/azure-sdk-for-go/blob/main/sdk/azidentity/LICENSE.txt) - github.com/Azure/azure-sdk-for-go/sdk/internal [MIT License](https://github.com/Azure/azure-sdk-for-go/blob/main/sdk/internal/LICENSE.txt) +- github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/monitor/armmonitor [MIT License](https://github.com/Azure/azure-sdk-for-go/blob/main/sdk/resourcemanager/monitor/armmonitor/LICENSE.txt) +- github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources [MIT License](https://github.com/Azure/azure-sdk-for-go/blob/main/sdk/resourcemanager/resources/armresources/LICENSE.txt) - github.com/Azure/azure-sdk-for-go/sdk/storage/azblob [MIT License](https://github.com/Azure/azure-sdk-for-go/blob/main/sdk/storage/azblob/LICENSE.txt) - github.com/Azure/azure-storage-blob-go [MIT License](https://github.com/Azure/azure-storage-blob-go/blob/master/LICENSE) - github.com/Azure/azure-storage-queue-go [MIT License](https://github.com/Azure/azure-storage-queue-go/blob/master/LICENSE) @@ -20,6 +23,7 @@ following works: - github.com/Azure/go-ansiterm [MIT License](https://github.com/Azure/go-ansiterm/blob/master/LICENSE) - github.com/Azure/go-autorest [Apache License 2.0](https://github.com/Azure/go-autorest/blob/master/LICENSE) - github.com/Azure/go-ntlmssp [MIT License](https://github.com/Azure/go-ntlmssp/blob/master/LICENSE) +- github.com/AzureAD/microsoft-authentication-library-for-go [MIT License](https://github.com/AzureAD/microsoft-authentication-library-for-go/blob/main/LICENSE) - github.com/ClickHouse/clickhouse-go [MIT License](https://github.com/ClickHouse/clickhouse-go/blob/master/LICENSE) - github.com/Masterminds/goutils [Apache License 2.0](https://github.com/Masterminds/goutils/blob/master/LICENSE.txt) - github.com/Masterminds/semver [MIT License](https://github.com/Masterminds/semver/blob/master/LICENSE.txt) @@ -201,6 +205,7 @@ following works: - github.com/kolo/xmlrpc [MIT License](https://github.com/kolo/xmlrpc/blob/master/LICENSE) - github.com/kylelemons/godebug [Apache License 2.0](https://github.com/kylelemons/godebug/blob/master/LICENSE) - github.com/leodido/ragel-machinery [MIT License](https://github.com/leodido/ragel-machinery/blob/develop/LICENSE) +- github.com/logzio/azure-monitor-metrics-receiver [MIT License](https://github.com/logzio/azure-monitor-metrics-receiver/blob/master/LICENSE) - github.com/magiconair/properties [BSD 2-Clause "Simplified" License](https://github.com/magiconair/properties/blob/main/LICENSE.md) - github.com/mailru/easyjson [MIT License](https://github.com/mailru/easyjson/blob/master/LICENSE) - github.com/mattn/go-colorable [MIT License](https://github.com/mattn/go-colorable/blob/master/LICENSE) diff --git a/go.mod b/go.mod index f0fb7759f..0dba5b87f 100644 --- a/go.mod +++ b/go.mod @@ -10,6 +10,8 @@ require ( collectd.org v0.5.0 github.com/Azure/azure-event-hubs-go/v3 v3.3.20 github.com/Azure/azure-kusto-go v0.8.0 + github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/monitor/armmonitor v0.4.1 + github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v0.3.1 github.com/Azure/azure-storage-queue-go v0.0.0-20191125232315-636801874cdd github.com/Azure/go-autorest/autorest v0.11.28 github.com/Azure/go-autorest/autorest/adal v0.9.21 @@ -109,6 +111,7 @@ require ( github.com/karrick/godirwalk v1.17.0 github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 github.com/kolo/xmlrpc v0.0.0-20201022064351-38db28db192b + github.com/logzio/azure-monitor-metrics-receiver v1.0.0 github.com/lxc/lxd v0.0.0-20220920163450-e9b4b514106a github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 github.com/mdlayher/apcupsd v0.0.0-20220319200143-473c7b5f3c6a @@ -204,7 +207,8 @@ require ( github.com/Azure/azure-pipeline-go v0.2.3 // indirect github.com/Azure/azure-sdk-for-go v65.0.0+incompatible // indirect github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1 // indirect - github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.13.2 // indirect + github.com/Azure/azure-sdk-for-go/sdk/internal v0.9.1 // indirect github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0 // indirect github.com/Azure/azure-storage-blob-go v0.15.0 // indirect github.com/Azure/go-amqp v0.17.0 // indirect @@ -217,6 +221,7 @@ require ( github.com/Azure/go-autorest/logger v0.2.1 // indirect github.com/Azure/go-autorest/tracing v0.6.0 // indirect github.com/Azure/go-ntlmssp v0.0.0-20220621081337-cb9428e4ac1e // indirect + github.com/AzureAD/microsoft-authentication-library-for-go v0.4.0 // indirect github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/semver v1.5.0 // indirect github.com/Microsoft/go-winio v0.5.2 // indirect @@ -274,6 +279,7 @@ require ( github.com/goburrow/modbus v0.1.0 // indirect github.com/goburrow/serial v0.1.1-0.20211022031912-bfb69110f8dd // indirect github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang-jwt/jwt v3.2.1+incompatible // indirect github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe // indirect github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect @@ -339,7 +345,7 @@ require ( github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect + github.com/montanaflynn/stats v0.6.6 // indirect github.com/morikuni/aec v1.0.0 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/naoina/go-stringutil v0.1.0 // indirect diff --git a/go.sum b/go.sum index 2a93ec731..7fafd830f 100644 --- a/go.sum +++ b/go.sum @@ -107,12 +107,21 @@ github.com/Azure/azure-sdk-for-go v61.2.0+incompatible/go.mod h1:9XXNKU+eRnpl9mo github.com/Azure/azure-sdk-for-go v65.0.0+incompatible h1:HzKLt3kIwMm4KeJYTdx9EbjRYTySD/t8i1Ee/W5EGXw= github.com/Azure/azure-sdk-for-go v65.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.0/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1 h1:qoVeMsc9/fh/yhxVaA0obYjVH/oI/ihrOoMwsLS9KSA= github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.13.0/go.mod h1:TmXReXZ9yPp5D5TBRMTAtyz+UyOl15Py4hL5E5p6igQ= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.13.2 h1:mM/yraAumqMMIYev6zX0oxHqX6hreUs5wXf76W47r38= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.13.2/go.mod h1:+nVKciyKD2J9TyVcEQ82Bo9b+3F92PiQfHrIE/zqLqM= github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3 h1:E+m3SkZCN0Bf5q7YdTs5lSm2CYY3CK4spn5OmUIiQtk= github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.9.1 h1:sLZ/Y+P/5RRtsXWylBjB5lkgixYfm0MQPiwrSX//JSo= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.9.1/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/monitor/armmonitor v0.4.1 h1:P6UDRqlbywdpvhpVZeiB5p+DuhMTrVD4xfvPW55bs8M= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/monitor/armmonitor v0.4.1/go.mod h1:s5NeyuuFrHc/83W6N/vmD4Zmc42WDPty3Db2+37cF/w= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v0.3.1 h1:EXTDtCSTfPauGawsG+Ae/W46B1PkrgzuKNrcFqy4ljM= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v0.3.1/go.mod h1:PoA99xQAlN13MyUjzgIPWMZEr0etHpYSuT25LmhR3zQ= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0 h1:Px2UA+2RvSSvv+RvJNuUB6n7rs5Wsel4dXLe90Um2n4= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= github.com/Azure/azure-storage-blob-go v0.15.0 h1:rXtgp8tN1p29GvpGgfJetavIG0V7OgcSXPpwp3tx6qk= @@ -175,6 +184,8 @@ github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUM github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/Azure/go-ntlmssp v0.0.0-20220621081337-cb9428e4ac1e h1:NeAW1fUYUEWhft7pkxDf6WoUvEZJ/uOKsvtpjLnn8MU= github.com/Azure/go-ntlmssp v0.0.0-20220621081337-cb9428e4ac1e/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU= +github.com/AzureAD/microsoft-authentication-library-for-go v0.4.0 h1:WVsrXCnHlDDX8ls+tootqRE87/hL9S/g4ewig9RsD/c= +github.com/AzureAD/microsoft-authentication-library-for-go v0.4.0/go.mod h1:Vt9sXTKwMyGcOxSmLDMnGPgqsUg7m8pe215qMLrDXw4= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak= @@ -1123,6 +1134,8 @@ github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A= +github.com/golang-jwt/jwt v3.2.1+incompatible h1:73Z+4BJcrTC+KczS6WvTPvRGOp1WmfEP4Q1lOd9Z/+c= +github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.4.2 h1:rcc4lwaZgFMCZ5jxF9ABolDcIHdBytAFgqFPbSJQAYs= @@ -1707,6 +1720,8 @@ github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-b github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo= github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= +github.com/logzio/azure-monitor-metrics-receiver v1.0.0 h1:TAzhIZL2ueyyc81qIw8FGg4nUbts4Hvc3oOxSobY1IA= +github.com/logzio/azure-monitor-metrics-receiver v1.0.0/go.mod h1:UIaQ7UgxZ8jO3L0JB2hctsHFBbZqL6mbxYscQAeFpl4= github.com/lucasb-eyer/go-colorful v1.0.2/go.mod h1:0MS4r+7BZKSJ5mw4/S5MPN+qHFF1fYclkSPilDOKW0s= github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= @@ -1883,8 +1898,9 @@ github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3Rllmb github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= -github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/montanaflynn/stats v0.6.6 h1:Duep6KMIDpY4Yo11iFsvyqJDyfzLF9+sndUKT+v64GQ= +github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/moricho/tparallel v0.2.1/go.mod h1:fXEIZxG2vdfl0ZF8b42f5a78EhjjD5mX8qUplsoSU4k= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= @@ -2120,6 +2136,7 @@ github.com/pion/transport v0.13.0/go.mod h1:yxm9uXpK9bpBBWkITk13cLo1y5/ur5VQpG22 github.com/pion/udp v0.1.1 h1:8UAPvyqmsxK8oOjloDk4wUt63TzFe9WEJkg5lChlj7o= github.com/pion/udp v0.1.1/go.mod h1:6AFo+CMdKQm7UiA0eUPA8/eVCTx8jBIITLZHc9DWX5M= github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= +github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= diff --git a/plugins/inputs/all/azure_monitor.go b/plugins/inputs/all/azure_monitor.go new file mode 100644 index 000000000..a52671aa4 --- /dev/null +++ b/plugins/inputs/all/azure_monitor.go @@ -0,0 +1,5 @@ +//go:build !custom || inputs || inputs.azure_monitor + +package all + +import _ "github.com/influxdata/telegraf/plugins/inputs/azure_monitor" // register plugin diff --git a/plugins/inputs/azure_monitor/README.md b/plugins/inputs/azure_monitor/README.md new file mode 100644 index 000000000..1c45b3fb3 --- /dev/null +++ b/plugins/inputs/azure_monitor/README.md @@ -0,0 +1,169 @@ +# Azure Monitor Input Plugin + +The `azure_monitor` plugin, gathers metrics of each Azure +resource using Azure Monitor API. Uses **Logz.io +azure-monitor-metrics-receiver** package - +an SDK wrapper for Azure Monitor SDK. + +## Azure Credential + +This plugin uses `client_id`, `client_secret` and `tenant_id` +for authentication (access token), and `subscription_id` +is for accessing Azure resources. + +## Property Locations + +`subscription_id` can be found under **Overview**->**Essentials** in +the Azure portal for your application/service. + +`client_id` and `client_secret` can be obtained by registering an +application under Azure Active Directory. + +`tenant_id` can be found under **Azure Active Directory**->**Properties**. + +resource target `resource_id` can be found under +**Overview**->**Essentials**->**JSON View** (link) in the Azure +portal for your application/service. + +## More Information + +To see a table of resource types and their metrics, please use this link: + +`https://docs.microsoft.com/en-us/azure/azure-monitor/ +essentials/metrics-supported` + +## Rate Limits + +Azure API read limit is 12000 requests per hour. +Please make sure the total number of metrics you are requesting is proportional +to your time interval. + +## Usage + +Use `resource_targets` to collect metrics from specific resources using +resource id. + +Use `resource_group_targets` to collect metrics from resources under the +resource group with resource type. + +Use `subscription_targets` to collect metrics from resources under the +subscription with resource type. + +## Global configuration options + +In addition to the plugin-specific configuration settings, plugins support +additional global and plugin configuration settings. These settings are used to +modify metrics, tags, and field or create aliases and configure ordering, etc. +See the [CONFIGURATION.md][CONFIGURATION.md] for more details. + +[CONFIGURATION.md]: ../../../docs/CONFIGURATION.md + +## Configuration + +```toml @sample.conf +# Gather Azure resources metrics from Azure Monitor API +[[inputs.azure_monitor]] + # can be found under Overview->Essentials in the Azure portal for your application/service + subscription_id = "<>" + # can be obtained by registering an application under Azure Active Directory + client_id = "<>" + # can be obtained by registering an application under Azure Active Directory + client_secret = "<>" + # can be found under Azure Active Directory->Properties + tenant_id = "<>" + + # resource target #1 to collect metrics from + [[inputs.azure_monitor.resource_target]] + # can be found undet Overview->Essentials->JSON View in the Azure portal for your application/service + # must start with 'resourceGroups/...' ('/subscriptions/xxxxxxxx-xxxx-xxxx-xxx-xxxxxxxxxxxx' + # must be removed from the beginning of Resource ID property value) + resource_id = "<>" + # the metric names to collect + # leave the array empty to use all metrics available to this resource + metrics = [ "<>", "<>" ] + # metrics aggregation type value to collect + # can be 'Total', 'Count', 'Average', 'Minimum', 'Maximum' + # leave the array empty to collect all aggregation types values for each metric + aggregations = [ "<>", "<>" ] + + # resource target #2 to collect metrics from + [[inputs.azure_monitor.resource_target]] + resource_id = "<>" + metrics = [ "<>", "<>" ] + aggregations = [ "<>", "<>" ] + + # resource group target #1 to collect metrics from resources under it with resource type + [[inputs.azure_monitor.resource_group_target]] + # the resource group name + resource_group = "<>" + + # defines the resources to collect metrics from + [[inputs.azure_monitor.resource_group_target.resource]] + # the resource type + resource_type = "<>" + metrics = [ "<>", "<>" ] + aggregations = [ "<>", "<>" ] + + # defines the resources to collect metrics from + [[inputs.azure_monitor.resource_group_target.resource]] + resource_type = "<>" + metrics = [ "<>", "<>" ] + aggregations = [ "<>", "<>" ] + + # resource group target #2 to collect metrics from resources under it with resource type + [[inputs.azure_monitor.resource_group_target]] + resource_group = "<>" + + [[inputs.azure_monitor.resource_group_target.resource]] + resource_type = "<>" + metrics = [ "<>", "<>" ] + aggregations = [ "<>", "<>" ] + + # subscription target #1 to collect metrics from resources under it with resource type + [[inputs.azure_monitor.subscription_target]] + resource_type = "<>" + metrics = [ "<>", "<>" ] + aggregations = [ "<>", "<>" ] + + # subscription target #2 to collect metrics from resources under it with resource type + [[inputs.azure_monitor.subscription_target]] + resource_type = "<>" + metrics = [ "<>", "<>" ] + aggregations = [ "<>", "<>" ] +``` + +## Metrics + +* azure_monitor_<>_<> + * fields: + * total (float64) + * count (float64) + * average (float64) + * minimum (float64) + * maximum (float64) + * tags: + * namespace + * resource_group + * resource_name + * subscription_id + * resource_region + * unit + +## Example Output + +```shell +> azure_monitor_microsoft_storage_storageaccounts_used_capacity,host=Azure-MBP,namespace=Microsoft.Storage/storageAccounts,resource_group=azure-rg,resource_name=azuresa,resource_region=eastus,subscription_id=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,unit=Bytes average=9065573,maximum=9065573,minimum=9065573,timeStamp="2021-11-08T09:52:00Z",total=9065573 1636368744000000000 +> azure_monitor_microsoft_storage_storageaccounts_transactions,host=Azure-MBP,namespace=Microsoft.Storage/storageAccounts,resource_group=azure-rg,resource_name=azuresa,resource_region=eastus,subscription_id=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,unit=Count average=1,count=6,maximum=1,minimum=0,timeStamp="2021-11-08T09:52:00Z",total=6 1636368744000000000 +> azure_monitor_microsoft_storage_storageaccounts_ingress,host=Azure-MBP,namespace=Microsoft.Storage/storageAccounts,resource_group=azure-rg,resource_name=azuresa,resource_region=eastus,subscription_id=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,unit=Bytes average=5822.333333333333,count=6,maximum=5833,minimum=0,timeStamp="2021-11-08T09:52:00Z",total=34934 1636368744000000000 +> azure_monitor_microsoft_storage_storageaccounts_egress,host=Azure-MBP,namespace=Microsoft.Storage/storageAccounts,resource_group=azure-rg,resource_name=azuresa,resource_region=eastus,subscription_id=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,unit=Bytes average=840.1666666666666,count=6,maximum=841,minimum=0,timeStamp="2021-11-08T09:52:00Z",total=5041 1636368744000000000 +> azure_monitor_microsoft_storage_storageaccounts_success_server_latency,host=Azure-MBP,namespace=Microsoft.Storage/storageAccounts,resource_group=azure-rg,resource_name=azuresa,resource_region=eastus,subscription_id=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,unit=MilliSeconds average=12.833333333333334,count=6,maximum=30,minimum=8,timeStamp="2021-11-08T09:52:00Z",total=77 1636368744000000000 +> azure_monitor_microsoft_storage_storageaccounts_success_e2e_latency,host=Azure-MBP,namespace=Microsoft.Storage/storageAccounts,resource_group=azure-rg,resource_name=azuresa,resource_region=eastus,subscription_id=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,unit=MilliSeconds average=12.833333333333334,count=6,maximum=30,minimum=8,timeStamp="2021-11-08T09:52:00Z",total=77 1636368744000000000 +> azure_monitor_microsoft_storage_storageaccounts_availability,host=Azure-MBP,namespace=Microsoft.Storage/storageAccounts,resource_group=azure-rg,resource_name=azuresa,resource_region=eastus,subscription_id=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,unit=Percent average=100,count=6,maximum=100,minimum=100,timeStamp="2021-11-08T09:52:00Z",total=600 1636368744000000000 +> azure_monitor_microsoft_storage_storageaccounts_used_capacity,host=Azure-MBP,namespace=Microsoft.Storage/storageAccounts,resource_group=azure-rg,resource_name=azuresa,resource_region=eastus,subscription_id=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,unit=Bytes average=9065573,maximum=9065573,minimum=9065573,timeStamp="2021-11-08T09:52:00Z",total=9065573 1636368745000000000 +> azure_monitor_microsoft_storage_storageaccounts_transactions,host=Azure-MBP,namespace=Microsoft.Storage/storageAccounts,resource_group=azure-rg,resource_name=azuresa,resource_region=eastus,subscription_id=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,unit=Count average=1,count=6,maximum=1,minimum=0,timeStamp="2021-11-08T09:52:00Z",total=6 1636368745000000000 +> azure_monitor_microsoft_storage_storageaccounts_ingress,host=Azure-MBP,namespace=Microsoft.Storage/storageAccounts,resource_group=azure-rg,resource_name=azuresa,resource_region=eastus,subscription_id=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,unit=Bytes average=5822.333333333333,count=6,maximum=5833,minimum=0,timeStamp="2021-11-08T09:52:00Z",total=34934 1636368745000000000 +> azure_monitor_microsoft_storage_storageaccounts_egress,host=Azure-MBP,namespace=Microsoft.Storage/storageAccounts,resource_group=azure-rg,resource_name=azuresa,resource_region=eastus,subscription_id=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,unit=Bytes average=840.1666666666666,count=6,maximum=841,minimum=0,timeStamp="2021-11-08T09:52:00Z",total=5041 1636368745000000000 +> azure_monitor_microsoft_storage_storageaccounts_success_server_latency,host=Azure-MBP,namespace=Microsoft.Storage/storageAccounts,resource_group=azure-rg,resource_name=azuresa,resource_region=eastus,subscription_id=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,unit=MilliSeconds average=12.833333333333334,count=6,maximum=30,minimum=8,timeStamp="2021-11-08T09:52:00Z",total=77 1636368745000000000 +> azure_monitor_microsoft_storage_storageaccounts_success_e2e_latency,host=Azure-MBP,namespace=Microsoft.Storage/storageAccounts,resource_group=azure-rg,resource_name=azuresa,resource_region=eastus,subscription_id=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,unit=MilliSeconds average=12.833333333333334,count=6,maximum=30,minimum=8,timeStamp="2021-11-08T09:52:00Z",total=77 1636368745000000000 +> azure_monitor_microsoft_storage_storageaccounts_availability,host=Azure-MBP,namespace=Microsoft.Storage/storageAccounts,resource_group=azure-rg,resource_name=azuresa,resource_region=eastus,subscription_id=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,unit=Percent average=100,count=6,maximum=100,minimum=100,timeStamp="2021-11-08T09:52:00Z",total=600 1636368745000000000 +``` diff --git a/plugins/inputs/azure_monitor/azure_monitor.go b/plugins/inputs/azure_monitor/azure_monitor.go new file mode 100644 index 000000000..cbd5e8ce7 --- /dev/null +++ b/plugins/inputs/azure_monitor/azure_monitor.go @@ -0,0 +1,176 @@ +//go:generate ../../../tools/readme_config_includer/generator +package azure_monitor + +import ( + _ "embed" + "fmt" + "sync" + + "github.com/influxdata/telegraf" + "github.com/influxdata/telegraf/plugins/inputs" + receiver "github.com/logzio/azure-monitor-metrics-receiver" +) + +type AzureMonitor struct { + SubscriptionID string `toml:"subscription_id"` + ClientID string `toml:"client_id"` + ClientSecret string `toml:"client_secret"` + TenantID string `toml:"tenant_id"` + ResourceTargets []*ResourceTarget `toml:"resource_target"` + ResourceGroupTargets []*ResourceGroupTarget `toml:"resource_group_target"` + SubscriptionTargets []*Resource `toml:"subscription_target"` + Log telegraf.Logger `toml:"-"` + + receiver *receiver.AzureMonitorMetricsReceiver + azureManager azureClientsCreator + azureClients *receiver.AzureClients +} + +type ResourceTarget struct { + ResourceID string `toml:"resource_id"` + Metrics []string `toml:"metrics"` + Aggregations []string `toml:"aggregations"` +} + +type ResourceGroupTarget struct { + ResourceGroup string `toml:"resource_group"` + Resources []*Resource `toml:"resource"` +} + +type Resource struct { + ResourceType string `toml:"resource_type"` + Metrics []string `toml:"metrics"` + Aggregations []string `toml:"aggregations"` +} + +type azureClientsManager struct{} + +type azureClientsCreator interface { + createAzureClients(subscriptionID string, clientID string, clientSecret string, tenantID string) (*receiver.AzureClients, error) +} + +//go:embed sample.conf +var sampleConfig string + +func (am *AzureMonitor) SampleConfig() string { + return sampleConfig +} + +// Init is for setup, and validating config. +func (am *AzureMonitor) Init() error { + var err error + am.azureClients, err = am.azureManager.createAzureClients(am.SubscriptionID, am.ClientID, am.ClientSecret, am.TenantID) + if err != nil { + return err + } + + if err = am.setReceiver(); err != nil { + return fmt.Errorf("error setting Azure Monitor receiver: %w", err) + } + + if err = am.receiver.CreateResourceTargetsFromResourceGroupTargets(); err != nil { + return fmt.Errorf("error creating resource targets from resource group targets: %w", err) + } + + if err = am.receiver.CreateResourceTargetsFromSubscriptionTargets(); err != nil { + return fmt.Errorf("error creating resource targets from subscription targets: %w", err) + } + + if err = am.receiver.CheckResourceTargetsMetricsValidation(); err != nil { + return fmt.Errorf("error checking resource targets metrics validation: %w", err) + } + + if err = am.receiver.SetResourceTargetsMetrics(); err != nil { + return fmt.Errorf("error setting resource targets metrics: %w", err) + } + + if err = am.receiver.SplitResourceTargetsMetricsByMinTimeGrain(); err != nil { + return fmt.Errorf("error spliting resource targets metrics by min time grain: %w", err) + } + + am.receiver.SplitResourceTargetsWithMoreThanMaxMetrics() + am.receiver.SetResourceTargetsAggregations() + + am.Log.Debug("Total resource targets: ", len(am.receiver.Targets.ResourceTargets)) + + return nil +} + +func (am *AzureMonitor) Gather(acc telegraf.Accumulator) error { + var waitGroup sync.WaitGroup + + for _, target := range am.receiver.Targets.ResourceTargets { + am.Log.Debug("Collecting metrics for resource target ", target.ResourceID) + waitGroup.Add(1) + + go func(target *receiver.ResourceTarget) { + defer waitGroup.Done() + + collectedMetrics, notCollectedMetrics, err := am.receiver.CollectResourceTargetMetrics(target) + if err != nil { + acc.AddError(err) + } + + for _, collectedMetric := range collectedMetrics { + acc.AddFields(collectedMetric.Name, collectedMetric.Fields, collectedMetric.Tags) + } + + for _, notCollectedMetric := range notCollectedMetrics { + am.Log.Info("Did not get any metric value from Azure Monitor API for the metric ID ", notCollectedMetric) + } + }(target) + } + + waitGroup.Wait() + return nil +} + +func (am *AzureMonitor) setReceiver() error { + var resourceTargets []*receiver.ResourceTarget + var resourceGroupTargets []*receiver.ResourceGroupTarget + var subscriptionTargets []*receiver.Resource + + for _, target := range am.ResourceTargets { + resourceTargets = append(resourceTargets, receiver.NewResourceTarget(target.ResourceID, target.Metrics, target.Aggregations)) + } + + for _, target := range am.ResourceGroupTargets { + var resources []*receiver.Resource + for _, resource := range target.Resources { + resources = append(resources, receiver.NewResource(resource.ResourceType, resource.Metrics, resource.Aggregations)) + } + + resourceGroupTargets = append(resourceGroupTargets, receiver.NewResourceGroupTarget(target.ResourceGroup, resources)) + } + + for _, target := range am.SubscriptionTargets { + subscriptionTargets = append(subscriptionTargets, receiver.NewResource(target.ResourceType, target.Metrics, target.Aggregations)) + } + + targets := receiver.NewTargets(resourceTargets, resourceGroupTargets, subscriptionTargets) + var err error + am.receiver, err = receiver.NewAzureMonitorMetricsReceiver(am.SubscriptionID, am.ClientID, am.ClientSecret, am.TenantID, targets, am.azureClients) + return err +} + +func (acm *azureClientsManager) createAzureClients( + subscriptionID string, + clientID string, + clientSecret string, + tenantID string, +) (*receiver.AzureClients, error) { + azureClients, err := receiver.CreateAzureClients(subscriptionID, clientID, clientSecret, tenantID) + if err != nil { + return nil, fmt.Errorf("error creating Azure clients: %w", err) + } + + return azureClients, nil +} + +func init() { + inputs.Add("azure_monitor", func() telegraf.Input { + return &AzureMonitor{ + azureManager: &azureClientsManager{}, + } + }) +} diff --git a/plugins/inputs/azure_monitor/azure_monitor_test.go b/plugins/inputs/azure_monitor/azure_monitor_test.go new file mode 100644 index 000000000..104326111 --- /dev/null +++ b/plugins/inputs/azure_monitor/azure_monitor_test.go @@ -0,0 +1,1052 @@ +package azure_monitor + +import ( + "context" + "encoding/json" + "fmt" + "os" + "testing" + + "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/monitor/armmonitor" + "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources" + "github.com/influxdata/telegraf/testutil" + "github.com/influxdata/toml" + receiver "github.com/logzio/azure-monitor-metrics-receiver" + "github.com/stretchr/testify/require" +) + +type mockAzureClientsManager struct{} + +type mockAzureResourcesClient struct{} + +type mockAzureMetricDefinitionsClient struct{} + +type mockAzureMetricsClient struct{} + +func (mam *mockAzureClientsManager) createAzureClients(_ string, _ string, _ string, _ string) (*receiver.AzureClients, error) { + return &receiver.AzureClients{ + Ctx: context.Background(), + ResourcesClient: &mockAzureResourcesClient{}, + MetricDefinitionsClient: &mockAzureMetricDefinitionsClient{}, + MetricsClient: &mockAzureMetricsClient{}, + }, nil +} + +func (marc *mockAzureResourcesClient) List(_ context.Context, _ *armresources.ClientListOptions) ([]*armresources.ClientListResponse, error) { + var responses []*armresources.ClientListResponse + + file, err := os.ReadFile("testdata/json/azure_resources_response.json") + if err != nil { + return nil, fmt.Errorf("error reading file: %w", err) + } + + var genericResourcesExpanded []*armresources.GenericResourceExpanded + if err = json.Unmarshal(file, &genericResourcesExpanded); err != nil { + return nil, err + } + + response := &armresources.ClientListResponse{ + ClientListResult: armresources.ClientListResult{ + ResourceListResult: armresources.ResourceListResult{ + Value: genericResourcesExpanded, + }, + }, + } + + responses = append(responses, response) + return responses, nil +} + +func (marc *mockAzureResourcesClient) ListByResourceGroup( + _ context.Context, + resourceGroup string, + _ *armresources.ClientListByResourceGroupOptions) ([]*armresources.ClientListByResourceGroupResponse, error) { + var responses []*armresources.ClientListByResourceGroupResponse + + file, err := os.ReadFile("testdata/json/azure_resources_response.json") + if err != nil { + return nil, fmt.Errorf("error reading file: %w", err) + } + + var genericResourcesExpanded []*armresources.GenericResourceExpanded + if err = json.Unmarshal(file, &genericResourcesExpanded); err != nil { + return nil, err + } + + if resourceGroup == "resourceGroup1" { + response := &armresources.ClientListByResourceGroupResponse{ + ClientListByResourceGroupResult: armresources.ClientListByResourceGroupResult{ + ResourceListResult: armresources.ResourceListResult{ + Value: []*armresources.GenericResourceExpanded{ + genericResourcesExpanded[0], + genericResourcesExpanded[1], + }, + }, + }, + } + + responses = append(responses, response) + return responses, nil + } + + if resourceGroup == "resourceGroup2" { + response := &armresources.ClientListByResourceGroupResponse{ + ClientListByResourceGroupResult: armresources.ClientListByResourceGroupResult{ + ResourceListResult: armresources.ResourceListResult{ + Value: []*armresources.GenericResourceExpanded{ + genericResourcesExpanded[2], + }, + }, + }, + } + + responses = append(responses, response) + return responses, nil + } + + return nil, fmt.Errorf("resouce group was not found") +} + +func (mamdc *mockAzureMetricDefinitionsClient) List( + _ context.Context, + resourceID string, + _ *armmonitor.MetricDefinitionsClientListOptions) (armmonitor.MetricDefinitionsClientListResponse, error) { + file, err := os.ReadFile("testdata/json/azure_metric_definitions_responses.json") + if err != nil { + return armmonitor.MetricDefinitionsClientListResponse{}, fmt.Errorf("error reading file: %w", err) + } + + var metricDefinitions [][]*armmonitor.MetricDefinition + if err = json.Unmarshal(file, &metricDefinitions); err != nil { + return armmonitor.MetricDefinitionsClientListResponse{}, err + } + + if resourceID == "/subscriptions/subscriptionID/resourceGroups/resourceGroup1/providers/Microsoft.Test/type1/resource1" { + return armmonitor.MetricDefinitionsClientListResponse{ + MetricDefinitionsClientListResult: armmonitor.MetricDefinitionsClientListResult{ + MetricDefinitionCollection: armmonitor.MetricDefinitionCollection{ + Value: metricDefinitions[0], + }, + }, + }, nil + } + + if resourceID == "/subscriptions/subscriptionID/resourceGroups/resourceGroup1/providers/Microsoft.Test/type2/resource2" { + return armmonitor.MetricDefinitionsClientListResponse{ + MetricDefinitionsClientListResult: armmonitor.MetricDefinitionsClientListResult{ + MetricDefinitionCollection: armmonitor.MetricDefinitionCollection{ + Value: metricDefinitions[1], + }, + }, + }, nil + } + + if resourceID == "/subscriptions/subscriptionID/resourceGroups/resourceGroup2/providers/Microsoft.Test/type1/resource3" { + return armmonitor.MetricDefinitionsClientListResponse{ + MetricDefinitionsClientListResult: armmonitor.MetricDefinitionsClientListResult{ + MetricDefinitionCollection: armmonitor.MetricDefinitionCollection{ + Value: metricDefinitions[2], + }, + }, + }, nil + } + + return armmonitor.MetricDefinitionsClientListResponse{}, fmt.Errorf("resource ID was not found") +} + +func (mamc *mockAzureMetricsClient) List( + _ context.Context, + resourceID string, + _ *armmonitor.MetricsClientListOptions) (armmonitor.MetricsClientListResponse, error) { + file, err := os.ReadFile("testdata/json/azure_metrics_responses.json") + if err != nil { + return armmonitor.MetricsClientListResponse{}, fmt.Errorf("error reading file: %w", err) + } + + var metricResponses []armmonitor.Response + if err = json.Unmarshal(file, &metricResponses); err != nil { + return armmonitor.MetricsClientListResponse{}, err + } + + if resourceID == "/subscriptions/subscriptionID/resourceGroups/resourceGroup1/providers/Microsoft.Test/type1/resource1" { + return armmonitor.MetricsClientListResponse{ + MetricsClientListResult: armmonitor.MetricsClientListResult{ + Response: metricResponses[0], + }, + }, nil + } + + if resourceID == "/subscriptions/subscriptionID/resourceGroups/resourceGroup1/providers/Microsoft.Test/type2/resource2" { + return armmonitor.MetricsClientListResponse{ + MetricsClientListResult: armmonitor.MetricsClientListResult{ + Response: metricResponses[1], + }, + }, nil + } + + if resourceID == "/subscriptions/subscriptionID/resourceGroups/resourceGroup2/providers/Microsoft.Test/type1/resource3" { + return armmonitor.MetricsClientListResponse{ + MetricsClientListResult: armmonitor.MetricsClientListResult{ + Response: metricResponses[2], + }, + }, nil + } + + if resourceID == "/subscriptions/subscriptionID/resourceGroups/resourceGroup2/providers/Microsoft.Test/type2/resource4" { + return armmonitor.MetricsClientListResponse{ + MetricsClientListResult: armmonitor.MetricsClientListResult{ + Response: metricResponses[3], + }, + }, nil + } + + if resourceID == "/subscriptions/subscriptionID/resourceGroups/resourceGroup2/providers/Microsoft.Test/type2/resource5" { + return armmonitor.MetricsClientListResponse{ + MetricsClientListResult: armmonitor.MetricsClientListResult{ + Response: metricResponses[4], + }, + }, nil + } + + if resourceID == "/subscriptions/subscriptionID/resourceGroups/resourceGroup2/providers/Microsoft.Test/type2/resource6" { + return armmonitor.MetricsClientListResponse{ + MetricsClientListResult: armmonitor.MetricsClientListResult{ + Response: metricResponses[5], + }, + }, nil + } + + return armmonitor.MetricsClientListResponse{}, fmt.Errorf("resource ID was not found") +} + +func TestInit_ResourceTargetsOnly(t *testing.T) { + file, err := os.ReadFile("testdata/toml/init_resource_targets_only.toml") + require.NoError(t, err) + require.NotNil(t, file) + require.NotEmpty(t, file) + + var am *AzureMonitor + require.NoError(t, toml.Unmarshal(file, &am)) + + am.Log = testutil.Logger{} + am.azureManager = &mockAzureClientsManager{} + + for index := 1; index <= 27; index++ { + if index <= 10 { + am.ResourceTargets[4].Metrics = append(am.ResourceTargets[4].Metrics, "metric1") + } else if index <= 23 { + am.ResourceTargets[4].Metrics = append(am.ResourceTargets[4].Metrics, "metric2") + } else { + am.ResourceTargets[4].Metrics = append(am.ResourceTargets[4].Metrics, "metric3") + } + } + + var expectedResourceMetrics []string + for index := 1; index <= receiver.MaxMetricsPerRequest; index++ { + if index <= 10 { + expectedResourceMetrics = append(expectedResourceMetrics, "metric1") + } else { + expectedResourceMetrics = append(expectedResourceMetrics, "metric2") + } + } + + require.NoError(t, am.Init()) + require.Len(t, am.receiver.Targets.ResourceTargets, 8) + + for _, target := range am.receiver.Targets.ResourceTargets { + require.Contains(t, []string{ + "/subscriptions/subscriptionID/resourceGroups/resourceGroup1/providers/Microsoft.Test/type1/resource1", + "/subscriptions/subscriptionID/resourceGroups/resourceGroup1/providers/Microsoft.Test/type2/resource2", + "/subscriptions/subscriptionID/resourceGroups/resourceGroup2/providers/Microsoft.Test/type1/resource3"}, target.ResourceID) + + if target.ResourceID == "/subscriptions/subscriptionID/resourceGroups/resourceGroup1/providers/Microsoft.Test/type1/resource1" { + require.Contains(t, []int{1, 2, 3, 4, receiver.MaxMetricsPerRequest}, len(target.Metrics)) + + if len(target.Metrics) == 1 { + require.Equal(t, []string{"metric3"}, target.Metrics) + require.Equal(t, []string{string(armmonitor.AggregationTypeEnumTotal), string(armmonitor.AggregationTypeEnumAverage)}, target.Aggregations) + } + if len(target.Metrics) == 2 { + require.Equal(t, []string{"metric1", "metric2"}, target.Metrics) + require.Equal(t, []string{string(armmonitor.AggregationTypeEnumTotal), string(armmonitor.AggregationTypeEnumAverage)}, target.Aggregations) + } + if len(target.Metrics) == 3 { + require.Equal(t, []string{"metric2", "metric2", "metric2"}, target.Metrics) + require.Equal(t, []string{ + string(armmonitor.AggregationTypeEnumAverage), + string(armmonitor.AggregationTypeEnumCount), + string(armmonitor.AggregationTypeEnumMaximum), + string(armmonitor.AggregationTypeEnumMinimum), + string(armmonitor.AggregationTypeEnumTotal), + }, target.Aggregations) + } + if len(target.Metrics) == 4 { + require.Equal(t, []string{"metric3", "metric3", "metric3", "metric3"}, target.Metrics) + require.Equal(t, []string{ + string(armmonitor.AggregationTypeEnumAverage), + string(armmonitor.AggregationTypeEnumCount), + string(armmonitor.AggregationTypeEnumMaximum), + string(armmonitor.AggregationTypeEnumMinimum), + string(armmonitor.AggregationTypeEnumTotal), + }, target.Aggregations) + } + if len(target.Metrics) == receiver.MaxMetricsPerRequest { + require.Equal(t, expectedResourceMetrics, target.Metrics) + require.Equal(t, []string{ + string(armmonitor.AggregationTypeEnumAverage), + string(armmonitor.AggregationTypeEnumCount), + string(armmonitor.AggregationTypeEnumMaximum), + string(armmonitor.AggregationTypeEnumMinimum), + string(armmonitor.AggregationTypeEnumTotal), + }, target.Aggregations) + } + } + if target.ResourceID == "/subscriptions/subscriptionID/resourceGroups/resourceGroup1/providers/Microsoft.Test/type2/resource2" { + require.Equal(t, []string{"metric1", "metric2"}, target.Metrics) + require.Equal(t, []string{ + string(armmonitor.AggregationTypeEnumAverage), + string(armmonitor.AggregationTypeEnumCount), + string(armmonitor.AggregationTypeEnumMaximum), + string(armmonitor.AggregationTypeEnumMinimum), + string(armmonitor.AggregationTypeEnumTotal), + }, target.Aggregations) + } + if target.ResourceID == "/subscriptions/subscriptionID/resourceGroups/resourceGroup2/providers/Microsoft.Test/type1/resource3" { + require.Equal(t, []string{"metric1", "metric2", "metric3"}, target.Metrics) + require.Equal(t, []string{string(armmonitor.AggregationTypeEnumTotal)}, target.Aggregations) + } + } +} + +func TestInit_ResourceGroupTargetsOnly(t *testing.T) { + file, err := os.ReadFile("testdata/toml/init_resource_group_targets_only.toml") + require.NoError(t, err) + require.NotNil(t, file) + require.NotEmpty(t, file) + + var am *AzureMonitor + require.NoError(t, toml.Unmarshal(file, &am)) + + am.Log = testutil.Logger{} + am.azureManager = &mockAzureClientsManager{} + + for index := 1; index <= 27; index++ { + if index <= 10 { + am.ResourceGroupTargets[0].Resources[1].Metrics = append(am.ResourceGroupTargets[0].Resources[1].Metrics, "metric1") + } else if index <= 23 { + am.ResourceGroupTargets[0].Resources[1].Metrics = append(am.ResourceGroupTargets[0].Resources[1].Metrics, "metric2") + } else { + am.ResourceGroupTargets[0].Resources[1].Metrics = append(am.ResourceGroupTargets[0].Resources[1].Metrics, "metric3") + } + } + + var expectedResourceMetrics []string + for index := 1; index <= receiver.MaxMetricsPerRequest; index++ { + if index <= 10 { + expectedResourceMetrics = append(expectedResourceMetrics, "metric1") + } else { + expectedResourceMetrics = append(expectedResourceMetrics, "metric2") + } + } + + require.NoError(t, am.Init()) + require.Len(t, am.receiver.Targets.ResourceTargets, 9) + + for _, target := range am.receiver.Targets.ResourceTargets { + require.Contains(t, []string{ + "/subscriptions/subscriptionID/resourceGroups/resourceGroup1/providers/Microsoft.Test/type1/resource1", + "/subscriptions/subscriptionID/resourceGroups/resourceGroup1/providers/Microsoft.Test/type2/resource2", + "/subscriptions/subscriptionID/resourceGroups/resourceGroup2/providers/Microsoft.Test/type1/resource3"}, target.ResourceID) + + if target.ResourceID == "/subscriptions/subscriptionID/resourceGroups/resourceGroup1/providers/Microsoft.Test/type1/resource1" { + require.Contains(t, []int{1, 2, 3, 4, receiver.MaxMetricsPerRequest}, len(target.Metrics)) + + if len(target.Metrics) == 1 { + require.Equal(t, []string{"metric3"}, target.Metrics) + require.Equal(t, []string{string(armmonitor.AggregationTypeEnumTotal), string(armmonitor.AggregationTypeEnumAverage)}, target.Aggregations) + } + if len(target.Metrics) == 2 { + require.Equal(t, []string{"metric1", "metric2"}, target.Metrics) + require.Equal(t, []string{string(armmonitor.AggregationTypeEnumTotal), string(armmonitor.AggregationTypeEnumAverage)}, target.Aggregations) + } + if len(target.Metrics) == 3 { + require.Equal(t, []string{"metric2", "metric2", "metric2"}, target.Metrics) + require.Equal(t, []string{ + string(armmonitor.AggregationTypeEnumAverage), + string(armmonitor.AggregationTypeEnumCount), + string(armmonitor.AggregationTypeEnumMaximum), + string(armmonitor.AggregationTypeEnumMinimum), + string(armmonitor.AggregationTypeEnumTotal), + }, target.Aggregations) + } + if len(target.Metrics) == 4 { + require.Equal(t, []string{"metric3", "metric3", "metric3", "metric3"}, target.Metrics) + require.Equal(t, []string{ + string(armmonitor.AggregationTypeEnumAverage), + string(armmonitor.AggregationTypeEnumCount), + string(armmonitor.AggregationTypeEnumMaximum), + string(armmonitor.AggregationTypeEnumMinimum), + string(armmonitor.AggregationTypeEnumTotal), + }, target.Aggregations) + } + if len(target.Metrics) == receiver.MaxMetricsPerRequest { + require.Equal(t, expectedResourceMetrics, target.Metrics) + require.Equal(t, []string{ + string(armmonitor.AggregationTypeEnumAverage), + string(armmonitor.AggregationTypeEnumCount), + string(armmonitor.AggregationTypeEnumMaximum), + string(armmonitor.AggregationTypeEnumMinimum), + string(armmonitor.AggregationTypeEnumTotal), + }, target.Aggregations) + } + } + if target.ResourceID == "/subscriptions/subscriptionID/resourceGroups/resourceGroup1/providers/Microsoft.Test/type2/resource2" { + require.Contains(t, []int{1, 2}, len(target.Metrics)) + + if len(target.Metrics) == 1 { + require.Equal(t, []string{"metric2"}, target.Metrics) + require.Equal(t, []string{ + string(armmonitor.AggregationTypeEnumAverage), + string(armmonitor.AggregationTypeEnumCount), + string(armmonitor.AggregationTypeEnumMaximum), + string(armmonitor.AggregationTypeEnumMinimum), + string(armmonitor.AggregationTypeEnumTotal), + }, target.Aggregations) + } + if len(target.Metrics) == 2 { + require.Contains(t, []int{1, 5}, len(target.Aggregations)) + + if len(target.Aggregations) == 1 { + require.Equal(t, []string{"metric1", "metric2"}, target.Metrics) + require.Equal(t, []string{string(armmonitor.AggregationTypeEnumAverage)}, target.Aggregations) + } + if len(target.Aggregations) == 5 { + require.Equal(t, []string{"metric1", "metric2"}, target.Metrics) + require.Equal(t, []string{ + string(armmonitor.AggregationTypeEnumAverage), + string(armmonitor.AggregationTypeEnumCount), + string(armmonitor.AggregationTypeEnumMaximum), + string(armmonitor.AggregationTypeEnumMinimum), + string(armmonitor.AggregationTypeEnumTotal), + }, target.Aggregations) + } + } + } + if target.ResourceID == "/subscriptions/subscriptionID/resourceGroups/resourceGroup2/providers/Microsoft.Test/type1/resource3" { + require.Equal(t, []string{"metric3"}, target.Metrics) + require.Equal(t, []string{string(armmonitor.AggregationTypeEnumTotal), string(armmonitor.AggregationTypeEnumAverage)}, target.Aggregations) + } + } +} + +func TestInit_SubscriptionTargetsOnly(t *testing.T) { + file, err := os.ReadFile("testdata/toml/init_subscription_targets_only.toml") + require.NoError(t, err) + require.NotNil(t, file) + require.NotEmpty(t, file) + + var am *AzureMonitor + require.NoError(t, toml.Unmarshal(file, &am)) + + am.Log = testutil.Logger{} + am.azureManager = &mockAzureClientsManager{} + + for index := 1; index <= 27; index++ { + if index <= 10 { + am.SubscriptionTargets[4].Metrics = append(am.SubscriptionTargets[4].Metrics, "metric1") + } else if index <= 23 { + am.SubscriptionTargets[4].Metrics = append(am.SubscriptionTargets[4].Metrics, "metric2") + } else { + am.SubscriptionTargets[4].Metrics = append(am.SubscriptionTargets[4].Metrics, "metric3") + } + } + + var expectedResourceMetrics []string + for index := 1; index <= receiver.MaxMetricsPerRequest; index++ { + if index <= 10 { + expectedResourceMetrics = append(expectedResourceMetrics, "metric1") + } else { + expectedResourceMetrics = append(expectedResourceMetrics, "metric2") + } + } + + require.NoError(t, am.Init()) + require.Len(t, am.receiver.Targets.ResourceTargets, 11) + + for _, target := range am.receiver.Targets.ResourceTargets { + require.Contains(t, []string{ + "/subscriptions/subscriptionID/resourceGroups/resourceGroup1/providers/Microsoft.Test/type1/resource1", + "/subscriptions/subscriptionID/resourceGroups/resourceGroup1/providers/Microsoft.Test/type2/resource2", + "/subscriptions/subscriptionID/resourceGroups/resourceGroup2/providers/Microsoft.Test/type1/resource3"}, target.ResourceID) + + if target.ResourceID == "/subscriptions/subscriptionID/resourceGroups/resourceGroup1/providers/Microsoft.Test/type1/resource1" { + require.Contains(t, []int{1, 2, 3, 4, receiver.MaxMetricsPerRequest}, len(target.Metrics)) + + if len(target.Metrics) == 1 { + require.Equal(t, []string{"metric3"}, target.Metrics) + require.Equal(t, []string{ + string(armmonitor.AggregationTypeEnumTotal), + string(armmonitor.AggregationTypeEnumAverage), + }, target.Aggregations) + } + if len(target.Metrics) == 2 { + require.Equal(t, []string{"metric1", "metric2"}, target.Metrics) + require.Equal(t, []string{string(armmonitor.AggregationTypeEnumTotal), string(armmonitor.AggregationTypeEnumAverage)}, target.Aggregations) + } + if len(target.Metrics) == 3 { + require.Equal(t, []string{"metric2", "metric2", "metric2"}, target.Metrics) + require.Equal(t, []string{ + string(armmonitor.AggregationTypeEnumAverage), + string(armmonitor.AggregationTypeEnumCount), + string(armmonitor.AggregationTypeEnumMaximum), + string(armmonitor.AggregationTypeEnumMinimum), + string(armmonitor.AggregationTypeEnumTotal), + }, target.Aggregations) + } + if len(target.Metrics) == 4 { + require.Equal(t, []string{"metric3", "metric3", "metric3", "metric3"}, target.Metrics) + require.Equal(t, []string{ + string(armmonitor.AggregationTypeEnumAverage), + string(armmonitor.AggregationTypeEnumCount), + string(armmonitor.AggregationTypeEnumMaximum), + string(armmonitor.AggregationTypeEnumMinimum), + string(armmonitor.AggregationTypeEnumTotal), + }, target.Aggregations) + } + if len(target.Metrics) == receiver.MaxMetricsPerRequest { + require.Equal(t, expectedResourceMetrics, target.Metrics) + require.Equal(t, []string{ + string(armmonitor.AggregationTypeEnumAverage), + string(armmonitor.AggregationTypeEnumCount), + string(armmonitor.AggregationTypeEnumMaximum), + string(armmonitor.AggregationTypeEnumMinimum), + string(armmonitor.AggregationTypeEnumTotal), + }, target.Aggregations) + } + } + if target.ResourceID == "/subscriptions/subscriptionID/resourceGroups/resourceGroup1/providers/Microsoft.Test/type2/resource2" { + require.Contains(t, []int{1, 2}, len(target.Metrics)) + + if len(target.Metrics) == 1 { + require.Equal(t, []string{"metric2"}, target.Metrics) + require.Equal(t, []string{ + string(armmonitor.AggregationTypeEnumAverage), + string(armmonitor.AggregationTypeEnumCount), + string(armmonitor.AggregationTypeEnumMaximum), + string(armmonitor.AggregationTypeEnumMinimum), + string(armmonitor.AggregationTypeEnumTotal), + }, target.Aggregations) + } + if len(target.Metrics) == 2 { + require.Contains(t, []int{1, 5}, len(target.Aggregations)) + + if len(target.Aggregations) == 1 { + require.Equal(t, []string{"metric1", "metric2"}, target.Metrics) + require.Equal(t, []string{string(armmonitor.AggregationTypeEnumAverage)}, target.Aggregations) + } + if len(target.Aggregations) == 5 { + require.Equal(t, []string{"metric1", "metric2"}, target.Metrics) + require.Equal(t, []string{ + string(armmonitor.AggregationTypeEnumAverage), + string(armmonitor.AggregationTypeEnumCount), + string(armmonitor.AggregationTypeEnumMaximum), + string(armmonitor.AggregationTypeEnumMinimum), + string(armmonitor.AggregationTypeEnumTotal), + }, target.Aggregations) + } + } + } + if target.ResourceID == "/subscriptions/subscriptionID/resourceGroups/resourceGroup2/providers/Microsoft.Test/type1/resource3" { + require.Contains(t, []int{3, 7, receiver.MaxMetricsPerRequest}, len(target.Metrics)) + + if len(target.Metrics) == 3 { + require.Equal(t, []string{"metric1", "metric2", "metric3"}, target.Metrics) + require.Equal(t, []string{string(armmonitor.AggregationTypeEnumTotal), string(armmonitor.AggregationTypeEnumAverage)}, target.Aggregations) + } + if len(target.Metrics) == 7 { + require.Equal(t, []string{"metric2", "metric2", "metric2", "metric3", "metric3", "metric3", "metric3"}, target.Metrics) + require.Equal(t, []string{ + string(armmonitor.AggregationTypeEnumAverage), + string(armmonitor.AggregationTypeEnumCount), + string(armmonitor.AggregationTypeEnumMaximum), + string(armmonitor.AggregationTypeEnumMinimum), + string(armmonitor.AggregationTypeEnumTotal), + }, target.Aggregations) + } + if len(target.Metrics) == receiver.MaxMetricsPerRequest { + require.Equal(t, expectedResourceMetrics, target.Metrics) + require.Equal(t, []string{ + string(armmonitor.AggregationTypeEnumAverage), + string(armmonitor.AggregationTypeEnumCount), + string(armmonitor.AggregationTypeEnumMaximum), + string(armmonitor.AggregationTypeEnumMinimum), + string(armmonitor.AggregationTypeEnumTotal), + }, target.Aggregations) + } + } + } +} + +func TestInit_AllTargetTypes(t *testing.T) { + file, err := os.ReadFile("testdata/toml/init_all_target_types.toml") + require.NoError(t, err) + require.NotNil(t, file) + require.NotEmpty(t, file) + + var am *AzureMonitor + require.NoError(t, toml.Unmarshal(file, &am)) + + am.Log = testutil.Logger{} + am.azureManager = &mockAzureClientsManager{} + + for index := 1; index <= 27; index++ { + if index <= 10 { + am.ResourceTargets[4].Metrics = append(am.ResourceTargets[4].Metrics, "metric1") + am.ResourceGroupTargets[0].Resources[1].Metrics = append(am.ResourceGroupTargets[0].Resources[1].Metrics, "metric1") + am.SubscriptionTargets[4].Metrics = append(am.SubscriptionTargets[4].Metrics, "metric1") + } else if index <= 23 { + am.ResourceTargets[4].Metrics = append(am.ResourceTargets[4].Metrics, "metric2") + am.ResourceGroupTargets[0].Resources[1].Metrics = append(am.ResourceGroupTargets[0].Resources[1].Metrics, "metric2") + am.SubscriptionTargets[4].Metrics = append(am.SubscriptionTargets[4].Metrics, "metric2") + } else { + am.ResourceTargets[4].Metrics = append(am.ResourceTargets[4].Metrics, "metric3") + am.ResourceGroupTargets[0].Resources[1].Metrics = append(am.ResourceGroupTargets[0].Resources[1].Metrics, "metric3") + am.SubscriptionTargets[4].Metrics = append(am.SubscriptionTargets[4].Metrics, "metric3") + } + } + + require.NoError(t, am.Init()) + require.Len(t, am.receiver.Targets.ResourceTargets, 28) +} + +func TestInit_NoSubscriptionID(t *testing.T) { + file, err := os.ReadFile("testdata/toml/init_no_subscription_id.toml") + require.NoError(t, err) + require.NotNil(t, file) + require.NotEmpty(t, file) + + var am *AzureMonitor + require.NoError(t, toml.Unmarshal(file, &am)) + + am.Log = testutil.Logger{} + am.azureManager = &mockAzureClientsManager{} + + require.Error(t, am.Init()) +} + +func TestInit_NoClientID(t *testing.T) { + file, err := os.ReadFile("testdata/toml/init_no_client_id.toml") + require.NoError(t, err) + require.NotNil(t, file) + require.NotEmpty(t, file) + + var am *AzureMonitor + require.NoError(t, toml.Unmarshal(file, &am)) + + am.Log = testutil.Logger{} + am.azureManager = &mockAzureClientsManager{} + + require.Error(t, am.Init()) +} + +func TestInit_NoClientSecret(t *testing.T) { + file, err := os.ReadFile("testdata/toml/init_no_client_secret.toml") + require.NoError(t, err) + require.NotNil(t, file) + require.NotEmpty(t, file) + + var am *AzureMonitor + require.NoError(t, toml.Unmarshal(file, &am)) + + am.Log = testutil.Logger{} + am.azureManager = &mockAzureClientsManager{} + + require.Error(t, am.Init()) +} + +func TestInit_NoTenantID(t *testing.T) { + file, err := os.ReadFile("testdata/toml/init_no_tenant_id.toml") + require.NoError(t, err) + require.NotNil(t, file) + require.NotEmpty(t, file) + + var am *AzureMonitor + require.NoError(t, toml.Unmarshal(file, &am)) + + am.Log = testutil.Logger{} + am.azureManager = &mockAzureClientsManager{} + + require.Error(t, am.Init()) +} + +func TestInit_NoTargets(t *testing.T) { + file, err := os.ReadFile("testdata/toml/init_no_targets.toml") + require.NoError(t, err) + require.NotNil(t, file) + require.NotEmpty(t, file) + + var am *AzureMonitor + require.NoError(t, toml.Unmarshal(file, &am)) + + am.Log = testutil.Logger{} + am.azureManager = &mockAzureClientsManager{} + + require.Error(t, am.Init()) +} + +func TestInit_ResourceTargetWithoutResourceID(t *testing.T) { + file, err := os.ReadFile("testdata/toml/init_resource_target_without_resource_id.toml") + require.NoError(t, err) + require.NotNil(t, file) + require.NotEmpty(t, file) + + var am *AzureMonitor + require.NoError(t, toml.Unmarshal(file, &am)) + + am.Log = testutil.Logger{} + am.azureManager = &mockAzureClientsManager{} + + require.Error(t, am.Init()) +} + +func TestInit_ResourceTargetWithInvalidResourceID(t *testing.T) { + file, err := os.ReadFile("testdata/toml/init_resource_target_with_invalid_resource_id.toml") + require.NoError(t, err) + require.NotNil(t, file) + require.NotEmpty(t, file) + + var am *AzureMonitor + require.NoError(t, toml.Unmarshal(file, &am)) + + am.Log = testutil.Logger{} + am.azureManager = &mockAzureClientsManager{} + + require.Error(t, am.Init()) +} + +func TestInit_ResourceTargetWithInvalidMetric(t *testing.T) { + file, err := os.ReadFile("testdata/toml/init_resource_target_with_invalid_metric.toml") + require.NoError(t, err) + require.NotNil(t, file) + require.NotEmpty(t, file) + + var am *AzureMonitor + require.NoError(t, toml.Unmarshal(file, &am)) + + am.Log = testutil.Logger{} + am.azureManager = &mockAzureClientsManager{} + + require.Error(t, am.Init()) +} + +func TestInit_ResourceTargetWithInvalidAggregation(t *testing.T) { + file, err := os.ReadFile("testdata/toml/init_resource_target_with_invalid_aggregation.toml") + require.NoError(t, err) + require.NotNil(t, file) + require.NotEmpty(t, file) + + var am *AzureMonitor + require.NoError(t, toml.Unmarshal(file, &am)) + + am.Log = testutil.Logger{} + am.azureManager = &mockAzureClientsManager{} + + require.Error(t, am.Init()) +} + +func TestInit_ResourceGroupTargetWithoutResourceGroup(t *testing.T) { + file, err := os.ReadFile("testdata/toml/init_resource_group_target_without_resource_group.toml") + require.NoError(t, err) + require.NotNil(t, file) + require.NotEmpty(t, file) + + var am *AzureMonitor + require.NoError(t, toml.Unmarshal(file, &am)) + + am.Log = testutil.Logger{} + am.azureManager = &mockAzureClientsManager{} + + require.Error(t, am.Init()) +} + +func TestInit_ResourceGroupTargetWithResourceWithoutResourceType(t *testing.T) { + file, err := os.ReadFile("testdata/toml/init_resource_group_target_with_resource_without_resource_type.toml") + require.NoError(t, err) + require.NotNil(t, file) + require.NotEmpty(t, file) + + var am *AzureMonitor + require.NoError(t, toml.Unmarshal(file, &am)) + + am.Log = testutil.Logger{} + am.azureManager = &mockAzureClientsManager{} + + require.Error(t, am.Init()) +} + +func TestInit_ResourceGroupTargetWithInvalidResourceGroup(t *testing.T) { + file, err := os.ReadFile("testdata/toml/init_resource_group_target_with_invalid_resource_group.toml") + require.NoError(t, err) + require.NotNil(t, file) + require.NotEmpty(t, file) + + var am *AzureMonitor + require.NoError(t, toml.Unmarshal(file, &am)) + + am.Log = testutil.Logger{} + am.azureManager = &mockAzureClientsManager{} + + require.Error(t, am.Init()) +} + +func TestInit_ResourceGroupTargetWithInvalidResourceType(t *testing.T) { + file, err := os.ReadFile("testdata/toml/init_resource_group_target_with_invalid_resource_type.toml") + require.NoError(t, err) + require.NotNil(t, file) + require.NotEmpty(t, file) + + var am *AzureMonitor + require.NoError(t, toml.Unmarshal(file, &am)) + + am.Log = testutil.Logger{} + am.azureManager = &mockAzureClientsManager{} + + require.Error(t, am.Init()) +} + +func TestInit_ResourceGroupTargetWithInvalidMetric(t *testing.T) { + file, err := os.ReadFile("testdata/toml/init_resource_group_target_with_invalid_metric.toml") + require.NoError(t, err) + require.NotNil(t, file) + require.NotEmpty(t, file) + + var am *AzureMonitor + require.NoError(t, toml.Unmarshal(file, &am)) + + am.Log = testutil.Logger{} + am.azureManager = &mockAzureClientsManager{} + + require.Error(t, am.Init()) +} + +func TestInit_ResourceGroupTargetWithInvalidAggregation(t *testing.T) { + file, err := os.ReadFile("testdata/toml/init_resource_group_target_with_invalid_aggregation.toml") + require.NoError(t, err) + require.NotNil(t, file) + require.NotEmpty(t, file) + + var am *AzureMonitor + require.NoError(t, toml.Unmarshal(file, &am)) + + am.Log = testutil.Logger{} + am.azureManager = &mockAzureClientsManager{} + + require.Error(t, am.Init()) +} + +func TestInit_ResourceGroupTargetWithoutResources(t *testing.T) { + file, err := os.ReadFile("testdata/toml/init_resource_group_target_without_resources.toml") + require.NoError(t, err) + require.NotNil(t, file) + require.NotEmpty(t, file) + + var am *AzureMonitor + require.NoError(t, toml.Unmarshal(file, &am)) + + am.Log = testutil.Logger{} + am.azureManager = &mockAzureClientsManager{} + + require.Error(t, am.Init()) +} + +func TestInit_ResourceGroupTargetNoResourceFound(t *testing.T) { + file, err := os.ReadFile("testdata/toml/init_resource_group_target_no_resource_found.toml") + require.NoError(t, err) + require.NotNil(t, file) + require.NotEmpty(t, file) + + var am *AzureMonitor + require.NoError(t, toml.Unmarshal(file, &am)) + + am.Log = testutil.Logger{} + am.azureManager = &mockAzureClientsManager{} + + require.Error(t, am.Init()) +} + +func TestInit_SubscriptionTargetWithoutResourceType(t *testing.T) { + file, err := os.ReadFile("testdata/toml/init_subscription_target_without_resource_type.toml") + require.NoError(t, err) + require.NotNil(t, file) + require.NotEmpty(t, file) + + var am *AzureMonitor + require.NoError(t, toml.Unmarshal(file, &am)) + + am.Log = testutil.Logger{} + am.azureManager = &mockAzureClientsManager{} + + require.Error(t, am.Init()) +} + +func TestInit_SubscriptionTargetWithInvalidResourceType(t *testing.T) { + file, err := os.ReadFile("testdata/toml/init_subscription_target_with_invalid_resource_type.toml") + require.NoError(t, err) + require.NotNil(t, file) + require.NotEmpty(t, file) + + var am *AzureMonitor + require.NoError(t, toml.Unmarshal(file, &am)) + + am.Log = testutil.Logger{} + am.azureManager = &mockAzureClientsManager{} + + require.Error(t, am.Init()) +} + +func TestInit_SubscriptionTargetWithInvalidMetric(t *testing.T) { + file, err := os.ReadFile("testdata/toml/init_subscription_target_with_invalid_metric.toml") + require.NoError(t, err) + require.NotNil(t, file) + require.NotEmpty(t, file) + + var am *AzureMonitor + require.NoError(t, toml.Unmarshal(file, &am)) + + am.Log = testutil.Logger{} + am.azureManager = &mockAzureClientsManager{} + + require.Error(t, am.Init()) +} + +func TestInit_SubscriptionTargetWithInvalidAggregation(t *testing.T) { + file, err := os.ReadFile("testdata/toml/init_subscription_target_with_invalid_aggregation.toml") + require.NoError(t, err) + require.NotNil(t, file) + require.NotEmpty(t, file) + + var am *AzureMonitor + require.NoError(t, toml.Unmarshal(file, &am)) + + am.Log = testutil.Logger{} + am.azureManager = &mockAzureClientsManager{} + + require.Error(t, am.Init()) +} + +func TestInit_SubscriptionTargetNoResourceFound(t *testing.T) { + file, err := os.ReadFile("testdata/toml/init_subscription_target_no_resource_found.toml") + require.NoError(t, err) + require.NotNil(t, file) + require.NotEmpty(t, file) + + var am *AzureMonitor + require.NoError(t, toml.Unmarshal(file, &am)) + + am.Log = testutil.Logger{} + am.azureManager = &mockAzureClientsManager{} + + require.Error(t, am.Init()) +} + +func TestInit_BadCredentials(t *testing.T) { + file, err := os.ReadFile("testdata/toml/init_bad_credentials.toml") + require.NoError(t, err) + require.NotNil(t, file) + require.NotEmpty(t, file) + + var am *AzureMonitor + require.NoError(t, toml.Unmarshal(file, &am)) + + am.Log = testutil.Logger{} + am.azureManager = &azureClientsManager{} + require.Error(t, am.Init()) +} + +func TestGather_Success(t *testing.T) { + file, err := os.ReadFile("testdata/toml/gather_success.toml") + require.NoError(t, err) + require.NotNil(t, file) + require.NotEmpty(t, file) + + var am *AzureMonitor + require.NoError(t, toml.Unmarshal(file, &am)) + + am.Log = testutil.Logger{} + am.azureManager = &mockAzureClientsManager{} + + var resourceTargets []*receiver.ResourceTarget + for _, target := range am.ResourceTargets { + resourceTargets = append(resourceTargets, receiver.NewResourceTarget(target.ResourceID, target.Metrics, target.Aggregations)) + } + + var azureClients *receiver.AzureClients + azureClients, err = am.azureManager.createAzureClients(am.SubscriptionID, am.ClientID, am.ClientSecret, am.TenantID) + require.NoError(t, err) + require.NotNil(t, azureClients) + + am.receiver, err = receiver.NewAzureMonitorMetricsReceiver( + am.SubscriptionID, + am.ClientID, + am.ClientSecret, + am.TenantID, + receiver.NewTargets(resourceTargets, []*receiver.ResourceGroupTarget{}, []*receiver.Resource{}), + azureClients, + ) + require.NoError(t, err) + require.NotNil(t, am.receiver) + + expectedResource1Metric1Name := "azure_monitor_microsoft_test_type1_metric1" + expectedResource1Metric1MetricFields := make(map[string]interface{}) + expectedResource1Metric1MetricFields[receiver.MetricFieldTimeStamp] = "2022-02-22T22:59:00Z" + expectedResource1Metric1MetricFields[receiver.MetricFieldTotal] = 5.0 + expectedResource1Metric1MetricFields[receiver.MetricFieldMaximum] = 5.0 + expectedResource1Metric2Name := "azure_monitor_microsoft_test_type1_metric2" + expectedResource1Metric2MetricFields := make(map[string]interface{}) + expectedResource1Metric2MetricFields[receiver.MetricFieldTimeStamp] = "2022-02-22T22:59:00Z" + expectedResource1Metric2MetricFields[receiver.MetricFieldTotal] = 2.5 + expectedResource1Metric2MetricFields[receiver.MetricFieldMaximum] = 2.5 + expectedResource1MetricsTags := make(map[string]string) + expectedResource1MetricsTags[receiver.MetricTagSubscriptionID] = "subscriptionID" + expectedResource1MetricsTags[receiver.MetricTagResourceGroup] = "resourceGroup1" + expectedResource1MetricsTags[receiver.MetricTagNamespace] = "Microsoft.Test/type1" + expectedResource1MetricsTags[receiver.MetricTagResourceName] = "resource1" + expectedResource1MetricsTags[receiver.MetricTagResourceRegion] = "eastus" + expectedResource1MetricsTags[receiver.MetricTagUnit] = string(armmonitor.MetricUnitCount) + + expectedResource2Metric1Name := "azure_monitor_microsoft_test_type2_metric1" + expectedResource2Metric1MetricFields := make(map[string]interface{}) + expectedResource2Metric1MetricFields[receiver.MetricFieldTimeStamp] = "2022-02-22T22:59:00Z" + expectedResource2Metric1MetricFields[receiver.MetricFieldTotal] = 5.0 + expectedResource2Metric1MetricFields[receiver.MetricFieldMinimum] = 2.5 + expectedResource2MetricsTags := make(map[string]string) + expectedResource2MetricsTags[receiver.MetricTagSubscriptionID] = "subscriptionID" + expectedResource2MetricsTags[receiver.MetricTagResourceGroup] = "resourceGroup1" + expectedResource2MetricsTags[receiver.MetricTagNamespace] = "Microsoft.Test/type2" + expectedResource2MetricsTags[receiver.MetricTagResourceName] = "resource2" + expectedResource2MetricsTags[receiver.MetricTagResourceRegion] = "eastus" + expectedResource2MetricsTags[receiver.MetricTagUnit] = string(armmonitor.MetricUnitCount) + + expectedResource3Metric1Name := "azure_monitor_microsoft_test_type1_metric1" + expectedResource3Metric1MetricFields := make(map[string]interface{}) + expectedResource3Metric1MetricFields[receiver.MetricFieldTimeStamp] = "2022-02-22T22:58:00Z" + expectedResource3Metric1MetricFields[receiver.MetricFieldTotal] = 2.5 + expectedResource3Metric1MetricFields[receiver.MetricFieldMinimum] = 2.5 + expectedResource3MetricsTags := make(map[string]string) + expectedResource3MetricsTags[receiver.MetricTagSubscriptionID] = "subscriptionID" + expectedResource3MetricsTags[receiver.MetricTagResourceGroup] = "resourceGroup2" + expectedResource3MetricsTags[receiver.MetricTagNamespace] = "Microsoft.Test/type1" + expectedResource3MetricsTags[receiver.MetricTagResourceName] = "resource3" + expectedResource3MetricsTags[receiver.MetricTagResourceRegion] = "eastus" + expectedResource3MetricsTags[receiver.MetricTagUnit] = string(armmonitor.MetricUnitBytes) + + acc := testutil.Accumulator{} + + require.NoError(t, acc.GatherError(am.Gather)) + require.Len(t, acc.Metrics, 4) + + acc.AssertContainsTaggedFields(t, expectedResource1Metric1Name, expectedResource1Metric1MetricFields, expectedResource1MetricsTags) + acc.AssertContainsTaggedFields(t, expectedResource1Metric2Name, expectedResource1Metric2MetricFields, expectedResource1MetricsTags) + acc.AssertContainsTaggedFields(t, expectedResource2Metric1Name, expectedResource2Metric1MetricFields, expectedResource2MetricsTags) + acc.AssertContainsTaggedFields(t, expectedResource3Metric1Name, expectedResource3Metric1MetricFields, expectedResource3MetricsTags) +} diff --git a/plugins/inputs/azure_monitor/sample.conf b/plugins/inputs/azure_monitor/sample.conf new file mode 100644 index 000000000..bedb0bc99 --- /dev/null +++ b/plugins/inputs/azure_monitor/sample.conf @@ -0,0 +1,69 @@ +# Gather Azure resources metrics from Azure Monitor API +[[inputs.azure_monitor]] + # can be found under Overview->Essentials in the Azure portal for your application/service + subscription_id = "<>" + # can be obtained by registering an application under Azure Active Directory + client_id = "<>" + # can be obtained by registering an application under Azure Active Directory + client_secret = "<>" + # can be found under Azure Active Directory->Properties + tenant_id = "<>" + + # resource target #1 to collect metrics from + [[inputs.azure_monitor.resource_target]] + # can be found undet Overview->Essentials->JSON View in the Azure portal for your application/service + # must start with 'resourceGroups/...' ('/subscriptions/xxxxxxxx-xxxx-xxxx-xxx-xxxxxxxxxxxx' + # must be removed from the beginning of Resource ID property value) + resource_id = "<>" + # the metric names to collect + # leave the array empty to use all metrics available to this resource + metrics = [ "<>", "<>" ] + # metrics aggregation type value to collect + # can be 'Total', 'Count', 'Average', 'Minimum', 'Maximum' + # leave the array empty to collect all aggregation types values for each metric + aggregations = [ "<>", "<>" ] + + # resource target #2 to collect metrics from + [[inputs.azure_monitor.resource_target]] + resource_id = "<>" + metrics = [ "<>", "<>" ] + aggregations = [ "<>", "<>" ] + + # resource group target #1 to collect metrics from resources under it with resource type + [[inputs.azure_monitor.resource_group_target]] + # the resource group name + resource_group = "<>" + + # defines the resources to collect metrics from + [[inputs.azure_monitor.resource_group_target.resource]] + # the resource type + resource_type = "<>" + metrics = [ "<>", "<>" ] + aggregations = [ "<>", "<>" ] + + # defines the resources to collect metrics from + [[inputs.azure_monitor.resource_group_target.resource]] + resource_type = "<>" + metrics = [ "<>", "<>" ] + aggregations = [ "<>", "<>" ] + + # resource group target #2 to collect metrics from resources under it with resource type + [[inputs.azure_monitor.resource_group_target]] + resource_group = "<>" + + [[inputs.azure_monitor.resource_group_target.resource]] + resource_type = "<>" + metrics = [ "<>", "<>" ] + aggregations = [ "<>", "<>" ] + + # subscription target #1 to collect metrics from resources under it with resource type + [[inputs.azure_monitor.subscription_target]] + resource_type = "<>" + metrics = [ "<>", "<>" ] + aggregations = [ "<>", "<>" ] + + # subscription target #2 to collect metrics from resources under it with resource type + [[inputs.azure_monitor.subscription_target]] + resource_type = "<>" + metrics = [ "<>", "<>" ] + aggregations = [ "<>", "<>" ] diff --git a/plugins/inputs/azure_monitor/testdata/json/azure_metric_definitions_responses.json b/plugins/inputs/azure_monitor/testdata/json/azure_metric_definitions_responses.json new file mode 100644 index 000000000..e3d66e84e --- /dev/null +++ b/plugins/inputs/azure_monitor/testdata/json/azure_metric_definitions_responses.json @@ -0,0 +1,114 @@ +[ + [ + { + "id": "/subscriptions/subscriptionID/resourceGroups/resourceGroup1/providers/Microsoft.Test/type1/resource1", + "name": { + "value": "metric1" + }, + "metricAvailabilities": [ + { + "timeGrain": "PT1M" + }, + { + "timeGrain": "PT5M" + } + ] + }, + { + "id": "/subscriptions/subscriptionID/resourceGroups/resourceGroup1/providers/Microsoft.Test/type1/resource1", + "name": { + "value": "metric2" + }, + "metricAvailabilities": [ + { + "timeGrain": "PT1M" + }, + { + "timeGrain": "PT5M" + } + ] + }, + { + "id": "/subscriptions/subscriptionID/resourceGroups/resourceGroup1/providers/Microsoft.Test/type1/resource1", + "name": { + "value": "metric3" + }, + "metricAvailabilities": [ + { + "timeGrain": "PT5M" + } + ] + } + ], + [ + { + "id": "/subscriptions/subscriptionID/resourceGroups/resourceGroup1/providers/Microsoft.Test/type2/resource2", + "name": { + "value": "metric1" + }, + "metricAvailabilities": [ + { + "timeGrain": "PT1M" + }, + { + "timeGrain": "PT5M" + } + ] + }, + { + "id": "/subscriptions/subscriptionID/resourceGroups/resourceGroup1/providers/Microsoft.Test/type2/resource2", + "name": { + "value": "metric2" + }, + "metricAvailabilities": [ + { + "timeGrain": "PT1M" + } + ] + } + ], + [ + { + "id": "/subscriptions/subscriptionID/resourceGroups/resourceGroup2/providers/Microsoft.Test/type1/resource3", + "name": { + "value": "metric1" + }, + "metricAvailabilities": [ + { + "timeGrain": "PT1M" + }, + { + "timeGrain": "PT5M" + } + ] + }, + { + "id": "/subscriptions/subscriptionID/resourceGroups/resourceGroup2/providers/Microsoft.Test/type1/resource3", + "name": { + "value": "metric2" + }, + "metricAvailabilities": [ + { + "timeGrain": "PT1M" + }, + { + "timeGrain": "PT5M" + } + ] + }, + { + "id": "/subscriptions/subscriptionID/resourceGroups/resourceGroup2/providers/Microsoft.Test/type1/resource3", + "name": { + "value": "metric3" + }, + "metricAvailabilities": [ + { + "timeGrain": "PT1M" + }, + { + "timeGrain": "PT5M" + } + ] + } + ] +] \ No newline at end of file diff --git a/plugins/inputs/azure_monitor/testdata/json/azure_metrics_responses.json b/plugins/inputs/azure_monitor/testdata/json/azure_metrics_responses.json new file mode 100644 index 000000000..037a3889e --- /dev/null +++ b/plugins/inputs/azure_monitor/testdata/json/azure_metrics_responses.json @@ -0,0 +1,243 @@ +[ + { + "namespace": "Microsoft.Test/type1", + "resourceregion": "eastus", + "value": [ + { + "id": "/subscriptions/subscriptionID/resourceGroups/resourceGroup1/providers/Microsoft.Test/type1/resource1/providers/Microsoft.Insights/metrics/metric1", + "name": { + "localizedValue": "metric1" + }, + "unit": "Count", + "timeseries": [ + { + "data": [ + { + "timeStamp": "2022-02-22T22:00:00Z", + "total": 1.0, + "maximum": 1.0 + }, + { + "timeStamp": "2022-02-22T22:01:00Z", + "total": 2.0, + "maximum": 2.0 + }, + { + "timeStamp": "2022-02-22T22:02:00Z", + "total": 2.5, + "maximum": 2.5 + }, + { + "timeStamp": "2022-02-22T22:58:00Z", + "total": 2.0, + "maximum": 2.5 + }, + { + "timeStamp": "2022-02-22T22:59:00Z", + "total": 5.0, + "maximum": 5.0 + } + ] + } + ], + "errorCode": "Success" + }, + { + "id": "/subscriptions/subscriptionID/resourceGroups/resourceGroup1/providers/Microsoft.Test/type1/resource1/providers/Microsoft.Insights/metrics/metric2", + "name": { + "localizedValue": "metric2" + }, + "unit": "Count", + "timeseries": [ + { + "data": [ + { + "timeStamp": "2022-02-22T22:00:00Z", + "total": 2.0, + "maximum": 2.0 + }, + { + "timeStamp": "2022-02-22T22:01:00Z", + "total": 1.0, + "maximum": 2.0 + }, + { + "timeStamp": "2022-02-22T22:02:00Z", + "total": 1.0, + "maximum": 2.0 + }, + { + "timeStamp": "2022-02-22T22:58:00Z", + "total": 2.5, + "maximum": 2.5 + }, + { + "timeStamp": "2022-02-22T22:59:00Z", + "total": 2.5, + "maximum": 2.5 + } + ] + } + ], + "errorCode": "Success" + } + ] + }, + { + "namespace": "Microsoft.Test/type2", + "resourceregion": "eastus", + "value": [ + { + "id": "/subscriptions/subscriptionID/resourceGroups/resourceGroup1/providers/Microsoft.Test/type2/resource2/providers/Microsoft.Insights/metrics/metric1", + "name": { + "localizedValue": "metric1" + }, + "unit": "Count", + "timeseries": [ + { + "data": [ + { + "timeStamp": "2022-02-22T22:00:00Z", + "total": 5.0, + "minimum": 5.0 + }, + { + "timeStamp": "2022-02-22T22:01:00Z", + "total": 3.0, + "minimum": 3.0 + }, + { + "timeStamp": "2022-02-22T22:02:00Z", + "total": 5.0, + "minimum": 3.0 + }, + { + "timeStamp": "2022-02-22T22:58:00Z", + "total": 2.5, + "minimum": 2.5 + }, + { + "timeStamp": "2022-02-22T22:59:00Z", + "total": 5.0, + "minimum": 2.5 + } + ] + } + ], + "errorCode": "Success" + } + ] + }, + { + "namespace": "Microsoft.Test/type1", + "resourceregion": "eastus", + "value": [ + { + "id": "/subscriptions/subscriptionID/resourceGroups/resourceGroup2/providers/Microsoft.Test/type1/resource3/providers/Microsoft.Insights/metrics/metric1", + "name": { + "localizedValue": "metric1" + }, + "unit": "Bytes", + "timeseries": [ + { + "data": [ + { + "timeStamp": "2022-02-22T22:00:00Z", + "total": 5.0, + "minimum": 5.0 + }, + { + "timeStamp": "2022-02-22T22:01:00Z", + "total": 3.0, + "minimum": 3.0 + }, + { + "timeStamp": "2022-02-22T22:02:00Z", + "total": 5.0, + "minimum": 3.0 + }, + { + "timeStamp": "2022-02-22T22:58:00Z", + "total": 2.5, + "minimum": 2.5 + }, + { + "timeStamp": "2022-02-22T22:59:00Z" + } + ] + } + ], + "errorCode": "Success" + } + ] + }, + { + "namespace": "Microsoft.Test/type2", + "resourceregion": "eastus", + "value": [ + { + "id": "/subscriptions/subscriptionID/resourceGroups/resourceGroup2/providers/Microsoft.Test/type2/resource4/providers/Microsoft.Insights/metrics/metric1", + "name": { + "localizedValue": "metric1" + }, + "unit": "Bytes", + "timeseries": [ + { + "data": [ + { + "timeStamp": "2022-02-22T22:00:00Z" + }, + { + "timeStamp": "2022-02-22T22:01:00Z" + }, + { + "timeStamp": "2022-02-22T22:02:00Z" + }, + { + "timeStamp": "2022-02-22T22:58:00Z" + }, + { + "timeStamp": "2022-02-22T22:59:00Z" + } + ] + } + ], + "errorCode": "Success" + } + ] + }, + { + "namespace": "Microsoft.Test/type2", + "resourceregion": "eastus", + "value": [ + { + "id": "/subscriptions/subscriptionID/resourceGroups/resourceGroup2/providers/Microsoft.Test/type2/resource5/providers/Microsoft.Insights/metrics/metric2", + "name": { + "localizedValue": "metric2" + }, + "unit": "Bytes", + "timeseries": [ + { + "data": [] + } + ], + "errorCode": "Success" + } + ] + }, + { + "namespace": "Microsoft.Test/type2", + "resourceregion": "eastus", + "value": [ + { + "id": "/subscriptions/subscriptionID/resourceGroups/resourceGroup2/providers/Microsoft.Test/type2/resource6/providers/Microsoft.Insights/metrics/metric2", + "name": { + "localizedValue": "metric2" + }, + "unit": "Bytes", + "timeseries": [], + "errorCode": "Success" + } + ] + } +] \ No newline at end of file diff --git a/plugins/inputs/azure_monitor/testdata/json/azure_resources_response.json b/plugins/inputs/azure_monitor/testdata/json/azure_resources_response.json new file mode 100644 index 000000000..81adf59ec --- /dev/null +++ b/plugins/inputs/azure_monitor/testdata/json/azure_resources_response.json @@ -0,0 +1,14 @@ +[ + { + "id": "/subscriptions/subscriptionID/resourceGroups/resourceGroup1/providers/Microsoft.Test/type1/resource1", + "type": "Microsoft.Test/type1" + }, + { + "id": "/subscriptions/subscriptionID/resourceGroups/resourceGroup1/providers/Microsoft.Test/type2/resource2", + "type": "Microsoft.Test/type2" + }, + { + "id": "/subscriptions/subscriptionID/resourceGroups/resourceGroup2/providers/Microsoft.Test/type1/resource3", + "type": "Microsoft.Test/type1" + } +] \ No newline at end of file diff --git a/plugins/inputs/azure_monitor/testdata/toml/gather_success.toml b/plugins/inputs/azure_monitor/testdata/toml/gather_success.toml new file mode 100644 index 000000000..1fa577aa4 --- /dev/null +++ b/plugins/inputs/azure_monitor/testdata/toml/gather_success.toml @@ -0,0 +1,34 @@ +subscription_id = "subscriptionID" +client_id = "clientID" +client_secret = "clientSecret" +tenant_id = "tenantID" + + [[resource_target]] + resource_id = "resourceGroups/resourceGroup1/providers/Microsoft.Test/type1/resource1" + metrics = ["metric1", "metric2"] + aggregations = ["Total", "Maximum"] + + [[resource_target]] + resource_id = "resourceGroups/resourceGroup1/providers/Microsoft.Test/type2/resource2" + metrics = ["metric1"] + aggregations = ["Total", "Minimum"] + + [[resource_target]] + resource_id = "resourceGroups/resourceGroup2/providers/Microsoft.Test/type1/resource3" + metrics = ["metric1"] + aggregations = ["Total", "Minimum"] + + [[resource_target]] + resource_id = "resourceGroups/resourceGroup2/providers/Microsoft.Test/type2/resource4" + metrics = ["metric1"] + aggregations = ["Total", "Maximum"] + + [[resource_target]] + resource_id = "resourceGroups/resourceGroup2/providers/Microsoft.Test/type2/resource5" + metrics = ["metric2"] + aggregations = ["Total"] + + [[resource_target]] + resource_id = "resourceGroups/resourceGroup2/providers/Microsoft.Test/type2/resource6" + metrics = ["metric2"] + aggregations = ["Average"] diff --git a/plugins/inputs/azure_monitor/testdata/toml/init_all_target_types.toml b/plugins/inputs/azure_monitor/testdata/toml/init_all_target_types.toml new file mode 100644 index 000000000..ffc7b1b33 --- /dev/null +++ b/plugins/inputs/azure_monitor/testdata/toml/init_all_target_types.toml @@ -0,0 +1,90 @@ +subscription_id = "subscriptionID" +client_id = "clientID" +client_secret = "clientSecret" +tenant_id = "tenantID" + + [[resource_target]] + resource_id = "resourceGroups/resourceGroup1/providers/Microsoft.Test/type1/resource1" + metrics = ["metric1", "metric2", "metric3"] + aggregations = ["Total", "Average"] + + [[resource_target]] + resource_id = "resourceGroups/resourceGroup1/providers/Microsoft.Test/type2/resource2" + metrics = ["metric1", "metric2"] + aggregations = [] + + [[resource_target]] + resource_id = "resourceGroups/resourceGroup2/providers/Microsoft.Test/type1/resource3" + metrics = [] + aggregations = ["Total"] + + [[resource_target]] + resource_id = "resourceGroups/resourceGroup1/providers/Microsoft.Test/type2/resource2" + metrics = [] + aggregations = [] + + [[resource_target]] + resource_id = "resourceGroups/resourceGroup1/providers/Microsoft.Test/type1/resource1" + metrics = [] + aggregations = [] + + [[resource_group_target]] + resource_group = "resourceGroup1" + + [[resource_group_target.resource]] + resource_type = "Microsoft.Test/type1" + metrics = ["metric1", "metric2", "metric3"] + aggregations = ["Total", "Average"] + + [[resource_group_target.resource]] + resource_type = "Microsoft.Test/type1" + metrics = [] + aggregations = [] + + [[resource_group_target.resource]] + resource_type = "Microsoft.Test/type2" + metrics = [] + aggregations = ["Average"] + + [[resource_group_target.resource]] + resource_type = "Microsoft.Test/type2" + metrics = ["metric2"] + aggregations = [] + + [[resource_group_target.resource]] + resource_type = "Microsoft.Test/type2" + metrics = ["metric2"] + aggregations = [] + + [[resource_group_target]] + resource_group = "resourceGroup2" + + [[resource_group_target.resource]] + resource_type = "Microsoft.Test/type1" + metrics = ["metric3"] + aggregations = ["Total", "Average"] + + [[subscription_target]] + resource_type = "Microsoft.Test/type1" + metrics = ["metric1", "metric2", "metric3"] + aggregations = ["Total", "Average"] + + [[subscription_target]] + resource_type = "Microsoft.Test/type2" + metrics = [] + aggregations = ["Average"] + + [[subscription_target]] + resource_type = "Microsoft.Test/type2" + metrics = ["metric2"] + aggregations = [] + + [[subscription_target]] + resource_type = "Microsoft.Test/type2" + metrics = [] + aggregations = [] + + [[subscription_target]] + resource_type = "Microsoft.Test/type1" + metrics = [] + aggregations = [] diff --git a/plugins/inputs/azure_monitor/testdata/toml/init_bad_credentials.toml b/plugins/inputs/azure_monitor/testdata/toml/init_bad_credentials.toml new file mode 100644 index 000000000..c59045c45 --- /dev/null +++ b/plugins/inputs/azure_monitor/testdata/toml/init_bad_credentials.toml @@ -0,0 +1,9 @@ +subscription_id = "subscriptionID" +client_id = "clientID" +client_secret = "clientSecret" +tenant_id = "tenantID" + + [[resource_target]] + resource_id = "resourceGroups/resourceGroup1/providers/Microsoft.Test/type1/resource1" + metrics = [] + aggregations = [] diff --git a/plugins/inputs/azure_monitor/testdata/toml/init_no_client_id.toml b/plugins/inputs/azure_monitor/testdata/toml/init_no_client_id.toml new file mode 100644 index 000000000..3cfcadd69 --- /dev/null +++ b/plugins/inputs/azure_monitor/testdata/toml/init_no_client_id.toml @@ -0,0 +1,8 @@ +subscription_id = "subscriptionID" +client_secret = "clientSecret" +tenant_id = "tenantID" + + [[resource_target]] + resource_id = "resourceGroups/resourceGroup1/providers/Microsoft.Test/type1/resource1" + metrics = [] + aggregations = [] diff --git a/plugins/inputs/azure_monitor/testdata/toml/init_no_client_secret.toml b/plugins/inputs/azure_monitor/testdata/toml/init_no_client_secret.toml new file mode 100644 index 000000000..6505fd773 --- /dev/null +++ b/plugins/inputs/azure_monitor/testdata/toml/init_no_client_secret.toml @@ -0,0 +1,8 @@ +subscription_id = "subscriptionID" +client_id = "clientID" +tenant_id = "tenantID" + + [[resource_target]] + resource_id = "resourceGroups/resourceGroup1/providers/Microsoft.Test/type1/resource1" + metrics = [] + aggregations = [] diff --git a/plugins/inputs/azure_monitor/testdata/toml/init_no_subscription_id.toml b/plugins/inputs/azure_monitor/testdata/toml/init_no_subscription_id.toml new file mode 100644 index 000000000..037c7993e --- /dev/null +++ b/plugins/inputs/azure_monitor/testdata/toml/init_no_subscription_id.toml @@ -0,0 +1,8 @@ +client_id = "clientID" +client_secret = "clientSecret" +tenant_id = "tenantID" + + [[resource_target]] + resource_id = "resourceGroups/resourceGroup1/providers/Microsoft.Test/type1/resource1" + metrics = [] + aggregations = [] diff --git a/plugins/inputs/azure_monitor/testdata/toml/init_no_targets.toml b/plugins/inputs/azure_monitor/testdata/toml/init_no_targets.toml new file mode 100644 index 000000000..eb9703281 --- /dev/null +++ b/plugins/inputs/azure_monitor/testdata/toml/init_no_targets.toml @@ -0,0 +1,4 @@ +subscription_id = "subscriptionID" +client_id = "clientID" +client_secret = "clientSecret" +tenant_id = "tenantID" diff --git a/plugins/inputs/azure_monitor/testdata/toml/init_no_tenant_id.toml b/plugins/inputs/azure_monitor/testdata/toml/init_no_tenant_id.toml new file mode 100644 index 000000000..659e004ac --- /dev/null +++ b/plugins/inputs/azure_monitor/testdata/toml/init_no_tenant_id.toml @@ -0,0 +1,8 @@ +subscription_id = "subscriptionID" +client_id = "clientID" +client_secret = "clientSecret" + + [[resource_target]] + resource_id = "resourceGroups/resourceGroup1/providers/Microsoft.Test/type1/resource1" + metrics = [] + aggregations = [] diff --git a/plugins/inputs/azure_monitor/testdata/toml/init_resource_group_target_no_resource_found.toml b/plugins/inputs/azure_monitor/testdata/toml/init_resource_group_target_no_resource_found.toml new file mode 100644 index 000000000..7990de8c8 --- /dev/null +++ b/plugins/inputs/azure_monitor/testdata/toml/init_resource_group_target_no_resource_found.toml @@ -0,0 +1,12 @@ +subscription_id = "subscriptionID" +client_id = "clientID" +client_secret = "clientSecret" +tenant_id = "tenantID" + + [[resource_group_target]] + resource_group = "resourceGroup2" + + [[resource_group_target.resource]] + resource_type = "Microsoft.Test/type2" + metrics = ["metric1", "metric2"] + aggregations = ["Total"] diff --git a/plugins/inputs/azure_monitor/testdata/toml/init_resource_group_target_with_invalid_aggregation.toml b/plugins/inputs/azure_monitor/testdata/toml/init_resource_group_target_with_invalid_aggregation.toml new file mode 100644 index 000000000..71d71a640 --- /dev/null +++ b/plugins/inputs/azure_monitor/testdata/toml/init_resource_group_target_with_invalid_aggregation.toml @@ -0,0 +1,12 @@ +subscription_id = "subscriptionID" +client_id = "clientID" +client_secret = "clientSecret" +tenant_id = "tenantID" + + [[resource_group_target]] + resource_group = "resourceGroup1" + + [[resource_group_target.resource]] + resource_type = "Microsoft.Test/type1" + metrics = [] + aggregations = ["Invalid"] diff --git a/plugins/inputs/azure_monitor/testdata/toml/init_resource_group_target_with_invalid_metric.toml b/plugins/inputs/azure_monitor/testdata/toml/init_resource_group_target_with_invalid_metric.toml new file mode 100644 index 000000000..3e141ded3 --- /dev/null +++ b/plugins/inputs/azure_monitor/testdata/toml/init_resource_group_target_with_invalid_metric.toml @@ -0,0 +1,12 @@ +subscription_id = "subscriptionID" +client_id = "clientID" +client_secret = "clientSecret" +tenant_id = "tenantID" + + [[resource_group_target]] + resource_group = "resourceGroup1" + + [[resource_group_target.resource]] + resource_type = "Microsoft.Test/type1" + metrics = ["invalid"] + aggregations = [] diff --git a/plugins/inputs/azure_monitor/testdata/toml/init_resource_group_target_with_invalid_resource_group.toml b/plugins/inputs/azure_monitor/testdata/toml/init_resource_group_target_with_invalid_resource_group.toml new file mode 100644 index 000000000..3498c2a5b --- /dev/null +++ b/plugins/inputs/azure_monitor/testdata/toml/init_resource_group_target_with_invalid_resource_group.toml @@ -0,0 +1,12 @@ +subscription_id = "subscriptionID" +client_id = "clientID" +client_secret = "clientSecret" +tenant_id = "tenantID" + + [[resource_group_target]] + resource_group = "invalid" + + [[resource_group_target.resource]] + resource_type = "Microsoft.Test/type1" + metrics = ["metric1", "metric2", "metric3"] + aggregations = ["Total", "Average"] diff --git a/plugins/inputs/azure_monitor/testdata/toml/init_resource_group_target_with_invalid_resource_type.toml b/plugins/inputs/azure_monitor/testdata/toml/init_resource_group_target_with_invalid_resource_type.toml new file mode 100644 index 000000000..ed1c45372 --- /dev/null +++ b/plugins/inputs/azure_monitor/testdata/toml/init_resource_group_target_with_invalid_resource_type.toml @@ -0,0 +1,12 @@ +subscription_id = "subscriptionID" +client_id = "clientID" +client_secret = "clientSecret" +tenant_id = "tenantID" + + [[resource_group_target]] + resource_group = "resourceGroup1" + + [[resource_group_target.resource]] + resource_type = "Microsoft.Test/invalid" + metrics = ["metric1", "metric2", "metric3"] + aggregations = ["Total", "Average"] diff --git a/plugins/inputs/azure_monitor/testdata/toml/init_resource_group_target_with_resource_without_resource_type.toml b/plugins/inputs/azure_monitor/testdata/toml/init_resource_group_target_with_resource_without_resource_type.toml new file mode 100644 index 000000000..0c3d40f45 --- /dev/null +++ b/plugins/inputs/azure_monitor/testdata/toml/init_resource_group_target_with_resource_without_resource_type.toml @@ -0,0 +1,11 @@ +subscription_id = "subscriptionID" +client_id = "clientID" +client_secret = "clientSecret" +tenant_id = "tenantID" + + [[resource_group_target]] + resource_group = "resourceGroup1" + + [[resource_group_target.resource]] + metrics = [] + aggregations = [] diff --git a/plugins/inputs/azure_monitor/testdata/toml/init_resource_group_target_without_resource_group.toml b/plugins/inputs/azure_monitor/testdata/toml/init_resource_group_target_without_resource_group.toml new file mode 100644 index 000000000..1c13d4462 --- /dev/null +++ b/plugins/inputs/azure_monitor/testdata/toml/init_resource_group_target_without_resource_group.toml @@ -0,0 +1,11 @@ +subscription_id = "subscriptionID" +client_id = "clientID" +client_secret = "clientSecret" +tenant_id = "tenantID" + + [[resource_group_target]] + + [[resource_group_target.resource]] + resource_type = "Microsoft.Test/type1" + metrics = [] + aggregations = [] diff --git a/plugins/inputs/azure_monitor/testdata/toml/init_resource_group_target_without_resources.toml b/plugins/inputs/azure_monitor/testdata/toml/init_resource_group_target_without_resources.toml new file mode 100644 index 000000000..facdb3434 --- /dev/null +++ b/plugins/inputs/azure_monitor/testdata/toml/init_resource_group_target_without_resources.toml @@ -0,0 +1,7 @@ +subscription_id = "subscriptionID" +client_id = "clientID" +client_secret = "clientSecret" +tenant_id = "tenantID" + + [[resource_group_target]] + resource_group = "resourceGroup1" diff --git a/plugins/inputs/azure_monitor/testdata/toml/init_resource_group_targets_only.toml b/plugins/inputs/azure_monitor/testdata/toml/init_resource_group_targets_only.toml new file mode 100644 index 000000000..e31c7903f --- /dev/null +++ b/plugins/inputs/azure_monitor/testdata/toml/init_resource_group_targets_only.toml @@ -0,0 +1,40 @@ +subscription_id = "subscriptionID" +client_id = "clientID" +client_secret = "clientSecret" +tenant_id = "tenantID" + + [[resource_group_target]] + resource_group = "resourceGroup1" + + [[resource_group_target.resource]] + resource_type = "Microsoft.Test/type1" + metrics = ["metric1", "metric2", "metric3"] + aggregations = ["Total", "Average"] + + [[resource_group_target.resource]] + resource_type = "Microsoft.Test/type1" + metrics = [] + aggregations = [] + + [[resource_group_target.resource]] + resource_type = "Microsoft.Test/type2" + metrics = [] + aggregations = ["Average"] + + [[resource_group_target.resource]] + resource_type = "Microsoft.Test/type2" + metrics = ["metric2"] + aggregations = [] + + [[resource_group_target.resource]] + resource_type = "Microsoft.Test/type2" + metrics = ["metric2"] + aggregations = [] + + [[resource_group_target]] + resource_group = "resourceGroup2" + + [[resource_group_target.resource]] + resource_type = "Microsoft.Test/type1" + metrics = ["metric3"] + aggregations = ["Total", "Average"] diff --git a/plugins/inputs/azure_monitor/testdata/toml/init_resource_target_with_invalid_aggregation.toml b/plugins/inputs/azure_monitor/testdata/toml/init_resource_target_with_invalid_aggregation.toml new file mode 100644 index 000000000..f647a69f2 --- /dev/null +++ b/plugins/inputs/azure_monitor/testdata/toml/init_resource_target_with_invalid_aggregation.toml @@ -0,0 +1,9 @@ +subscription_id = "subscriptionID" +client_id = "clientID" +client_secret = "clientSecret" +tenant_id = "tenantID" + + [[resource_target]] + resource_id = "resourceGroups/resourceGroup1/providers/Microsoft.Test/type1/resource1" + metrics = ["metric1", "metric2", "metric3"] + aggregations = ["Invalid"] diff --git a/plugins/inputs/azure_monitor/testdata/toml/init_resource_target_with_invalid_metric.toml b/plugins/inputs/azure_monitor/testdata/toml/init_resource_target_with_invalid_metric.toml new file mode 100644 index 000000000..f468e5927 --- /dev/null +++ b/plugins/inputs/azure_monitor/testdata/toml/init_resource_target_with_invalid_metric.toml @@ -0,0 +1,9 @@ +subscription_id = "subscriptionID" +client_id = "clientID" +client_secret = "clientSecret" +tenant_id = "tenantID" + + [[resource_target]] + resource_id = "resourceGroups/resourceGroup1/providers/Microsoft.Test/type1/resource1" + metrics = ["invalid"] + aggregations = [] diff --git a/plugins/inputs/azure_monitor/testdata/toml/init_resource_target_with_invalid_resource_id.toml b/plugins/inputs/azure_monitor/testdata/toml/init_resource_target_with_invalid_resource_id.toml new file mode 100644 index 000000000..b0d154cbe --- /dev/null +++ b/plugins/inputs/azure_monitor/testdata/toml/init_resource_target_with_invalid_resource_id.toml @@ -0,0 +1,9 @@ +subscription_id = "subscriptionID" +client_id = "clientID" +client_secret = "clientSecret" +tenant_id = "tenantID" + + [[resource_target]] + resource_id = "invalid" + metrics = [] + aggregations = [] diff --git a/plugins/inputs/azure_monitor/testdata/toml/init_resource_target_without_resource_id.toml b/plugins/inputs/azure_monitor/testdata/toml/init_resource_target_without_resource_id.toml new file mode 100644 index 000000000..a1a1c90f8 --- /dev/null +++ b/plugins/inputs/azure_monitor/testdata/toml/init_resource_target_without_resource_id.toml @@ -0,0 +1,8 @@ +subscription_id = "subscriptionID" +client_id = "clientID" +client_secret = "clientSecret" +tenant_id = "tenantID" + + [[resource_target]] + metrics = ["metric1", "metric2", "metric3"] + aggregations = ["Total", "Average"] diff --git a/plugins/inputs/azure_monitor/testdata/toml/init_resource_targets_only.toml b/plugins/inputs/azure_monitor/testdata/toml/init_resource_targets_only.toml new file mode 100644 index 000000000..cf7216ed5 --- /dev/null +++ b/plugins/inputs/azure_monitor/testdata/toml/init_resource_targets_only.toml @@ -0,0 +1,29 @@ +subscription_id = "subscriptionID" +client_id = "clientID" +client_secret = "clientSecret" +tenant_id = "tenantID" + + [[resource_target]] + resource_id = "resourceGroups/resourceGroup1/providers/Microsoft.Test/type1/resource1" + metrics = ["metric1", "metric2", "metric3"] + aggregations = ["Total", "Average"] + + [[resource_target]] + resource_id = "resourceGroups/resourceGroup1/providers/Microsoft.Test/type2/resource2" + metrics = ["metric1", "metric2"] + aggregations = [] + + [[resource_target]] + resource_id = "resourceGroups/resourceGroup2/providers/Microsoft.Test/type1/resource3" + metrics = [] + aggregations = ["Total"] + + [[resource_target]] + resource_id = "resourceGroups/resourceGroup1/providers/Microsoft.Test/type2/resource2" + metrics = [] + aggregations = [] + + [[resource_target]] + resource_id = "resourceGroups/resourceGroup1/providers/Microsoft.Test/type1/resource1" + metrics = [] + aggregations = [] diff --git a/plugins/inputs/azure_monitor/testdata/toml/init_subscription_target_no_resource_found.toml b/plugins/inputs/azure_monitor/testdata/toml/init_subscription_target_no_resource_found.toml new file mode 100644 index 000000000..865687c4d --- /dev/null +++ b/plugins/inputs/azure_monitor/testdata/toml/init_subscription_target_no_resource_found.toml @@ -0,0 +1,9 @@ +subscription_id = "subscriptionID" +client_id = "clientID" +client_secret = "clientSecret" +tenant_id = "tenantID" + + [[subscription_target]] + resource_type = "Microsoft.Test/type3" + metrics = ["metric1", "metric2"] + aggregations = ["Total"] diff --git a/plugins/inputs/azure_monitor/testdata/toml/init_subscription_target_with_invalid_aggregation.toml b/plugins/inputs/azure_monitor/testdata/toml/init_subscription_target_with_invalid_aggregation.toml new file mode 100644 index 000000000..13fd12034 --- /dev/null +++ b/plugins/inputs/azure_monitor/testdata/toml/init_subscription_target_with_invalid_aggregation.toml @@ -0,0 +1,9 @@ +subscription_id = "subscriptionID" +client_id = "clientID" +client_secret = "clientSecret" +tenant_id = "tenantID" + + [[subscription_target]] + resource_type = "Microsoft.Test/type1" + metrics = [] + aggregations = ["Invalid"] diff --git a/plugins/inputs/azure_monitor/testdata/toml/init_subscription_target_with_invalid_metric.toml b/plugins/inputs/azure_monitor/testdata/toml/init_subscription_target_with_invalid_metric.toml new file mode 100644 index 000000000..7bbc7b9d5 --- /dev/null +++ b/plugins/inputs/azure_monitor/testdata/toml/init_subscription_target_with_invalid_metric.toml @@ -0,0 +1,9 @@ +subscription_id = "subscriptionID" +client_id = "clientID" +client_secret = "clientSecret" +tenant_id = "tenantID" + + [[subscription_target]] + resource_type = "Microsoft.Test/type1" + metrics = ["invalid"] + aggregations = [] diff --git a/plugins/inputs/azure_monitor/testdata/toml/init_subscription_target_with_invalid_resource_type.toml b/plugins/inputs/azure_monitor/testdata/toml/init_subscription_target_with_invalid_resource_type.toml new file mode 100644 index 000000000..6074d9ad3 --- /dev/null +++ b/plugins/inputs/azure_monitor/testdata/toml/init_subscription_target_with_invalid_resource_type.toml @@ -0,0 +1,9 @@ +subscription_id = "subscriptionID" +client_id = "clientID" +client_secret = "clientSecret" +tenant_id = "tenantID" + + [[subscription_target]] + resource_type = "Microsoft.Test/invalid" + metrics = ["metric1", "metric2", "metric3"] + aggregations = ["Total", "Average"] diff --git a/plugins/inputs/azure_monitor/testdata/toml/init_subscription_target_without_resource_type.toml b/plugins/inputs/azure_monitor/testdata/toml/init_subscription_target_without_resource_type.toml new file mode 100644 index 000000000..01a2d2982 --- /dev/null +++ b/plugins/inputs/azure_monitor/testdata/toml/init_subscription_target_without_resource_type.toml @@ -0,0 +1,8 @@ +subscription_id = "subscriptionID" +client_id = "clientID" +client_secret = "clientSecret" +tenant_id = "tenantID" + + [[subscription_target]] + metrics = ["metric1", "metric2", "metric3"] + aggregations = ["Total", "Average"] diff --git a/plugins/inputs/azure_monitor/testdata/toml/init_subscription_targets_only.toml b/plugins/inputs/azure_monitor/testdata/toml/init_subscription_targets_only.toml new file mode 100644 index 000000000..cf19b1b5d --- /dev/null +++ b/plugins/inputs/azure_monitor/testdata/toml/init_subscription_targets_only.toml @@ -0,0 +1,29 @@ +subscription_id = "subscriptionID" +client_id = "clientID" +client_secret = "clientSecret" +tenant_id = "tenantID" + + [[subscription_target]] + resource_type = "Microsoft.Test/type1" + metrics = ["metric1", "metric2", "metric3"] + aggregations = ["Total", "Average"] + + [[subscription_target]] + resource_type = "Microsoft.Test/type2" + metrics = [] + aggregations = ["Average"] + + [[subscription_target]] + resource_type = "Microsoft.Test/type2" + metrics = ["metric2"] + aggregations = [] + + [[subscription_target]] + resource_type = "Microsoft.Test/type2" + metrics = [] + aggregations = [] + + [[subscription_target]] + resource_type = "Microsoft.Test/type1" + metrics = [] + aggregations = []