local collector = import 'collector/main.libsonnet';
local default = import 'default/main.libsonnet';
local etcd = import 'grafana-agent/smoke/etcd/main.libsonnet';
local agent_cluster = import 'grafana-agent/scraping-svc/main.libsonnet';
local k = import 'ksonnet-util/kausal.libsonnet';
local load_generator = import 'load-generator/main.libsonnet';
local loki_config = import 'default/loki_config.libsonnet';
local grafana_agent = import 'grafana-agent/v1/main.libsonnet';
local containerPort = k.core.v1.containerPort;
local ingress = k.networking.v1beta1.ingress;
local path = k.networking.v1beta1.httpIngressPath;
local rule = k.networking.v1beta1.ingressRule;
local service = k.core.v1.service;
local images = {
agent: 'grafana/agent:latest',
agentctl: 'grafana/agentctl:latest',
};
{
default: default.new(namespace='default') {
grafana+: {
ingress+:
ingress.new('grafana-ingress') +
ingress.mixin.spec.withRules([
rule.withHost('grafana.k3d.localhost') +
rule.http.withPaths([
path.withPath('/')
+ path.backend.withServiceName('grafana')
+ path.backend.withServicePort(80),
]),
]),
},
},
agent:
local cluster_label = 'k3d-agent/daemonset';
grafana_agent.new('grafana-agent', 'default') +
grafana_agent.withImages(images) +
grafana_agent.withMetricsConfig({
wal_directory: '/var/lib/agent/data',
global: {
scrape_interval: '1m',
external_labels: {
cluster: cluster_label,
},
},
}) +
grafana_agent.withMetricsInstances(grafana_agent.scrapeInstanceKubernetes {
// We want our cluster and label to remain static for this deployment, so
// if they are overwritten by a metric we will change them to the values
// set by external_labels.
scrape_configs: std.map(function(config) config {
relabel_configs+: [{
target_label: 'cluster',
replacement: cluster_label,
}],
}, super.scrape_configs),
}) +
grafana_agent.withRemoteWrite([{
url: 'http://cortex.default.svc.cluster.local/api/prom/push',
}]) +
grafana_agent.withLogsConfig(loki_config) +
grafana_agent.withLogsClients(grafana_agent.newLogsClient({
scheme: 'http',
hostname: 'loki.default.svc.cluster.local',
external_labels: { cluster: cluster_label },
})) +
grafana_agent.withTracesConfig({
receivers: {
jaeger: {
protocols: {
thrift_http: null,
},
},
},
batch: {
timeout: '5s',
send_batch_size: 1000,
},
}) +
grafana_agent.withPortsMixin([
containerPort.new('thrift-http', 14268) + containerPort.withProtocol('TCP'),
containerPort.new('otlp-lb', 4318) + containerPort.withProtocol('TCP'),
]) +
grafana_agent.withTracesRemoteWrite([
{
endpoint: 'collector.default.svc.cluster.local:4317',
insecure: true,
},
]) +
grafana_agent.withTracesTailSamplingConfig({
policies: [{
type: 'always_sample',
}],
}) +
grafana_agent.withTracesLoadBalancingConfig({
exporter: {
insecure: true,
},
resolver: {
dns: {
hostname: 'grafana-agent.default.svc.cluster.local',
port: 4318,
},
},
}),
// Need to run ETCD for agent_cluster
etcd: etcd.new('default'),
collector: collector.new('default'),
load_generator: load_generator.new('default'),
agent_cluster:
agent_cluster.new('default', 'kube-system') +
agent_cluster.withImagesMixin(images) +
agent_cluster.withConfigMixin({
local kvstore = {
store: 'etcd',
etcd: {
endpoints: ['etcd.default.svc.cluster.local:2379'],
},
},
agent_remote_write: [{
url: 'http://cortex.default.svc.cluster.local/api/prom/push',
}],
agent_ring_kvstore: kvstore { prefix: 'agent/ring/' },
agent_config_kvstore: kvstore { prefix: 'agent/configs/' },
local cluster_label = 'k3d-agent/cluster',
agent_config+: {
metrics+: {
global+: {
external_labels+: {
cluster: cluster_label,
},
},
scraping_service+: {
dangerous_allow_reading_files: true,
},
},
},
kubernetes_scrape_configs:
(grafana_agent.scrapeInstanceKubernetes {
// We want our cluster and label to remain static for this deployment, so
// if they are overwritten by a metric we will change them to the values
// set by external_labels.
scrape_configs: std.map(function(config) config {
relabel_configs+: [{
target_label: 'cluster',
replacement: cluster_label,
}],
}, super.scrape_configs),
}).scrape_configs,
}),
}