From b7e909c92ddaff2b4ee2f3e1be30e99c0b1c6de1 Mon Sep 17 00:00:00 2001 From: Rodrigue Koffi Date: Wed, 27 Jul 2022 21:58:32 +0200 Subject: [PATCH] =?UTF-8?q?=E2=98=95=EF=B8=8F=20Port=20java=20collector?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/variables.tf | 12 ++++ examples/workloads.tf | 16 +++-- main.tf | 25 +++++-- modules/workloads/java/main.tf | 64 ++++++++++++++++++ modules/workloads/java/otel-config/Chart.yaml | 6 ++ .../otel-config/templates/clusterrole.yaml | 29 ++++++++ .../templates/clusterrolebinding.yaml | 12 ++++ .../templates/opentelemetrycollector.yaml | 67 +++++++++++++++++++ .../workloads/java/otel-config/values.yaml | 7 ++ modules/workloads/java/variables.tf | 31 ++++++++- variables.tf | 12 +++- 11 files changed, 268 insertions(+), 13 deletions(-) create mode 100644 modules/workloads/java/otel-config/Chart.yaml create mode 100644 modules/workloads/java/otel-config/templates/clusterrole.yaml create mode 100644 modules/workloads/java/otel-config/templates/clusterrolebinding.yaml create mode 100644 modules/workloads/java/otel-config/templates/opentelemetrycollector.yaml create mode 100644 modules/workloads/java/otel-config/values.yaml diff --git a/examples/variables.tf b/examples/variables.tf index 712e724..32eccff 100644 --- a/examples/variables.tf +++ b/examples/variables.tf @@ -14,3 +14,15 @@ variable "aws_region" { description = "AWS Region" type = string } +variable "managed_prometheus_id" { + type = string + default = "" +} +variable "managed_prometheus_endpoint" { + type = string + default = "" +} +variable "managed_prometheus_region" { + type = string + default = "" +} diff --git a/examples/workloads.tf b/examples/workloads.tf index a1d1f71..7c1e212 100644 --- a/examples/workloads.tf +++ b/examples/workloads.tf @@ -8,17 +8,25 @@ module "eks_observability_accelerator" { eks_cluster_id = var.eks_cluster_id # deploys AWS Distro for OpenTelemetry operator into the cluster - enable_amazon_eks_adot = true + enable_amazon_eks_adot = false # reusing existing certificate manager? defaults to true enable_cert_manager = false # # -- or enable opentelemetry operator - # enable_open_telemetry_operator = true + enable_opentelemetry_operator = false #-- true doesn't work for me, needs fix # open_telemetry_operator_config = map() // custom config # creates a new AMP workspace, defaults to true - create_managed_prometheus_workspace = true + create_managed_prometheus_workspace = false + + # reusing existing AMP -- needs data source for alerting rules + managed_prometheus_id = var.managed_prometheus_id + managed_prometheus_endpoint = var.managed_prometheus_endpoint + managed_prometheus_region = var.managed_prometheus_region + + + enable_java = true # enable_haproxy = true # haproxy_config = { @@ -26,7 +34,7 @@ module "eks_observability_accelerator" { # grafana_endpoint = module.grafana.endpoint # } - # enable_java = true + # java_config = { # amp_endpoint = "" # grafana_endpoint = "" diff --git a/main.tf b/main.tf index 4f2f553..b9c50f8 100644 --- a/main.tf +++ b/main.tf @@ -26,16 +26,27 @@ module "operator" { addon_context = local.context } -module "java" { - source = "./modules/workloads/java" - - amp_endpoint = var.create_managed_prometheus_workspace ? aws_prometheus_workspace.this[0].prometheus_endpoint : var.managed_prometheus_endpoint - amp_id = var.create_managed_prometheus_workspace ? aws_prometheus_workspace.this[0].id : var.managed_prometheus_id -} - resource "aws_prometheus_workspace" "this" { count = var.create_managed_prometheus_workspace ? 1 : 0 alias = local.name tags = var.tags } + + +module "java" { + count = var.enable_java ? 1 : 0 + source = "./modules/workloads/java" + + addon_context = local.context + + amp_endpoint = var.create_managed_prometheus_workspace ? aws_prometheus_workspace.this[0].prometheus_endpoint : var.managed_prometheus_endpoint + amp_id = var.create_managed_prometheus_workspace ? aws_prometheus_workspace.this[0].id : var.managed_prometheus_id + + # if region is not passed, we assume the current one + amp_region = try(var.managed_prometheus_region, local.context.aws_region_name) + + depends_on = [ + module.operator + ] +} diff --git a/modules/workloads/java/main.tf b/modules/workloads/java/main.tf index 8b13789..4c733c1 100644 --- a/modules/workloads/java/main.tf +++ b/modules/workloads/java/main.tf @@ -1 +1,65 @@ +locals { + name = "adot-collector-java" + namespace = try(var.helm_config.namespace, local.name) +} + +data "aws_partition" "current" {} + + +module "helm_addon" { + source = "github.com/aws-ia/terraform-aws-eks-blueprints/modules/kubernetes-addons/helm-addon" + + + helm_config = merge( + { + name = local.name + chart = "${path.module}/otel-config" + version = "0.2.0" + namespace = local.namespace + description = "ADOT helm Chart deployment configuration" + }, + var.helm_config + ) + + set_values = [ + { + name = "ampurl" + value = "${var.amp_endpoint}api/v1/remote_write" + }, + { + name = "region" + value = var.amp_region + }, + { + name = "prometheusMetricsEndpoint" + value = "metrics" + }, + { + name = "prometheusMetricsPort" + value = 8888 + }, + { + name = "scrapeInterval" + value = "15s" + }, + { + name = "scrapeTimeout" + value = "10s" + }, + { + name = "scrapeSampleLimit" + value = 1000 + } + ] + + irsa_config = { + create_kubernetes_namespace = try(var.helm_config["create_namespace"], true) + kubernetes_namespace = local.namespace + create_kubernetes_service_account = true + kubernetes_service_account = try(var.helm_config.service_account, local.name) + irsa_iam_policies = ["arn:${data.aws_partition.current.partition}:iam::aws:policy/AmazonPrometheusRemoteWriteAccess"] + } + + addon_context = var.addon_context +} diff --git a/modules/workloads/java/otel-config/Chart.yaml b/modules/workloads/java/otel-config/Chart.yaml new file mode 100644 index 0000000..94c1fbd --- /dev/null +++ b/modules/workloads/java/otel-config/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +name: opentelemetry +description: A Helm chart to install otel operator +type: application +version: 0.2.0 +appVersion: v0.1.0 diff --git a/modules/workloads/java/otel-config/templates/clusterrole.yaml b/modules/workloads/java/otel-config/templates/clusterrole.yaml new file mode 100644 index 0000000..4bb1fb7 --- /dev/null +++ b/modules/workloads/java/otel-config/templates/clusterrole.yaml @@ -0,0 +1,29 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: otel-prometheus-role +rules: + - apiGroups: + - "" + resources: + - nodes + - nodes/proxy + - services + - endpoints + - pods + verbs: + - get + - list + - watch + - apiGroups: + - extensions + resources: + - ingresses + verbs: + - get + - list + - watch + - nonResourceURLs: + - /metrics + verbs: + - get diff --git a/modules/workloads/java/otel-config/templates/clusterrolebinding.yaml b/modules/workloads/java/otel-config/templates/clusterrolebinding.yaml new file mode 100644 index 0000000..8e1cd8c --- /dev/null +++ b/modules/workloads/java/otel-config/templates/clusterrolebinding.yaml @@ -0,0 +1,12 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: otel-prometheus-role-binding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: otel-prometheus-role +subjects: + - kind: ServiceAccount + name: adot-collector-java + namespace: adot-collector-java diff --git a/modules/workloads/java/otel-config/templates/opentelemetrycollector.yaml b/modules/workloads/java/otel-config/templates/opentelemetrycollector.yaml new file mode 100644 index 0000000..1f933f8 --- /dev/null +++ b/modules/workloads/java/otel-config/templates/opentelemetrycollector.yaml @@ -0,0 +1,67 @@ +apiVersion: opentelemetry.io/v1alpha1 +kind: OpenTelemetryCollector +metadata: + name: adot +spec: + image: public.ecr.aws/aws-observability/aws-otel-collector:latest + mode: deployment + serviceAccount: adot-collector-java + config: | + receivers: + prometheus: + config: + global: + scrape_interval: {{ .Values.scrapeInterval }} + scrape_timeout: {{ .Values.scrapeTimeout }} + + scrape_configs: + - job_name: 'kubernetes-pod-jmx' + sample_limit: {{ .Values.scrapeSampleLimit }} + metrics_path: /{{ .Values.prometheusMetricsEndpoint }} + kubernetes_sd_configs: + - role: pod + relabel_configs: + - source_labels: [ __address__ ] + action: keep + regex: '.*:9404$' + - action: labelmap + regex: __meta_kubernetes_pod_label_(.+) + - action: replace + source_labels: [ __meta_kubernetes_namespace ] + target_label: Namespace + - source_labels: [ __meta_kubernetes_pod_name ] + action: replace + target_label: pod_name + - action: replace + source_labels: [ __meta_kubernetes_pod_container_name ] + target_label: container_name + - action: replace + source_labels: [ __meta_kubernetes_pod_controller_kind ] + target_label: pod_controller_kind + - action: replace + source_labels: [ __meta_kubernetes_pod_phase ] + target_label: pod_controller_phase + metric_relabel_configs: + - source_labels: [ __name__ ] + regex: 'jvm_gc_collection_seconds.*' + action: drop + exporters: + awsprometheusremotewrite: + endpoint: {{ .Values.ampurl }} + aws_auth: + region: {{ .Values.region }} + service: "aps" + logging: + loglevel: info + extensions: + health_check: + pprof: + endpoint: :1888 + zpages: + endpoint: :55679 + service: + extensions: [pprof, zpages, health_check] + pipelines: + metrics: + receivers: [prometheus] + exporters: [logging, awsprometheusremotewrite] diff --git a/modules/workloads/java/otel-config/values.yaml b/modules/workloads/java/otel-config/values.yaml new file mode 100644 index 0000000..f3517b2 --- /dev/null +++ b/modules/workloads/java/otel-config/values.yaml @@ -0,0 +1,7 @@ +ampurl: ${amp_url} +region: ${region} +prometheusMetricsEndpoint: ${prometheus_metrics_endpoint} +prometheusMetricsPort: ${prometheus_metrics_port} +scrapeInterval: ${scrape_interval} +scrapeTimeout: ${scrape_timeout} +scrapeSampleLimit: ${scrape_sample_limit} diff --git a/modules/workloads/java/variables.tf b/modules/workloads/java/variables.tf index fa9f406..272d366 100644 --- a/modules/workloads/java/variables.tf +++ b/modules/workloads/java/variables.tf @@ -6,7 +6,7 @@ variable "java" { } variable "amp_endpoint" { - description = "Managed Prometheus endpoint" + description = "Amazon Managed Prometheus endpoint" type = string } @@ -14,3 +14,32 @@ variable "amp_id" { description = "Managed Prometheus workspace id" type = string } + +variable "helm_config" { + description = "Helm Config for Prometheus" + type = any + default = {} +} + +variable "amp_region" { + description = "Amazon Managed Prometheus Workspace's Region" + type = string + default = null +} + +variable "addon_context" { + description = "Input configuration for the addon" + type = object({ + aws_caller_identity_account_id = string + aws_caller_identity_arn = string + aws_eks_cluster_endpoint = string + aws_partition_id = string + aws_region_name = string + eks_cluster_id = string + eks_oidc_issuer_url = string + eks_oidc_provider_arn = string + irsa_iam_permissions_boundary = string + irsa_iam_role_path = string + tags = map(string) + }) +} diff --git a/variables.tf b/variables.tf index fe0e535..a920985 100644 --- a/variables.tf +++ b/variables.tf @@ -49,7 +49,6 @@ variable "create_managed_prometheus_workspace" { default = true } - variable "managed_prometheus_id" { description = "AWS Managed Prometheus Workspace ID" type = string @@ -61,6 +60,17 @@ variable "managed_prometheus_endpoint" { type = string default = "" } +variable "managed_prometheus_region" { + description = "AWS Managed Prometheus Workspace Region" + type = string + default = null +} + +variable "enable_java" { + description = "Deploys a collector for JAVA/JMX based workloads, dashboards and alerting rules" + type = bool + default = false +} variable "tags" { description = "Additional tags (e.g. `map('BusinessUnit`,`XYZ`)"