mirror of
https://github.com/grafana/grafana.git
synced 2024-11-26 02:40:26 -06:00
7e95ded164
* feat: AzureMonitor implements legend key on backend To be able to remove the duplicated query logic on the frontend, the backend code needs to implement alias patterns for legend keys as well as allowing the default list of allowed time grains to be overridden. Some metrics do not support all the time grains and the auto timegrain calculation can be incorrect if the list is not overridden. * feat: AzureMonitor - removes duplicate query logic on frontend * AzureMonitor small refactoring Extracted method and tidied up the auto time grain code. * azuremonitor: support for auto time grains for alerting Converts allowed timegrains into ms and saves in dashboard json. This makes queries for alerting with an auto time grain work in the same way as the frontend. * chore: typings -> implicitAny count down to 3413 * azuremonitor: add more typings
74 lines
1.9 KiB
Go
74 lines
1.9 KiB
Go
package azuremonitor
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"net/http"
|
|
"regexp"
|
|
|
|
"github.com/grafana/grafana/pkg/infra/log"
|
|
"github.com/grafana/grafana/pkg/models"
|
|
"github.com/grafana/grafana/pkg/tsdb"
|
|
)
|
|
|
|
var (
|
|
azlog log.Logger
|
|
legendKeyFormat *regexp.Regexp
|
|
)
|
|
|
|
// AzureMonitorExecutor executes queries for the Azure Monitor datasource - all four services
|
|
type AzureMonitorExecutor struct {
|
|
httpClient *http.Client
|
|
dsInfo *models.DataSource
|
|
}
|
|
|
|
// NewAzureMonitorExecutor initializes a http client
|
|
func NewAzureMonitorExecutor(dsInfo *models.DataSource) (tsdb.TsdbQueryEndpoint, error) {
|
|
httpClient, err := dsInfo.GetHttpClient()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &AzureMonitorExecutor{
|
|
httpClient: httpClient,
|
|
dsInfo: dsInfo,
|
|
}, nil
|
|
}
|
|
|
|
func init() {
|
|
azlog = log.New("tsdb.azuremonitor")
|
|
tsdb.RegisterTsdbQueryEndpoint("grafana-azure-monitor-datasource", NewAzureMonitorExecutor)
|
|
legendKeyFormat = regexp.MustCompile(`\{\{\s*(.+?)\s*\}\}`)
|
|
}
|
|
|
|
// Query takes in the frontend queries, parses them into the query format
|
|
// expected by chosen Azure Monitor service (Azure Monitor, App Insights etc.)
|
|
// executes the queries against the API and parses the response into
|
|
// the right format
|
|
func (e *AzureMonitorExecutor) Query(ctx context.Context, dsInfo *models.DataSource, tsdbQuery *tsdb.TsdbQuery) (*tsdb.Response, error) {
|
|
var result *tsdb.Response
|
|
var err error
|
|
|
|
var azureMonitorQueries []*tsdb.Query
|
|
|
|
for _, query := range tsdbQuery.Queries {
|
|
queryType := query.Model.Get("queryType").MustString("")
|
|
|
|
switch queryType {
|
|
case "Azure Monitor":
|
|
azureMonitorQueries = append(azureMonitorQueries, query)
|
|
default:
|
|
return nil, fmt.Errorf("Alerting not supported for %s", queryType)
|
|
}
|
|
}
|
|
|
|
azDatasource := &AzureMonitorDatasource{
|
|
httpClient: e.httpClient,
|
|
dsInfo: e.dsInfo,
|
|
}
|
|
|
|
result, err = azDatasource.executeTimeSeriesQuery(ctx, azureMonitorQueries, tsdbQuery.TimeRange)
|
|
|
|
return result, err
|
|
}
|