Skip to content

Instantly share code, notes, and snippets.

@zmoog
Last active April 17, 2024 09:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zmoog/fcede6fcbe5ba11f9275c40a58eea38d to your computer and use it in GitHub Desktop.
Save zmoog/fcede6fcbe5ba11f9275c40a58eea38d to your computer and use it in GitHub Desktop.
Azure Metrics Data plane API playground

Azure Metrics Data plane API playground

Here are the environment variables needed to run the test:

export AZURE_TENANT_ID=""
export AZURE_CLIENT_ID=""
export AZURE_CLIENT_SECRET=""
export AZURE_SUBSCRIPTION_ID=""
export AZURE_RESOURCE_GROUP=""

The run the test using the good old:

go run main.go
module github.com/zmoog/azure-metrics-data-plane-api-playground
go 1.21.7
require (
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.2
github.com/Azure/azure-sdk-for-go/sdk/monitor/query/azmetrics v1.0.0
)
require (
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 // indirect
github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2 // indirect
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 // indirect
github.com/golang-jwt/jwt/v5 v5.2.1 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/kylelemons/godebug v1.1.0 // indirect
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect
golang.org/x/crypto v0.22.0 // indirect
golang.org/x/net v0.24.0 // indirect
golang.org/x/sys v0.19.0 // indirect
golang.org/x/text v0.14.0 // indirect
)
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 h1:E+OJmp2tPvt1W+amx48v1eqbjDYsgN+RzP4q16yV5eM=
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1/go.mod h1:a6xsAQUZg+VsS3TJ05SRp524Hs4pZ/AeFSr5ENf0Yjo=
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.2 h1:FDif4R1+UUR+00q6wquyX90K7A8dN+R5E8GEadoP7sU=
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.2/go.mod h1:aiYBYui4BJ/BJCAIKs92XiPyQfTaBWqvHujDwKb6CBU=
github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2 h1:LqbJ/WzJUwBf8UiaSzgX7aMclParm9/5Vgp+TY51uBQ=
github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2/go.mod h1:yInRyqWXAuaPrgI7p70+lDDgh3mlBohis29jGMISnmc=
github.com/Azure/azure-sdk-for-go/sdk/monitor/query/azmetrics v1.0.0 h1:bBCnOz7xAzs6E8dKnRT+aUcpeU7C83QTUGUqf4pVY4g=
github.com/Azure/azure-sdk-for-go/sdk/monitor/query/azmetrics v1.0.0/go.mod h1:8CEqGw/xvDDANXuTg3Zt1PqHzz9ZS3vN/FLUMRnAKI4=
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU=
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI=
github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ=
github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk=
github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ=
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30=
golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=
golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w=
golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o=
golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
// Define the resource group location
param location string = 'eastus2'
// Define a collection of Key Vault names
var keyVaultNames = [for i in range(1, 11): 'kv${i}-${uniqueString(resourceGroup().id)}']
resource keyVaults 'Microsoft.KeyVault/vaults@2021-06-01-preview' = [for (name, i) in keyVaultNames: {
name: name
location: location
properties: {
sku: {
family: 'A'
name: 'standard'
}
tenantId: subscription().tenantId
// Access policies here, if needed
accessPolicies: []
}
// Apply tags or other settings individually if needed, for example, appending the loop index to a tag
tags: {
instance: '${i}'
}
}]
package main
import (
"context"
"fmt"
"log"
"os"
"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
"github.com/Azure/azure-sdk-for-go/sdk/monitor/query/azmetrics"
)
func main() {
credentials, err := azidentity.NewClientSecretCredential(
os.Getenv("AZURE_TENANT_ID"),
os.Getenv("AZURE_CLIENT_ID"),
os.Getenv("AZURE_CLIENT_SECRET"),
nil,
)
if err != nil {
log.Fatal(err)
}
client, err := azmetrics.NewClient(
"https://eastus2.metrics.monitor.azure.com",
credentials,
nil,
)
if err != nil {
log.Fatal(err)
}
fmt.Println("Ready to go!")
subscriptionID := os.Getenv("AZURE_SUBSCRIPTION_ID")
resourceGroup := os.Getenv("AZURE_RESOURCE_GROUP")
namespace := "Microsoft.KeyVault/vaults"
metricNames := []string{
"ServiceApiResult",
}
resourceIDs := []string{
fmt.Sprintf("/subscriptions/%s/resourceGroups/%s/providers/Microsoft.KeyVault/vaults/kv1-oeefrt7tlykau", subscriptionID, resourceGroup),
fmt.Sprintf("/subscriptions/%s/resourceGroups/%s/providers/Microsoft.KeyVault/vaults/kv2-oeefrt7tlykau", subscriptionID, resourceGroup),
fmt.Sprintf("/subscriptions/%s/resourceGroups/%s/providers/Microsoft.KeyVault/vaults/kv3-oeefrt7tlykau", subscriptionID, resourceGroup),
fmt.Sprintf("/subscriptions/%s/resourceGroups/%s/providers/Microsoft.KeyVault/vaults/kv4-oeefrt7tlykau", subscriptionID, resourceGroup),
fmt.Sprintf("/subscriptions/%s/resourceGroups/%s/providers/Microsoft.KeyVault/vaults/kv5-oeefrt7tlykau", subscriptionID, resourceGroup),
fmt.Sprintf("/subscriptions/%s/resourceGroups/%s/providers/Microsoft.KeyVault/vaults/kv6-oeefrt7tlykau", subscriptionID, resourceGroup),
fmt.Sprintf("/subscriptions/%s/resourceGroups/%s/providers/Microsoft.KeyVault/vaults/kv7-oeefrt7tlykau", subscriptionID, resourceGroup),
fmt.Sprintf("/subscriptions/%s/resourceGroups/%s/providers/Microsoft.KeyVault/vaults/kv8-oeefrt7tlykau", subscriptionID, resourceGroup),
fmt.Sprintf("/subscriptions/%s/resourceGroups/%s/providers/Microsoft.KeyVault/vaults/kv9-oeefrt7tlykau", subscriptionID, resourceGroup),
fmt.Sprintf("/subscriptions/%s/resourceGroups/%s/providers/Microsoft.KeyVault/vaults/kv10-oeefrt7tlykau", subscriptionID, resourceGroup),
}
options := azmetrics.QueryResourcesOptions{
Aggregation: ptr("Count"),
StartTime: ptr("2024-04-16T07:18:13.001Z"),
EndTime: ptr("2024-04-16T07:19:13.001Z"),
Filter: ptr("ActivityType eq '*' AND ActivityName eq '*' AND StatusCode eq '*' AND StatusCodeClass eq '*'"),
Interval: ptr("PT1M"),
}
fmt.Println("----------------------------------------------------")
fmt.Println("Querying SINGLE resources")
fmt.Println("----------------------------------------------------")
for _, resourceID := range resourceIDs {
res, err := client.QueryResources(
context.Background(),
subscriptionID,
namespace,
metricNames,
azmetrics.ResourceIDList{
ResourceIDs: []string{resourceID},
},
&options,
)
if err != nil {
log.Fatal(err)
}
displayResponse(res)
}
fmt.Println("----------------------------------------------------")
fmt.Println("Querying resources as a GROUP")
fmt.Println("----------------------------------------------------")
res, err := client.QueryResources(
context.Background(),
subscriptionID,
namespace,
metricNames,
azmetrics.ResourceIDList{
ResourceIDs: resourceIDs,
},
&options,
)
if err != nil {
log.Fatal(err)
}
displayResponse(res)
}
func displayResponse(res azmetrics.QueryResourcesResponse) {
for _, metricData := range res.Values {
fmt.Println(*metricData.ResourceID)
for _, metricValue := range metricData.Values {
fmt.Println("timeseries", len(metricValue.TimeSeries))
}
}
}
func ptr(s string) *string {
return &s
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment