Skip to content

Instantly share code, notes, and snippets.

@Rohitrajak1807
Created June 23, 2022 07:34
Show Gist options
  • Save Rohitrajak1807/47f1a5a6266d122328ebf08998ae83b7 to your computer and use it in GitHub Desktop.
Save Rohitrajak1807/47f1a5a6266d122328ebf08998ae83b7 to your computer and use it in GitHub Desktop.
ARM resources, Metrics.Get example
package main
import (
"bytes"
"context"
"encoding/json"
"log"
"os"
"time"
"github.com/Azure/azure-sdk-for-go/sdk/azcore"
"github.com/Azure/azure-sdk-for-go/sdk/azcore/to"
"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerservice/armcontainerservice"
"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/monitor/armmonitor"
"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources"
)
var (
subscriptionID string
objectID string
clientSecret string
location = "<YOUR-REGION>"
resourceGroupName = "<YOUR-RESOURCE-GROUP>"
managedClustersName = "sample-aks-cluster-basic-lb"
)
func main() {
subscriptionID = os.Getenv("AZURE_SUBSCRIPTION_ID")
if len(subscriptionID) == 0 {
log.Fatal("AZURE_SUBSCRIPTION_ID is not set.")
}
objectID = os.Getenv("AZURE_OBJECT_ID")
if len(objectID) == 0 {
log.Fatal("AZURE_OBJECT_ID is not set.")
}
clientSecret = os.Getenv("AZURE_CLIENT_SECRET")
if len(clientSecret) == 0 {
log.Fatal("AZURE_CLIENT_SECRET is not set.")
}
cred, err := azidentity.NewDefaultAzureCredential(nil)
if err != nil {
log.Fatal(err)
}
ctx := context.Background()
resourceGroup, err := createResourceGroup(ctx, cred)
if err != nil {
log.Fatal(err)
}
log.Println("resources group:", *resourceGroup.ID)
managedCluster, err := createManagedCluster(ctx, cred)
if err != nil {
log.Fatal(err)
}
log.Println("managed cluster:", *managedCluster.ID)
ctx = context.Background()
metrics, err := getClusterMetrics(ctx, cred)
if err != nil {
log.Fatal(err)
}
metricsSerialized, err := metrics.MarshalJSON()
if err != nil {
log.Fatal(err)
}
var responseBuff bytes.Buffer
err = json.Indent(&responseBuff, metricsSerialized, "", " ")
if err != nil {
log.Fatal(err)
}
log.Printf("%v", responseBuff.String())
}
func createManagedCluster(ctx context.Context, cred azcore.TokenCredential) (*armcontainerservice.ManagedCluster, error) {
managedClustersClient, err := armcontainerservice.NewManagedClustersClient(subscriptionID, cred, nil)
if err != nil {
return nil, err
}
pollerResp, err := managedClustersClient.BeginCreateOrUpdate(
ctx,
resourceGroupName,
managedClustersName,
armcontainerservice.ManagedCluster{
Location: to.Ptr(location),
Properties: &armcontainerservice.ManagedClusterProperties{
DNSPrefix: to.Ptr("aksgosdk"),
AgentPoolProfiles: []*armcontainerservice.ManagedClusterAgentPoolProfile{
{
Name: to.Ptr("askagent"),
Count: to.Ptr[int32](1),
VMSize: to.Ptr("Standard_DS2_v2"),
MaxPods: to.Ptr[int32](110),
MinCount: to.Ptr[int32](1),
MaxCount: to.Ptr[int32](100),
OSType: to.Ptr(armcontainerservice.OSTypeLinux),
Type: to.Ptr(armcontainerservice.AgentPoolTypeVirtualMachineScaleSets),
EnableAutoScaling: to.Ptr(true),
Mode: to.Ptr(armcontainerservice.AgentPoolModeSystem),
},
},
NetworkProfile: &armcontainerservice.NetworkProfile{
LoadBalancerSKU: to.Ptr(armcontainerservice.LoadBalancerSKUBasic),
},
ServicePrincipalProfile: &armcontainerservice.ManagedClusterServicePrincipalProfile{
ClientID: to.Ptr(objectID),
Secret: to.Ptr(clientSecret),
},
},
},
nil,
)
if err != nil {
return nil, err
}
resp, err := pollerResp.PollUntilDone(ctx, 10*time.Second)
if err != nil {
return nil, err
}
return &resp.ManagedCluster, nil
}
func createResourceGroup(ctx context.Context, cred azcore.TokenCredential) (*armresources.ResourceGroup, error) {
resourceGroupClient, err := armresources.NewResourceGroupsClient(subscriptionID, cred, nil)
if err != nil {
return nil, err
}
resourceGroupResp, err := resourceGroupClient.CreateOrUpdate(
ctx,
resourceGroupName,
armresources.ResourceGroup{
Location: to.Ptr(location),
},
nil)
if err != nil {
return nil, err
}
return &resourceGroupResp.ResourceGroup, nil
}
func getClusterMetrics(ctx context.Context, cred azcore.TokenCredential) (*armmonitor.MetricsClientListResponse, error) {
client, err := armmonitor.NewMetricsClient(cred, nil)
if err != nil {
log.Fatalf("failed to create client: %v", err)
return nil, err
}
res, err := client.List(ctx,
"<RESOURCE-URI aka RESOURCE-ID>",
&armmonitor.MetricsClientListOptions{
Interval: to.Ptr("PT1H"),
Metricnames: to.Ptr("node_cpu_usage_millicores,node_disk_usage_bytes,node_memory_rss_bytes"),
Aggregation: to.Ptr("Average"),
Top: to.Ptr[int32](3),
})
if err != nil {
log.Fatalf("failed to finish the request: %v", err)
return nil, err
}
return &res, err
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment