|
|
@@ -193,7 +193,19 @@ func handleGetMetrics(req *cwRequest, c *middleware.Context) {
|
|
|
} else {
|
|
|
var err error
|
|
|
assumeRoleArn := req.DataSource.JsonData.Get("assumeRoleArn").MustString()
|
|
|
- if namespaceMetrics, err = getMetricsForCustomMetrics(req.Region, reqParam.Parameters.Namespace, req.DataSource.Database, assumeRoleArn, getAllMetrics); err != nil {
|
|
|
+ accessKey := req.DataSource.JsonData.Get("accessKey").MustString()
|
|
|
+ secretKey := req.DataSource.JsonData.Get("secretKey").MustString()
|
|
|
+
|
|
|
+ cwData := &CloudwatchDatasource{
|
|
|
+ AssumeRoleArn: assumeRoleArn,
|
|
|
+ Region: req.Region,
|
|
|
+ Namespace: reqParam.Parameters.Namespace,
|
|
|
+ Profile: req.DataSource.Database,
|
|
|
+ AccessKey: accessKey,
|
|
|
+ SecretKey: secretKey,
|
|
|
+ }
|
|
|
+
|
|
|
+ if namespaceMetrics, err = getMetricsForCustomMetrics(cwData, getAllMetrics); err != nil {
|
|
|
c.JsonApiErr(500, "Unable to call AWS API", err)
|
|
|
return
|
|
|
}
|
|
|
@@ -227,7 +239,18 @@ func handleGetDimensions(req *cwRequest, c *middleware.Context) {
|
|
|
} else {
|
|
|
var err error
|
|
|
assumeRoleArn := req.DataSource.JsonData.Get("assumeRoleArn").MustString()
|
|
|
- if dimensionValues, err = getDimensionsForCustomMetrics(req.Region, reqParam.Parameters.Namespace, req.DataSource.Database, assumeRoleArn, getAllMetrics); err != nil {
|
|
|
+ accessKey := req.DataSource.JsonData.Get("accessKey").MustString()
|
|
|
+ secretKey := req.DataSource.JsonData.Get("secretKey").MustString()
|
|
|
+
|
|
|
+ cwDatasource := &CloudwatchDatasource{
|
|
|
+ Region: req.Region,
|
|
|
+ Namespace: reqParam.Parameters.Namespace,
|
|
|
+ Profile: req.DataSource.Database,
|
|
|
+ AssumeRoleArn: assumeRoleArn,
|
|
|
+ AccessKey: accessKey,
|
|
|
+ SecretKey: secretKey,
|
|
|
+ }
|
|
|
+ if dimensionValues, err = getDimensionsForCustomMetrics(cwDatasource, getAllMetrics); err != nil {
|
|
|
c.JsonApiErr(500, "Unable to call AWS API", err)
|
|
|
return
|
|
|
}
|
|
|
@@ -242,16 +265,16 @@ func handleGetDimensions(req *cwRequest, c *middleware.Context) {
|
|
|
c.JSON(200, result)
|
|
|
}
|
|
|
|
|
|
-func getAllMetrics(region string, namespace string, database string, assumeRoleArn string) (cloudwatch.ListMetricsOutput, error) {
|
|
|
+func getAllMetrics(cwData *CloudwatchDatasource) (cloudwatch.ListMetricsOutput, error) {
|
|
|
cfg := &aws.Config{
|
|
|
- Region: aws.String(region),
|
|
|
- Credentials: getCredentials(database, region, assumeRoleArn),
|
|
|
+ Region: aws.String(cwData.Region),
|
|
|
+ Credentials: getCredentials(cwData),
|
|
|
}
|
|
|
|
|
|
svc := cloudwatch.New(session.New(cfg), cfg)
|
|
|
|
|
|
params := &cloudwatch.ListMetricsInput{
|
|
|
- Namespace: aws.String(namespace),
|
|
|
+ Namespace: aws.String(cwData.Namespace),
|
|
|
}
|
|
|
|
|
|
var resp cloudwatch.ListMetricsOutput
|
|
|
@@ -272,8 +295,8 @@ func getAllMetrics(region string, namespace string, database string, assumeRoleA
|
|
|
|
|
|
var metricsCacheLock sync.Mutex
|
|
|
|
|
|
-func getMetricsForCustomMetrics(region string, namespace string, database string, assumeRoleArn string, getAllMetrics func(string, string, string, string) (cloudwatch.ListMetricsOutput, error)) ([]string, error) {
|
|
|
- result, err := getAllMetrics(region, namespace, database, assumeRoleArn)
|
|
|
+func getMetricsForCustomMetrics(cwDatasource *CloudwatchDatasource, getAllMetrics func(*CloudwatchDatasource) (cloudwatch.ListMetricsOutput, error)) ([]string, error) {
|
|
|
+ result, err := getAllMetrics(cwDatasource)
|
|
|
if err != nil {
|
|
|
return []string{}, err
|
|
|
}
|
|
|
@@ -281,37 +304,37 @@ func getMetricsForCustomMetrics(region string, namespace string, database string
|
|
|
metricsCacheLock.Lock()
|
|
|
defer metricsCacheLock.Unlock()
|
|
|
|
|
|
- if _, ok := customMetricsMetricsMap[database]; !ok {
|
|
|
- customMetricsMetricsMap[database] = make(map[string]map[string]*CustomMetricsCache)
|
|
|
+ if _, ok := customMetricsMetricsMap[cwDatasource.Profile]; !ok {
|
|
|
+ customMetricsMetricsMap[cwDatasource.Profile] = make(map[string]map[string]*CustomMetricsCache)
|
|
|
}
|
|
|
- if _, ok := customMetricsMetricsMap[database][region]; !ok {
|
|
|
- customMetricsMetricsMap[database][region] = make(map[string]*CustomMetricsCache)
|
|
|
+ if _, ok := customMetricsMetricsMap[cwDatasource.Profile][cwDatasource.Region]; !ok {
|
|
|
+ customMetricsMetricsMap[cwDatasource.Profile][cwDatasource.Region] = make(map[string]*CustomMetricsCache)
|
|
|
}
|
|
|
- if _, ok := customMetricsMetricsMap[database][region][namespace]; !ok {
|
|
|
- customMetricsMetricsMap[database][region][namespace] = &CustomMetricsCache{}
|
|
|
- customMetricsMetricsMap[database][region][namespace].Cache = make([]string, 0)
|
|
|
+ if _, ok := customMetricsMetricsMap[cwDatasource.Profile][cwDatasource.Region][cwDatasource.Namespace]; !ok {
|
|
|
+ customMetricsMetricsMap[cwDatasource.Profile][cwDatasource.Region][cwDatasource.Namespace] = &CustomMetricsCache{}
|
|
|
+ customMetricsMetricsMap[cwDatasource.Profile][cwDatasource.Region][cwDatasource.Namespace].Cache = make([]string, 0)
|
|
|
}
|
|
|
|
|
|
- if customMetricsMetricsMap[database][region][namespace].Expire.After(time.Now()) {
|
|
|
- return customMetricsMetricsMap[database][region][namespace].Cache, nil
|
|
|
+ if customMetricsMetricsMap[cwDatasource.Profile][cwDatasource.Region][cwDatasource.Namespace].Expire.After(time.Now()) {
|
|
|
+ return customMetricsMetricsMap[cwDatasource.Profile][cwDatasource.Region][cwDatasource.Namespace].Cache, nil
|
|
|
}
|
|
|
- customMetricsMetricsMap[database][region][namespace].Cache = make([]string, 0)
|
|
|
- customMetricsMetricsMap[database][region][namespace].Expire = time.Now().Add(5 * time.Minute)
|
|
|
+ customMetricsMetricsMap[cwDatasource.Profile][cwDatasource.Region][cwDatasource.Namespace].Cache = make([]string, 0)
|
|
|
+ customMetricsMetricsMap[cwDatasource.Profile][cwDatasource.Region][cwDatasource.Namespace].Expire = time.Now().Add(5 * time.Minute)
|
|
|
|
|
|
for _, metric := range result.Metrics {
|
|
|
- if isDuplicate(customMetricsMetricsMap[database][region][namespace].Cache, *metric.MetricName) {
|
|
|
+ if isDuplicate(customMetricsMetricsMap[cwDatasource.Profile][cwDatasource.Region][cwDatasource.Namespace].Cache, *metric.MetricName) {
|
|
|
continue
|
|
|
}
|
|
|
- customMetricsMetricsMap[database][region][namespace].Cache = append(customMetricsMetricsMap[database][region][namespace].Cache, *metric.MetricName)
|
|
|
+ customMetricsMetricsMap[cwDatasource.Profile][cwDatasource.Region][cwDatasource.Namespace].Cache = append(customMetricsMetricsMap[cwDatasource.Profile][cwDatasource.Region][cwDatasource.Namespace].Cache, *metric.MetricName)
|
|
|
}
|
|
|
|
|
|
- return customMetricsMetricsMap[database][region][namespace].Cache, nil
|
|
|
+ return customMetricsMetricsMap[cwDatasource.Profile][cwDatasource.Region][cwDatasource.Namespace].Cache, nil
|
|
|
}
|
|
|
|
|
|
var dimensionsCacheLock sync.Mutex
|
|
|
|
|
|
-func getDimensionsForCustomMetrics(region string, namespace string, database string, assumeRoleArn string, getAllMetrics func(string, string, string, string) (cloudwatch.ListMetricsOutput, error)) ([]string, error) {
|
|
|
- result, err := getAllMetrics(region, namespace, database, assumeRoleArn)
|
|
|
+func getDimensionsForCustomMetrics(cwDatasource *CloudwatchDatasource, getAllMetrics func(*CloudwatchDatasource) (cloudwatch.ListMetricsOutput, error)) ([]string, error) {
|
|
|
+ result, err := getAllMetrics(cwDatasource)
|
|
|
if err != nil {
|
|
|
return []string{}, err
|
|
|
}
|
|
|
@@ -319,33 +342,33 @@ func getDimensionsForCustomMetrics(region string, namespace string, database str
|
|
|
dimensionsCacheLock.Lock()
|
|
|
defer dimensionsCacheLock.Unlock()
|
|
|
|
|
|
- if _, ok := customMetricsDimensionsMap[database]; !ok {
|
|
|
- customMetricsDimensionsMap[database] = make(map[string]map[string]*CustomMetricsCache)
|
|
|
+ if _, ok := customMetricsDimensionsMap[cwDatasource.Profile]; !ok {
|
|
|
+ customMetricsDimensionsMap[cwDatasource.Profile] = make(map[string]map[string]*CustomMetricsCache)
|
|
|
}
|
|
|
- if _, ok := customMetricsDimensionsMap[database][region]; !ok {
|
|
|
- customMetricsDimensionsMap[database][region] = make(map[string]*CustomMetricsCache)
|
|
|
+ if _, ok := customMetricsDimensionsMap[cwDatasource.Profile][cwDatasource.Region]; !ok {
|
|
|
+ customMetricsDimensionsMap[cwDatasource.Profile][cwDatasource.Region] = make(map[string]*CustomMetricsCache)
|
|
|
}
|
|
|
- if _, ok := customMetricsDimensionsMap[database][region][namespace]; !ok {
|
|
|
- customMetricsDimensionsMap[database][region][namespace] = &CustomMetricsCache{}
|
|
|
- customMetricsDimensionsMap[database][region][namespace].Cache = make([]string, 0)
|
|
|
+ if _, ok := customMetricsDimensionsMap[cwDatasource.Profile][cwDatasource.Region][cwDatasource.Namespace]; !ok {
|
|
|
+ customMetricsDimensionsMap[cwDatasource.Profile][cwDatasource.Region][cwDatasource.Namespace] = &CustomMetricsCache{}
|
|
|
+ customMetricsDimensionsMap[cwDatasource.Profile][cwDatasource.Region][cwDatasource.Namespace].Cache = make([]string, 0)
|
|
|
}
|
|
|
|
|
|
- if customMetricsDimensionsMap[database][region][namespace].Expire.After(time.Now()) {
|
|
|
- return customMetricsDimensionsMap[database][region][namespace].Cache, nil
|
|
|
+ if customMetricsDimensionsMap[cwDatasource.Profile][cwDatasource.Region][cwDatasource.Namespace].Expire.After(time.Now()) {
|
|
|
+ return customMetricsDimensionsMap[cwDatasource.Profile][cwDatasource.Region][cwDatasource.Namespace].Cache, nil
|
|
|
}
|
|
|
- customMetricsDimensionsMap[database][region][namespace].Cache = make([]string, 0)
|
|
|
- customMetricsDimensionsMap[database][region][namespace].Expire = time.Now().Add(5 * time.Minute)
|
|
|
+ customMetricsDimensionsMap[cwDatasource.Profile][cwDatasource.Region][cwDatasource.Namespace].Cache = make([]string, 0)
|
|
|
+ customMetricsDimensionsMap[cwDatasource.Profile][cwDatasource.Region][cwDatasource.Namespace].Expire = time.Now().Add(5 * time.Minute)
|
|
|
|
|
|
for _, metric := range result.Metrics {
|
|
|
for _, dimension := range metric.Dimensions {
|
|
|
- if isDuplicate(customMetricsDimensionsMap[database][region][namespace].Cache, *dimension.Name) {
|
|
|
+ if isDuplicate(customMetricsDimensionsMap[cwDatasource.Profile][cwDatasource.Region][cwDatasource.Namespace].Cache, *dimension.Name) {
|
|
|
continue
|
|
|
}
|
|
|
- customMetricsDimensionsMap[database][region][namespace].Cache = append(customMetricsDimensionsMap[database][region][namespace].Cache, *dimension.Name)
|
|
|
+ customMetricsDimensionsMap[cwDatasource.Profile][cwDatasource.Region][cwDatasource.Namespace].Cache = append(customMetricsDimensionsMap[cwDatasource.Profile][cwDatasource.Region][cwDatasource.Namespace].Cache, *dimension.Name)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- return customMetricsDimensionsMap[database][region][namespace].Cache, nil
|
|
|
+ return customMetricsDimensionsMap[cwDatasource.Profile][cwDatasource.Region][cwDatasource.Namespace].Cache, nil
|
|
|
}
|
|
|
|
|
|
func isDuplicate(nameList []string, target string) bool {
|