forked from turbot/steampipe
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add several tables for monitoring virtual machine and disk metrics an…
…d update azure-sdk to v55.4.0+incompatible closes turbot#167 (turbot#166) * Add table azure_compute_disk_metric_read_ops closes turbot#161 * Add table azure_compute_disk_metric_read_ops_daily closes turbot#148 * Add table azure_compute_disk_metric_read_ops_hourly closes turbot#162 * Add table azure_compute_disk_metric_write_ops closes turbot#164 * Add table azure_compute_disk_metric_write_ops_daily closes turbot#149 * Add table azure_compute_disk_metric_write_ops_hourly closes turbot#165 * Add table azure_compute_virtual_machine_metric_cpu_utilization closes turbot#159 * Add table azure_compute_virtual_machine_metric_cpu_utilization_daily closes turbot#147 * Add table azure_compute_virtual_machine_metric_cpu_utilization_hourly closes turbot#160
- Loading branch information
Showing
23 changed files
with
968 additions
and
71 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,164 @@ | ||
package azure | ||
|
||
import ( | ||
"context" | ||
"strings" | ||
"time" | ||
|
||
"github.com/Azure/azure-sdk-for-go/services/preview/monitor/mgmt/2021-04-01-preview/insights" | ||
"github.com/turbot/steampipe-plugin-sdk/grpc/proto" | ||
"github.com/turbot/steampipe-plugin-sdk/plugin" | ||
"github.com/turbot/steampipe-plugin-sdk/plugin/transform" | ||
) | ||
|
||
type monitoringMetric struct { | ||
// Resource Name | ||
DimensionValue string | ||
// MetadataValue represents a metric metadata value. | ||
MetaData *insights.MetadataValue | ||
// Metric the result data of a query. | ||
Metric *insights.Metric | ||
// The maximum metric value for the data point. | ||
Maximum *float64 | ||
// The minimum metric value for the data point. | ||
Minimum *float64 | ||
// The average of the metric values that correspond to the data point. | ||
Average *float64 | ||
// The number of metric values that contributed to the aggregate value of this data point. | ||
SampleCount *float64 | ||
// The sum of the metric values for the data point. | ||
Sum *float64 | ||
// The time stamp used for the data point. | ||
TimeStamp string | ||
// The units in which the metric value is reported. | ||
Unit string | ||
} | ||
|
||
//// TABLE DEFINITION | ||
|
||
func monitoringMetricColumns(columns []*plugin.Column) []*plugin.Column { | ||
return append(columns, commonMonitoringMetricColumns()...) | ||
} | ||
|
||
func commonMonitoringMetricColumns() []*plugin.Column { | ||
return []*plugin.Column{ | ||
{ | ||
Name: "maximum", | ||
Description: "The maximum metric value for the data point.", | ||
Type: proto.ColumnType_DOUBLE, | ||
}, | ||
{ | ||
Name: "minimum", | ||
Description: "The minimum metric value for the data point.", | ||
Type: proto.ColumnType_DOUBLE, | ||
}, | ||
{ | ||
Name: "average", | ||
Description: "The average of the metric values that correspond to the data point.", | ||
Type: proto.ColumnType_DOUBLE, | ||
}, | ||
{ | ||
Name: "sample_count", | ||
Description: "The number of metric values that contributed to the aggregate value of this data point.", | ||
Type: proto.ColumnType_DOUBLE, | ||
}, | ||
{ | ||
Name: "sum", | ||
Description: "The sum of the metric values for the data point.", | ||
Type: proto.ColumnType_DOUBLE, | ||
}, | ||
{ | ||
Name: "timestamp", | ||
Description: "The time stamp used for the data point.", | ||
Type: proto.ColumnType_TIMESTAMP, | ||
Transform: transform.FromField("TimeStamp"), | ||
}, | ||
{ | ||
Name: "unit", | ||
Description: "The units in which the metric value is reported.", | ||
Type: proto.ColumnType_STRING, | ||
}, | ||
{ | ||
Name: "resource_group", | ||
Description: ColumnDescriptionResourceGroup, | ||
Type: proto.ColumnType_STRING, | ||
Transform: transform.FromField("DimensionValue").Transform(extractResourceGroupFromID), | ||
}, | ||
{ | ||
Name: "subscription_id", | ||
Description: ColumnDescriptionSubscription, | ||
Type: proto.ColumnType_STRING, | ||
Transform: transform.FromField("DimensionValue").Transform(idToSubscriptionID), | ||
}, | ||
} | ||
} | ||
|
||
func getMonitoringIntervalForGranularity(granularity string) string { | ||
switch strings.ToUpper(granularity) { | ||
case "DAILY": | ||
// 24 hours | ||
return "PT24H" | ||
case "HOURLY": | ||
// 1 hour | ||
return "PT1H" | ||
} | ||
// else 5 minutes | ||
return "PT5M" | ||
} | ||
|
||
func getMonitoringStartDateForGranularity(granularity string) string { | ||
switch strings.ToUpper(granularity) { | ||
case "DAILY": | ||
// Last 1 year | ||
return time.Now().UTC().AddDate(-1, 0, 0).Format(time.RFC3339) | ||
case "HOURLY": | ||
// Last 60 days | ||
return time.Now().UTC().AddDate(0, 0, -60).Format(time.RFC3339) | ||
} | ||
// Last 5 days | ||
return time.Now().UTC().AddDate(0, 0, -5).Format(time.RFC3339) | ||
} | ||
|
||
func listAzureMonitorMetricStatistics(ctx context.Context, d *plugin.QueryData, granularity string, metricNameSpace string, metricNames string, dimensionValue string) (interface{}, error) { | ||
session, err := GetNewSession(ctx, d, "MANAGEMENT") | ||
if err != nil { | ||
return nil, err | ||
} | ||
subscriptionID := session.SubscriptionID | ||
|
||
monitoringClient := insights.NewMetricsClient(subscriptionID) | ||
monitoringClient.Authorizer = session.Authorizer | ||
|
||
// Define param values | ||
interval := getMonitoringIntervalForGranularity(granularity) | ||
aggregation := "average,count,maximum,minimum,total" | ||
timeSpan := getMonitoringStartDateForGranularity(granularity) + "/" + time.Now().UTC().AddDate(0, 0, 1).Format(time.RFC3339) // Retrieve data within a year | ||
orderBy := "timestamp" | ||
top := int32(1000) // Maximum number of record fetch with given interval | ||
filter := "" | ||
|
||
result, err := monitoringClient.List(ctx, dimensionValue, timeSpan, &interval, metricNames, aggregation, &top, orderBy, filter, insights.ResultTypeData, metricNameSpace) | ||
if err != nil { | ||
return nil, err | ||
} | ||
for _, metric := range *result.Value { | ||
for _, timeseries := range *metric.Timeseries { | ||
for _, data := range *timeseries.Data { | ||
if data.Average != nil { | ||
d.StreamListItem(ctx, &monitoringMetric{ | ||
DimensionValue: dimensionValue, | ||
TimeStamp: data.TimeStamp.Format(time.RFC3339), | ||
Maximum: data.Maximum, | ||
Minimum: data.Minimum, | ||
Average: data.Average, | ||
Sum: data.Total, | ||
SampleCount: data.Count, | ||
Unit: string(metric.Unit), | ||
}) | ||
} | ||
} | ||
} | ||
} | ||
|
||
return nil, nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
package azure | ||
|
||
import ( | ||
"context" | ||
|
||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2020-06-01/compute" | ||
"github.com/turbot/steampipe-plugin-sdk/grpc/proto" | ||
"github.com/turbot/steampipe-plugin-sdk/plugin" | ||
"github.com/turbot/steampipe-plugin-sdk/plugin/transform" | ||
) | ||
|
||
//// TABLE DEFINITION | ||
|
||
func tableComputeDisksReadOpsMetric(_ context.Context) *plugin.Table { | ||
return &plugin.Table{ | ||
Name: "azure_compute_disk_metric_read_ops", | ||
Description: "Azure Compute Disk Metrics - Read Ops", | ||
List: &plugin.ListConfig{ | ||
ParentHydrate: listAzureComputeDisks, | ||
Hydrate: listComputeDiskMetricReadOps, | ||
}, | ||
Columns: monitoringMetricColumns([]*plugin.Column{ | ||
{ | ||
Name: "name", | ||
Description: "The name of the disk.", | ||
Type: proto.ColumnType_STRING, | ||
Transform: transform.FromField("DimensionValue").Transform(lastPathElement), | ||
}, | ||
}), | ||
} | ||
} | ||
|
||
//// LIST FUNCTION | ||
|
||
func listComputeDiskMetricReadOps(ctx context.Context, d *plugin.QueryData, h *plugin.HydrateData) (interface{}, error) { | ||
diskInfo := h.Item.(compute.Disk) | ||
|
||
return listAzureMonitorMetricStatistics(ctx, d, "FIVE_MINUTES", "Microsoft.Compute/disks", "Composite Disk Read Operations/sec", *diskInfo.ID) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
package azure | ||
|
||
import ( | ||
"context" | ||
|
||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2020-06-01/compute" | ||
"github.com/turbot/steampipe-plugin-sdk/grpc/proto" | ||
"github.com/turbot/steampipe-plugin-sdk/plugin" | ||
"github.com/turbot/steampipe-plugin-sdk/plugin/transform" | ||
) | ||
|
||
//// TABLE DEFINITION | ||
|
||
func tableComputeDisksReadOpsMetricDaily(_ context.Context) *plugin.Table { | ||
return &plugin.Table{ | ||
Name: "azure_compute_disk_metric_read_ops_daily", | ||
Description: "Azure Compute Disk Metrics - Read Ops (Daily)", | ||
List: &plugin.ListConfig{ | ||
ParentHydrate: listAzureComputeDisks, | ||
Hydrate: listComputeDiskMetricReadOpsDaily, | ||
}, | ||
Columns: monitoringMetricColumns([]*plugin.Column{ | ||
{ | ||
Name: "name", | ||
Description: "The name of the disk.", | ||
Type: proto.ColumnType_STRING, | ||
Transform: transform.FromField("DimensionValue").Transform(lastPathElement), | ||
}, | ||
}), | ||
} | ||
} | ||
|
||
//// LIST FUNCTION | ||
|
||
func listComputeDiskMetricReadOpsDaily(ctx context.Context, d *plugin.QueryData, h *plugin.HydrateData) (interface{}, error) { | ||
diskInfo := h.Item.(compute.Disk) | ||
|
||
return listAzureMonitorMetricStatistics(ctx, d, "DAILY", "Microsoft.Compute/disks", "Composite Disk Read Operations/sec", *diskInfo.ID) | ||
} |
Oops, something went wrong.