terraform-modules/grafana/datasource/datasource.tf

77 lines
3.1 KiB
HCL

# main.tf
# Step 1: Create all Grafana data sources with their basic configuration.
# This resource establishes the fundamental properties of each data source.
resource "grafana_data_source" "this" {
for_each = var.datasources
name = each.key
type = each.value.type
url = var.datasource_urls[each.value.url_key]
is_default = coalesce(each.value.is_default, false)
basic_auth_enabled = true
basic_auth_username = var.datasource_users[each.value.user_key]
secure_json_data_encoded = jsonencode({
basicAuthPassword = var.datasource_passwords[each.value.pass_key]
})
# Encodes initial, non-dependent JSON data.
# Configurations that depend on other datasource UIDs will be handled separately.
json_data_encoded = each.value.json_data != null ? jsonencode(each.value.json_data) : null
}
# Step 2: Apply Loki-specific 'derivedFields' configuration.
# This resource targets Loki data sources that need to link to another data source (like Tempo).
# It runs after the initial data sources are created to resolve the UIDs.
resource "grafana_data_source_config" "loki_derived_fields" {
# Filter for datasources that are of type 'loki' and have 'derived_fields' defined.
for_each = {
for k, v in var.datasources : k => v
if v.type == "loki" && v.derived_fields != null
}
# The UID of the Loki data source to configure.
uid = grafana_data_source.this[each.key].uid
# Construct the json_data with the derivedFields.
json_data_encoded = jsonencode({
derivedFields = [
for field in each.value.derived_fields : {
# The UID of the target data source (e.g., Tempo).
datasourceUid = grafana_data_source.this[field.target_datasource_name].uid
matcherRegex = field.matcher_regex
name = field.name
url = field.url
}
]
})
}
# Step 3: Apply Tempo-specific 'tracesToLogsV2' configuration.
# This resource targets Tempo data sources that need to link back to a logging data source (like Loki).
resource "grafana_data_source_config" "tempo_traces_to_logs" {
# Filter for datasources that are of type 'tempo' and have 'traces_to_logs' defined.
for_each = {
for k, v in var.datasources : k => v
if v.type == "tempo" && v.traces_to_logs != null
}
# The UID of the Tempo data source to configure.
uid = grafana_data_source.this[each.key].uid
# Construct the json_data with the tracesToLogsV2 settings.
json_data_encoded = jsonencode({
tracesToLogsV2 = {
# The UID of the target data source (e.g., Loki).
datasourceUid = grafana_data_source.this[each.value.traces_to_logs.target_datasource_name].uid
query = each.value.traces_to_logs.query
customQuery = coalesce(each.value.traces_to_logs.custom_query, true)
filterBySpanID = coalesce(each.value.traces_to_logs.filter_by_span_id, false)
filterByTraceID = coalesce(each.value.traces_to_logs.filter_by_trace_id, false)
spanStartTimeShift = each.value.traces_to_logs.span_start_time_shift
spanEndTimeShift = each.value.traces_to_logs.span_end_time_shift
}
})
}