2020-04-27 23:43:02 +08:00
package azuremonitor
import (
"fmt"
"net/url"
"testing"
"time"
"github.com/google/go-cmp/cmp"
"github.com/google/go-cmp/cmp/cmpopts"
"github.com/grafana/grafana/pkg/components/simplejson"
"github.com/grafana/grafana/pkg/models"
"github.com/grafana/grafana/pkg/plugins"
"github.com/stretchr/testify/require"
)
func TestBuildingAzureLogAnalyticsQueries ( t * testing . T ) {
datasource := & AzureLogAnalyticsDatasource { }
fromStart := time . Date ( 2018 , 3 , 15 , 13 , 0 , 0 , 0 , time . UTC ) . In ( time . Local )
tests := [ ] struct {
name string
2021-03-08 14:02:49 +08:00
queryModel [ ] plugins . DataSubQuery
timeRange plugins . DataTimeRange
2020-04-27 23:43:02 +08:00
azureLogAnalyticsQueries [ ] * AzureLogAnalyticsQuery
Err require . ErrorAssertionFunc
} {
{
name : "Query with macros should be interpolated" ,
2021-03-08 14:02:49 +08:00
timeRange : plugins . DataTimeRange {
2020-04-27 23:43:02 +08:00
From : fmt . Sprintf ( "%v" , fromStart . Unix ( ) * 1000 ) ,
To : fmt . Sprintf ( "%v" , fromStart . Add ( 34 * time . Minute ) . Unix ( ) * 1000 ) ,
} ,
2021-03-08 14:02:49 +08:00
queryModel : [ ] plugins . DataSubQuery {
2020-04-27 23:43:02 +08:00
{
DataSource : & models . DataSource {
JsonData : simplejson . NewFromAny ( map [ string ] interface { } { } ) ,
} ,
Model : simplejson . NewFromAny ( map [ string ] interface { } {
"queryType" : "Azure Log Analytics" ,
"azureLogAnalytics" : map [ string ] interface { } {
"workspace" : "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee" ,
"query" : "query=Perf | where $__timeFilter() | where $__contains(Computer, 'comp1','comp2') | summarize avg(CounterValue) by bin(TimeGenerated, $__interval), Computer" ,
2021-05-19 16:31:27 +08:00
"resultFormat" : timeSeries ,
2020-04-27 23:43:02 +08:00
} ,
} ) ,
2021-03-08 14:02:49 +08:00
RefID : "A" ,
2020-04-27 23:43:02 +08:00
} ,
} ,
azureLogAnalyticsQueries : [ ] * AzureLogAnalyticsQuery {
{
RefID : "A" ,
2021-05-19 16:31:27 +08:00
ResultFormat : timeSeries ,
2020-04-27 23:43:02 +08:00
URL : "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/query" ,
2020-05-12 01:11:03 +08:00
Model : simplejson . NewFromAny ( map [ string ] interface { } {
"azureLogAnalytics" : map [ string ] interface { } {
"query" : "query=Perf | where $__timeFilter() | where $__contains(Computer, 'comp1','comp2') | summarize avg(CounterValue) by bin(TimeGenerated, $__interval), Computer" ,
2021-05-19 16:31:27 +08:00
"resultFormat" : timeSeries ,
2020-05-12 01:11:03 +08:00
"workspace" : "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee" ,
} ,
} ) ,
Params : url . Values { "query" : { "query=Perf | where ['TimeGenerated'] >= datetime('2018-03-15T13:00:00Z') and ['TimeGenerated'] <= datetime('2018-03-15T13:34:00Z') | where ['Computer'] in ('comp1','comp2') | summarize avg(CounterValue) by bin(TimeGenerated, 34000ms), Computer" } } ,
Target : "query=query%3DPerf+%7C+where+%5B%27TimeGenerated%27%5D+%3E%3D+datetime%28%272018-03-15T13%3A00%3A00Z%27%29+and+%5B%27TimeGenerated%27%5D+%3C%3D+datetime%28%272018-03-15T13%3A34%3A00Z%27%29+%7C+where+%5B%27Computer%27%5D+in+%28%27comp1%27%2C%27comp2%27%29+%7C+summarize+avg%28CounterValue%29+by+bin%28TimeGenerated%2C+34000ms%29%2C+Computer" ,
2020-04-27 23:43:02 +08:00
} ,
} ,
Err : require . NoError ,
} ,
}
for _ , tt := range tests {
t . Run ( tt . name , func ( t * testing . T ) {
queries , err := datasource . buildQueries ( tt . queryModel , tt . timeRange )
tt . Err ( t , err )
2020-05-12 01:11:03 +08:00
if diff := cmp . Diff ( tt . azureLogAnalyticsQueries , queries , cmpopts . IgnoreUnexported ( simplejson . Json { } ) ) ; diff != "" {
2020-04-27 23:43:02 +08:00
t . Errorf ( "Result mismatch (-want +got):\n%s" , diff )
}
} )
}
}
func TestPluginRoutes ( t * testing . T ) {
datasource := & AzureLogAnalyticsDatasource { }
plugin := & plugins . DataSourcePlugin {
Routes : [ ] * plugins . AppPluginRoute {
{
Path : "loganalyticsazure" ,
Method : "GET" ,
URL : "https://api.loganalytics.io/v1/workspaces" ,
Headers : [ ] plugins . AppPluginRouteHeader {
{ Name : "x-ms-app" , Content : "Grafana" } ,
} ,
} ,
{
Path : "chinaloganalyticsazure" ,
Method : "GET" ,
URL : "https://api.loganalytics.azure.cn/v1/workspaces" ,
Headers : [ ] plugins . AppPluginRouteHeader {
{ Name : "x-ms-app" , Content : "Grafana" } ,
} ,
} ,
{
Path : "govloganalyticsazure" ,
Method : "GET" ,
URL : "https://api.loganalytics.us/v1/workspaces" ,
Headers : [ ] plugins . AppPluginRouteHeader {
{ Name : "x-ms-app" , Content : "Grafana" } ,
} ,
} ,
} ,
}
tests := [ ] struct {
name string
cloudName string
expectedProxypass string
expectedRouteURL string
Err require . ErrorAssertionFunc
} {
{
name : "plugin proxy route for the Azure public cloud" ,
cloudName : "azuremonitor" ,
expectedProxypass : "loganalyticsazure" ,
expectedRouteURL : "https://api.loganalytics.io/v1/workspaces" ,
Err : require . NoError ,
} ,
{
name : "plugin proxy route for the Azure China cloud" ,
cloudName : "chinaazuremonitor" ,
expectedProxypass : "chinaloganalyticsazure" ,
expectedRouteURL : "https://api.loganalytics.azure.cn/v1/workspaces" ,
Err : require . NoError ,
} ,
{
name : "plugin proxy route for the Azure Gov cloud" ,
cloudName : "govazuremonitor" ,
expectedProxypass : "govloganalyticsazure" ,
expectedRouteURL : "https://api.loganalytics.us/v1/workspaces" ,
Err : require . NoError ,
} ,
}
for _ , tt := range tests {
t . Run ( tt . name , func ( t * testing . T ) {
route , proxypass , err := datasource . getPluginRoute ( plugin , tt . cloudName )
tt . Err ( t , err )
if diff := cmp . Diff ( tt . expectedRouteURL , route . URL , cmpopts . EquateNaNs ( ) ) ; diff != "" {
t . Errorf ( "Result mismatch (-want +got):\n%s" , diff )
}
if diff := cmp . Diff ( tt . expectedProxypass , proxypass , cmpopts . EquateNaNs ( ) ) ; diff != "" {
t . Errorf ( "Result mismatch (-want +got):\n%s" , diff )
}
} )
}
}