Terraform AWS Dashboard - Widgets from nested list - terraform

Terraform beginner here. I am trying to create some widgets from a nested list. Group will be a "label" widget indicating the group followed by the metric widgets for the canaries related to the group. So the dashboard should look as follows:
Group 1
widget1, widget2 etc.
Group 2
widget3, widget4 etc.
Variable value:
dashboard = [
{
name = "Group-1",
canaries = ["canary1", "canary2", "canary3"]
},
{
name = "Group-2",
canaries = ["canary4", "canary5"]
}
]
Attempt at building json:
locals {
body = [for group in var.dashboard :
#Create text widget for Group name
{
"height": 1,
"width": 24,
"y": 4,
"x": 0,
"type": "text",
"properties": {
"markdown": "\n# > [${group.name}]\n"
}
}
#Attempt to create underlying widgets for group
[for canary in group.canaries :
{
{
"height": 3,
"width": 6,
"y": 5,
"x": 0,
"type": "metric",
"properties": {
"metrics": [
[ "CloudWatchSynthetics", "Failed", "CanaryName", "${canary}", { "label": "Canary failures count", "region": "us-west-2" } ]
],
"title": "Failed canary runs",
"period": 60,
"region": "us-west-2",
"stat": "Sum",
"view": "singleValue",
"setPeriodToTimeRange": true
}
}
}
] #TF Doesn't like the inclusion of nested loop here or my syntax is incorrect.
]
}
Resource creation:
resource "aws_cloudwatch_dashboard" "canary_dashboard" {
dashboard_name = "Canary-Dashboard"
dashboard_body = jsonencode({
"widgets": concat(local.body)
})
}
In my creation of body, Terraform complains about Missing close bracket on index, but I have triple checked that I am not missing a bracket or curly brace. How do I dynamically create the dashboard widgets from nested lists?
Edit
Including desired json output below as suggested by Jordan. In the end, there will be n number of groups, each having n number of canaries belonging to said group.
{
"widgets": [
{
"height": 1,
"width": 24,
"y": 4,
"x": 0,
"type": "text",
"properties": {
"markdown": "\n# Group1\n"
}
},
{
"height": 3,
"width": 6,
"y": 5,
"x": 6,
"type": "metric",
"properties": {
"metrics": [
[ "CloudWatchSynthetics", "Failed", "CanaryName", "Group1-Canary", { "label": "Canary failures count", "region": "us-west-2" } ]
],
"title": "Failed canary runs",
"period": 60,
"region": "us-west-2",
"stat": "Sum",
"view": "singleValue",
"setPeriodToTimeRange": true
}
},
{
"height": 1,
"width": 24,
"y": 4,
"x": 0,
"type": "text",
"properties": {
"markdown": "\n# Group2\n"
}
},
{
"height": 3,
"width": 6,
"y": 5,
"x": 6,
"type": "metric",
"properties": {
"metrics": [
[ "CloudWatchSynthetics", "Failed", "CanaryName", "Group2-Canary", { "label": "Canary failures count", "region": "us-west-2" } ]
],
"title": "Failed canary runs",
"period": 60,
"region": "us-west-2",
"stat": "Sum",
"view": "singleValue",
"setPeriodToTimeRange": true
}
},
]
}

You're trying to do something with list comprehension that Terraform doesn't allow (see where I've marked "HERE"):
locals {
body = [for group in var.dashboard :
#Create text widget for Group name
{
"height": 1,
"width": 24,
"y": 4,
"x": 0,
"type": "text",
"properties": {
"markdown": "\n# > [${group.name}]\n"
}
} <===== HERE
#Attempt to create underlying widgets for group
[for canary in group.canaries :
{
{
"height": 3,
"width": 6,
"y": 5,
"x": 0,
"type": "metric",
"properties": {
"metrics": [
[ "CloudWatchSynthetics", "Failed", "CanaryName", "${canary}", { "label": "Canary failures count", "region": "us-west-2" } ]
],
"title": "Failed canary runs",
"period": 60,
"region": "us-west-2",
"stat": "Sum",
"view": "singleValue",
"setPeriodToTimeRange": true
}
}
}
] #TF Doesn't like the inclusion of nested loop here or my syntax is incorrect.
]
}
If TF allowed you to do what you're trying to do, you'd end up with something like:
body = [
{
"height": 1,
"width": 24,
"y": 4,
"x": 0,
"type": "text",
"properties": {
"markdown": "\n# > [${group.name}]\n"
}
},
[
{
{
"height": 3,
"width": 6,
"y": 5,
"x": 0,
"type": "metric",
"properties": {
"metrics": [
[ "CloudWatchSynthetics", "Failed", "CanaryName", "${canary}", { "label": "Canary failures count", "region": "us-west-2" } ]
],
"title": "Failed canary runs",
"period": 60,
"region": "us-west-2",
"stat": "Sum",
"view": "singleValue",
"setPeriodToTimeRange": true
}
}
},
{
{
"height": 3,
"width": 6,
"y": 5,
"x": 0,
"type": "metric",
"properties": {
"metrics": [
[ "CloudWatchSynthetics", "Failed", "CanaryName", "${canary}", { "label": "Canary failures count", "region": "us-west-2" } ]
],
"title": "Failed canary runs",
"period": 60,
"region": "us-west-2",
"stat": "Sum",
"view": "singleValue",
"setPeriodToTimeRange": true
}
}
}
]
]
And I doubt that's what you're trying to do. If you can provide a sample of what you'd like the JSON to look like, we can show you how to achieve it.

Related

Updating dictionary in Python

I'm working on a project where I will retrieve data from various files and this data will then be written down in a file in geojson format.
Below you see a simplified example of some of the code and output:
Code:
def get_data(data):
features = {
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
data["lat"],
data["long"],
],
},
"properties": {
"obsid": data["file_name"],
"name": data["guid_id"],
"h_gs": data["z"],
},
}
],
}
for id, top, bot, code in zip(
data["id"],
data["top"],
data["bot"],
data["code"],
):
info = {
id: {
"top": top,
"bot": bot,
"code": code,
},
}
features["features"].append(info)
return features
def main(data):
data = get_data(data)
to_json = json.dumps(data, indent=4)
print(to_json)
if __name__ == "__main__":
# example data
data = {
"lat": 40.730610,
"long": -73.935242,
"z": 28.37,
"file_name": "tmrx.txt",
"guid_id": "d4d5b10a-c5fc-450a-9b3b-f309e7cb9613",
"id": ["id_0", "id_1", "id_2", "id_3", "id_4"],
"top": [100, 200, 300, 400, 500],
"bot": [90, 190, 290, 390, 490],
"code": ["a", "b", "c", "d", "e"],
}
main(data)
Output:
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
40.73061,
-73.935242
]
},
"properties": {
"obsid": "tmrx.txt",
"name": "d4d5b10a-c5fc-450a-9b3b-f309e7cb9613",
"h_gs": 28.37
}
},
{
"id_0": {
"top": 100,
"bot": 90,
"code": "a"
}
},
{
"id_1": {
"top": 200,
"bot": 190,
"code": "b"
}
},
{
"id_2": {
"top": 300,
"bot": 290,
"code": "c"
}
},
{
"id_3": {
"top": 400,
"bot": 390,
"code": "d"
}
},
{
"id_4": {
"top": 500,
"bot": 490,
"code": "e"
}
}
]
}
This works fine but I wish I could get the output to look a little different.
Desired output:
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
40.73061,
-73.935242
]
},
"properties": {
"obsid": "tmrx.txt",
"name": "d4d5b10a-c5fc-450a-9b3b-f309e7cb9613",
"h_gs": 28.37
}
"id_0": {
"top": 100,
"bot": 90,
"code": "a"
}
"id_1": {
"top": 200,
"bot": 190,
"code": "b"
}
"id_2": {
"top": 300,
"bot": 290,
"code": "c"
}
"id_3": {
"top": 400,
"bot": 390,
"code": "d"
}
"id_4": {
"top": 500,
"bot": 490,
"code": "e"
}
}
]
}
There, the 'unnecessary' brackets are removed.
Does anyone here on the forum know how i could achieve this result in the above code?
Best Regards,
Mikael
See the code sample above.
Change below Line in your code
features["features"].append(info)
To this
features["features"][0] |= info
Instead of features["features"].append(info) use:
features["features"][0].update(info)

How to format grafana Alert on teams via webhooks

when the alert is sent to my team’s channel, the pipeline name is truncated [see image below]
alert on teams triggerd on grafana
I would like to know if there is anything I can do to make the entire variable name appear
I’m using grafana v7.5 and my data comes from Azure logs
{
"firing": true,
"state": "pending",
"conditionEvals": "true = true",
"timeMs": "430.287ms",
"matches": [
{
"metric": "n {PipelineName=PPLCRGLOADORLTOAPOSENTEVT}",
"value": 11
}
],
"logs": [
{
"message": "Condition[0]: Query",
"data": {
"from":number,
"queries": [
{
"refId": "A",
"model": {
"appInsights": {
"dimension": [],
"metricName": "select",
"timeGrain": "auto"
},
"azureLogAnalytics": {
"query": "ADFActivityRun\r\n| where (Status == 'Failed') and (substring(ResourceId,135,3) == 'PRD') and TimeGenerated > ago(8h)\r\n| summarize n=count() by bin(TimeGenerated, 5min),PipelineName\r\n\r\n| project n,TimeGenerated,PipelineName",
"resultFormat": "time_series",
"workspace": "workspace"
},
"azureMonitor": {
"aggOptions": [],
"dimensionFilter": "*",
"dimensionFilters": [],
"metricDefinition": "select",
"metricName": "select",
"metricNamespace": "select",
"resourceGroup": "select",
"resourceName": "select",
"timeGrain": "auto",
"timeGrains": [],
"top": "10"
},
"insightsAnalytics": {
"query": "",
"resultFormat": "time_series"
},
"queryType": "Azure Log Analytics",
"refId": "A",
"subscription": "subscription"
},
"datasource": {
"id": 3,
"name": "LA-DATAANALYTICS-PRD"
},
"maxDataPoints": 0,
"intervalMs": 0
}
],
"to": #number
}
},
{
"message": "Condition[0]: Query Result",
"data": {
"fromDataframe": true,
"series": [
{
"name": "n {PipelineName=PPLCRGLOADORLTOAPOSENTEVT}",
"points": [
[
1,
1628064600000
],
[
1,
1628064900000
],
[
1,
1628065200000
],
[
1,
1628065500000
],
[
1,
1628065800000
],
[
1,
1628066100000
],
[
1,
1628066700000
],
[
1,
1628067000000
],
[
1,
1628067300000
],
[
1,
1628067600000
],
[
2,
1628067900000
]
],
"tags": {
"PipelineName": "PPLCRGLOADORLTOAPOSENTEVT"
}
}
]
}
},
{
"message": "Condition[0]: Eval: true, Metric: n {PipelineName=PPLCRGLOADORLTOAPOSENTEVT}, Value: 11.000",
"data": null
}
]
}
Here is the JSON generated by test rule
And the length of pipeline name is something like 25 chars
(PPLCRGLOADORLTOAPOSENTEVT)

How do I apply conditional formatting in .map() in nodejs?

I have the below data
[
{
"ID": "1",
"SIZE": 2.21,
"Metal": "Steel",
"Class": "Non magnetic",
"Density":3.9,
},
{
"ID": "2",
"SIZE": 1.25,
"Metal": "Iron",
"Class": "magnetic",
"Density":4.2,
},
{
"ID": "3",
"SIZE": 15.5,
"Metal": "Water",
"Class": "non magnetic",
"Density": 1.3,
},
{
"ID": "4",
"SIZE": 9.5,
"Metal": "Steel",
"Class": "non magnetic",
"Density": 1.2,
}
{
"ID": "5",
"SIZE": 3.2,
"Metal": "Water",
"Class": "non magnetic",
"Density": 1.0,
}
]
Goal is to create a new map and filter the data. If name is steel or iron, we need to get the size from the previous object . Likewise if metal is water, then we need to the skip the currect object and check in the next value in the next object. If the subsequent values are water too, then we need to return "Invalid". I tried the below piece of code but it is not returning the desired output
data.map((temp, i) =>{
if (temp.METAL.toUpperCase() != 'WATER')
{
res.push({
ID: temp.ID,
SIZE: temp.SIZE,
Priortosize: data[i + 1] ? data[i + 1].SIZE: "Invalid",
Metal: temp.METAL
Class: temp.CLASS,
Density: temp.DENSITY
})
}
})
It returns empty value if the last metal is water. Can you please help?
First, Javascript is a case-sensitive language.
data.Metal != data.METAL
Use data.Metal, just as it is in the data object.
I also saw that you forgot some commas in your example, both in the data object and in the push of your code.
data = [
{
"ID": "1",
"SIZE": 2.21,
"Metal": "Steel",
"Class": "Non magnetic",
"Density":3.9,
},
{
"ID": "2",
"SIZE": 1.25,
"Metal": "Iron",
"Class": "magnetic",
"Density":4.2,
},
{
"ID": "3",
"SIZE": 15.5,
"Metal": "Water",
"Class": "non magnetic",
"Density": 1.3,
},
{
"ID": "4",
"SIZE": 9.5,
"Metal": "Steel",
"Class": "non magnetic",
"Density": 1.2,
},
{
"ID": "5",
"SIZE": 3.2,
"Metal": "Water",
"Class": "non magnetic",
"Density": 1.0,
}
]
res = []
data.map((temp, i) =>{
if (temp.Metal.toUpperCase() != 'WATER')
{
res.push({
ID: temp.ID,
SIZE: temp.SIZE,
Priortosize: data[i + 1] ? data[i + 1].SIZE: "Invalid",
Metal: temp.Metal,
Class: temp.Class,
Density: temp.Density
})
}
})
console.log(JSON.stringify(res, null, 0))

How to I return a json object along with totals in mongoose?

I have a database of exercises in a workout tracker, and when I do a find(), the result is this:
[
{
"_id": "5e9dacbb6512969974bd5b2d",
"day": "2020-04-10T14:07:55.905Z",
"exercises": [
{
"type": "resistance",
"name": "Bicep Curl",
"duration": 20,
"weight": 100,
"reps": 10,
"sets": 4
}
]
},
{
"_id": "5e9dacbb6512969974bd5b2e",
"day": "2020-04-11T14:07:55.916Z",
"exercises": [
{
"type": "resistance",
"name": "Lateral Pull",
"duration": 20,
"weight": 300,
"reps": 10,
"sets": 4
}
]
},
{
"_id": "5e9dacbb6512969974bd5b2f",
"day": "2020-04-12T14:07:55.916Z",
"exercises": [
{
"type": "resistance",
"name": "Push Press",
"duration": 25,
"weight": 185,
"reps": 8,
"sets": 4
}
]
},
{
"_id": "5e9dacbb6512969974bd5b30",
"day": "2020-04-13T14:07:55.916Z",
"exercises": [
{
"type": "cardio",
"name": "Running",
"duration": 25,
"distance": 4
}
]
},
{
"_id": "5e9dacbb6512969974bd5b31",
"day": "2020-04-14T14:07:55.916Z",
"exercises": [
{
"type": "resistance",
"name": "Bench Press",
"duration": 20,
"weight": 285,
"reps": 10,
"sets": 4
}
]
},
{
"_id": "5e9dacbb6512969974bd5b32",
"day": "2020-04-15T14:07:55.916Z",
"exercises": [
{
"type": "resistance",
"name": "Bench Press",
"duration": 20,
"weight": 300,
"reps": 10,
"sets": 4
}
]
},
{
"_id": "5e9dacbb6512969974bd5b33",
"day": "2020-04-16T14:07:55.916Z",
"exercises": [
{
"type": "resistance",
"name": "Quad Press",
"duration": 30,
"weight": 300,
"reps": 10,
"sets": 4
}
]
},
{
"_id": "5e9dacbb6512969974bd5b34",
"day": "2020-04-17T14:07:55.916Z",
"exercises": [
{
"type": "resistance",
"name": "Bench Press",
"duration": 20,
"weight": 300,
"reps": 10,
"sets": 4
}
]
},
{
"_id": "5e9dacbb6512969974bd5b35",
"day": "2020-04-18T14:07:55.916Z",
"exercises": [
{
"type": "resistance",
"name": "Military Press",
"duration": 20,
"weight": 300,
"reps": 10,
"sets": 4
}
]
},
{
"_id": "5e9dacbb6512969974bd5b36",
"day": "2020-04-19T14:07:55.916Z",
"exercises": [
{
"type": "resistance",
"name": "Bench",
"duration": 30,
"distance": 2
}
]
}
]
Then I need to get total sums of statistics from each exercise, so I used mongoose aggregate to give me this data:
[
{
"_id": null,
"totalDuration": 230,
"totalWeight": 2070,
"totalSets": 32,
"totalReps": 78,
"totalDistance": 6
}
]
I want to combine these two results in one GET request, ideally doing something similar to a push where I just push the totals at the end of the first JSON object. How do I achieve this?
Something like this:
function mergeResults(resultFromFindQuery, totalSums){
var allData = {};
allData['mongoFindresult'] = resultFromFindQuery;
allData['totalSums'] = totalSums;
return allData;
}
Then use the returned value to what you need to do. Now you have both of them in the same variable.

Passing all files in a folder via Terraform

I'm building a monitoring stack for our internal projects. I would like for them to be able to design their own monitoring dashboards to be used inside Grafana so I cannot predict what those will be called.
I created a folder called grafana_dashboard, where I will be instructing them to store their dashboard as JSON files and I want to pass all the contents of that folder to the Grafana instance.
I have tried a number of variations of this :
resource "grafana_dashboard" "dashboards" {
for_each = fileset(path.module, "grafana_dashboard/*.json")
config_json = "${each.key}"
depends_on = [aiven_service.grafana]
}
But keep getting this error:
Error: invalid character 'g' looking for beginning of value
on ../modules/monitoring/grafana.tf line 139, in resource "grafana_dashboard" "dashboards":
139: resource "grafana_dashboard" "dashboards" {
Can any of you see what I'm doing wrong?
Here's an example of one of the .json files i'm trying to pass:
{
"annotations": {
"list": [
{
"builtIn": 1,
"datasource": "-- Grafana --",
"enable": true,
"hide": true,
"iconColor": "rgba(0, 211, 255, 1)",
"name": "Annotations & Alerts",
"type": "dashboard"
},
{
"datasource": "Prometheus",
"enable": true,
"expr": "sum(changes(nginx_ingress_controller_config_last_reload_successful_timestamp_seconds{instance!=\"unknown\",controller_class=~\"$controller_class\",namespace=~\"$namespace\"}[30s])) by (controller_class)",
"hide": false,
"iconColor": "rgba(255, 96, 96, 1)",
"limit": 100,
"name": "Config Reloads",
"showIn": 0,
"step": "30s",
"tagKeys": "controller_class",
"tags": [],
"titleFormat": "Config Reloaded",
"type": "tags"
}
]
},
"description": "Ingress-nginx supports a rich collection of prometheus metrics. If you have prometheus and grafana installed on your cluster then prometheus will already be scraping this data due to the scrape annotation on the deployment.",
"editable": false,
"gnetId": 9614,
"graphTooltip": 0,
"id": 18,
"iteration": 1574177838584,
"links": [],
"panels": [
{
"columns": [
{
"text": "Current",
"value": "current"
}
],
"datasource": "Prometheus",
"fontSize": "100%",
"gridPos": {
"h": 15,
"w": 24,
"x": 0,
"y": 0
},
"height": "1024",
"id": 85,
"links": [],
"options": {},
"pageSize": 15,
"scroll": true,
"showHeader": true,
"sort": {
"col": 1,
"desc": false
},
"styles": [
{
"alias": "Time",
"dateFormat": "YYYY-MM-DD HH:mm:ss",
"pattern": "Time",
"type": "date"
},
{
"alias": "TTL",
"colorMode": "cell",
"colors": [
"rgba(245, 54, 54, 0.9)",
"rgba(237, 129, 40, 0.89)",
"rgba(50, 172, 45, 0.97)"
],
"dateFormat": "YYYY-MM-DD HH:mm:ss",
"decimals": 0,
"pattern": "Current",
"thresholds": [
"0",
"691200"
],
"type": "number",
"unit": "s"
},
{
"alias": "",
"colorMode": null,
"colors": [
"rgba(245, 54, 54, 0.9)",
"rgba(237, 129, 40, 0.89)",
"rgba(50, 172, 45, 0.97)"
],
"decimals": 2,
"pattern": "/.*/",
"thresholds": [],
"type": "number",
"unit": "short"
}
],
"targets": [
{
"expr": "avg(nginx_ingress_controller_ssl_expire_time_seconds{kubernetes_pod_name=~\"$controller\",namespace=~\"$namespace\",ingress=~\"$ingress\"}) by (host) - time()",
"format": "time_series",
"instant": false,
"intervalFactor": 1,
"legendFormat": "{{ host }}",
"metric": "gke_letsencrypt_cert_expiration",
"refId": "A",
"step": 1
}
],
"title": "Ingress Certificate Expiry",
"transform": "timeseries_aggregations",
"type": "table"
}
],
"refresh": "5s",
"schemaVersion": 19,
"style": "dark",
"tags": [
"nginx"
],
"templating": {
"list": [
{
"allValue": ".*",
"current": {
"text": "All",
"value": "$__all"
},
"datasource": "Prometheus",
"definition": "",
"hide": 0,
"includeAll": true,
"label": "Namespace",
"multi": false,
"name": "namespace",
"options": [],
"query": "label_values(nginx_ingress_controller_config_hash, controller_namespace)",
"refresh": 1,
"regex": "",
"skipUrlSync": false,
"sort": 0,
"tagValuesQuery": "",
"tags": [],
"tagsQuery": "",
"type": "query",
"useTags": false
},
{
"allValue": ".*",
"current": {
"text": "All",
"value": "$__all"
},
"datasource": "Prometheus",
"definition": "",
"hide": 0,
"includeAll": true,
"label": "Controller Class",
"multi": false,
"name": "controller_class",
"options": [],
"query": "label_values(nginx_ingress_controller_config_hash{namespace=~\"$namespace\"}, controller_class) ",
"refresh": 1,
"regex": "",
"skipUrlSync": false,
"sort": 0,
"tagValuesQuery": "",
"tags": [],
"tagsQuery": "",
"type": "query",
"useTags": false
},
{
"allValue": ".*",
"current": {
"text": "All",
"value": "$__all"
},
"datasource": "Prometheus",
"definition": "",
"hide": 0,
"includeAll": true,
"label": "Controller",
"multi": false,
"name": "controller",
"options": [],
"query": "label_values(nginx_ingress_controller_config_hash{namespace=~\"$namespace\",controller_class=~\"$controller_class\"}, controller_pod) ",
"refresh": 1,
"regex": "",
"skipUrlSync": false,
"sort": 0,
"tagValuesQuery": "",
"tags": [],
"tagsQuery": "",
"type": "query",
"useTags": false
},
{
"allValue": ".*",
"current": {
"text": "All",
"value": "$__all"
},
"datasource": "Prometheus",
"definition": "",
"hide": 0,
"includeAll": true,
"label": "Ingress",
"multi": false,
"name": "ingress",
"options": [],
"query": "label_values(nginx_ingress_controller_requests{namespace=~\"$namespace\",controller_class=~\"$controller_class\",controller=~\"$controller\"}, ingress) ",
"refresh": 1,
"regex": "",
"skipUrlSync": false,
"sort": 2,
"tagValuesQuery": "",
"tags": [],
"tagsQuery": "",
"type": "query",
"useTags": false
}
]
},
"time": {
"from": "now-5m",
"to": "now"
},
"timepicker": {
"refresh_intervals": [
"5s",
"10s",
"30s",
"2m",
"5m",
"15m",
"30m",
"1h",
"2h",
"1d"
],
"time_options": [
"5m",
"15m",
"1h",
"6h",
"12h",
"24h",
"2d",
"7d",
"30d"
]
},
"timezone": "browser",
"title": "Cert-manager",
"uid": "nginx",
"version": 12
}
This works, so I know that I can do it, but doesn't suit my needs as I'd need to hardcode the name of each file:
resource "grafana_dashboard" "nginx_ingress_controller" {
config_json = templatefile("${path.module}/grafana_dashboard/nginx-ingress-controller.json", { DS_PROMETHEUS = local.prometheus_datasource_name })
depends_on = [aiven_service.grafana]
}
You need to actually use the file contents in your config_json parameter to the grafana_dashboard.
Switching your resource definition to the following should be enough:
resource "grafana_dashboard" "dashboards" {
for_each = fileset(path.module, "grafana_dashboard/*.json")
config_json = file("${path.module}/${each.key}")
depends_on = [aiven_service.grafana]
}

Resources