{"id":29943244,"url":"https://github.com/sourcefuse/terraform-aws-arc-observability-stack","last_synced_at":"2026-02-10T10:34:01.856Z","repository":{"id":291611733,"uuid":"907487507","full_name":"sourcefuse/terraform-aws-arc-observability-stack","owner":"sourcefuse","description":"The Observability Terraform module simplifies deploying a robust monitoring and logging stack in EKS. It provides flexibility to choose between AWS OpenSearch or ElasticSearch for search engines and Fluentd or Fluent Bit for log aggregation, along with Prometheus, Grafana, Alertmanager, and Blackbox Exporter for metrics and alerting.","archived":false,"fork":false,"pushed_at":"2025-07-17T06:13:45.000Z","size":4602,"stargazers_count":0,"open_issues_count":3,"forks_count":0,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-08-01T05:55:58.850Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"HCL","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sourcefuse.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-12-23T17:35:11.000Z","updated_at":"2025-05-07T10:27:10.000Z","dependencies_parsed_at":"2025-05-05T16:54:37.915Z","dependency_job_id":"59432165-5819-481f-aefa-e52d0a221978","html_url":"https://github.com/sourcefuse/terraform-aws-arc-observability-stack","commit_stats":null,"previous_names":["sourcefuse/terraform-aws-arc-observability-stack"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/sourcefuse/terraform-aws-arc-observability-stack","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sourcefuse%2Fterraform-aws-arc-observability-stack","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sourcefuse%2Fterraform-aws-arc-observability-stack/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sourcefuse%2Fterraform-aws-arc-observability-stack/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sourcefuse%2Fterraform-aws-arc-observability-stack/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sourcefuse","download_url":"https://codeload.github.com/sourcefuse/terraform-aws-arc-observability-stack/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sourcefuse%2Fterraform-aws-arc-observability-stack/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":268484362,"owners_count":24257660,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-03T02:00:12.545Z","response_time":2577,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-08-03T02:14:46.771Z","updated_at":"2026-02-10T10:33:56.832Z","avatar_url":"https://github.com/sourcefuse.png","language":"HCL","funding_links":[],"categories":[],"sub_categories":[],"readme":"![Module Structure](./static/banner.png)\n\n# [terraform-aws-arc-observability-stack](https://github.com/sourcefuse/terraform-aws-arc-observability-stack)\n\n\u003ca href=\"https://github.com/sourcefuse/terraform-aws-arc-observability-stack/releases/latest\"\u003e\u003cimg src=\"https://img.shields.io/github/release/sourcefuse/terraform-aws-arc-observability-stack.svg?style=for-the-badge\" alt=\"Latest Release\"/\u003e\u003c/a\u003e \u003ca href=\"https://github.com/sourcefuse/terraform-aws-arc-observability-stack/commits\"\u003e\u003cimg src=\"https://img.shields.io/github/last-commit/sourcefuse/terraform-aws-arc-observability-stack.svg?style=for-the-badge\" alt=\"Last Updated\"/\u003e\u003c/a\u003e ![Terraform](https://img.shields.io/badge/terraform-%235835CC.svg?style=for-the-badge\u0026logo=terraform\u0026logoColor=white) ![GitHub Actions](https://img.shields.io/badge/github%20actions-%232671E5.svg?style=for-the-badge\u0026logo=githubactions\u0026logoColor=white)\n\n[![Quality gate](https://sonarcloud.io/api/project_badges/quality_gate?project=sourcefuse_terraform-aws-arc-observability-stack\u0026token=bf80d04b87395dadd9473538860728fd9d32cfc6)](https://sonarcloud.io/summary/new_code?id=sourcefuse_terraform-aws-arc-observability-stack)\n\n[![Known Vulnerabilities](https://github.com/sourcefuse/terraform-aws-arc-observability-stack/actions/workflows/snyk.yaml/badge.svg)](https://github.com/sourcefuse/terraform-aws-arc-observability-stack/actions/workflows/snyk.yaml)\n## Introduction\n\nThe Observability Terraform Module is a comprehensive solution designed to simplify the deployment of a full-stack observability ecosystem in Kubernetes environments. This module enables organizations to monitor and troubleshoot their infrastructure and applications effectively, offering the flexibility to choose between various open-source tools.\n\n### Key Features:\n1. EFK Stack for Log Management:\n\n- Deploy either Fluentd or Fluent Bit as the log collector, providing lightweight and efficient options for log aggregation.\n- Seamlessly integrate with either Elasticsearch or OpenSearch for scalable and reliable log storage.\n\n2. Prometheus Stack for Metrics Monitoring:\n\n- Includes Prometheus for metrics collection and Alertmanager for alerting.\n- Integrated support for Grafana, offering rich dashboards to visualize metrics effectively.\n- Enables monitoring of HTTP endpoints using the Blackbox Exporter.\n\n3. Flexibility and Customization:\n\n- Fully customizable configurations for each component, allowing fine-grained control over deployment and resources.\n- Supports multiple log collectors and storage backends, giving users the freedom to choose based on their requirements.\n\n4. Streamlined Deployment:\n\n- Automates the deployment of the entire observability stack, reducing complexity and ensuring consistency.\n- Includes preconfigured dashboards and alert rules for quick setup and immediate insights.\n\n5. Signoz Community Edition Support\n- Adds native support for Signoz CE, an all-in-one observability platform.\n- Enables logs, metrics, and traces to be collected and correlated in one unified interface.\n- Simplifies tracing setup with OpenTelemetry Collector and works out of the box with distributed applications.\n\nFor more information about this repository and its usage, please see [Terraform AWS ARC Observability Module Usage Guide](docs/module-usage-guide/README.md).\n\n\nCreate the following resources in a single region.\n\n* VPC\n* Multi-AZ private and public subnets\n* Route tables, internet gateway, and NAT gateways\n* Configurable VPC Endpoints\n\n### Prerequisites\nBefore using this module, ensure you have the following:\n\n- AWS credentials configured.\n- Terraform installed.\n- A working knowledge of Terraform.\n\n## Usage\nSee the `examples` folder for a complete example.\n\n### EFK Stack\n```hcl\n\nmodule \"efk\" {\n  source                      = \"sourcefuse/arc-observability-stack/aws\"\n  version                     = \"0.0.1\"\n\n  environment = var.environment\n  namespace   = var.namespace\n\n  search_engine  = \"elasticsearch\"\n  log_aggregator = \"fluentd\"\n\n  elasticsearch_config = {\n    name = \"elasticsearch-master\"\n    k8s_namespace = {\n      name   = \"logging\"\n      create = true\n    }\n\n    tls_self_signed_cert_data = {\n      organisation          = \"ARC\"\n      validity_period_hours = 26280 # 3 years validity\n      early_renewal_hours   = 168   # 1 week early renewal\n    }\n\n    cluster_config = {\n      port           = \"9200\"\n      transport_port = \"9300\"\n      user           = \"elastic\"\n      log_level      = \"INFO\"\n      cpu_limit      = \"2000m\"\n      memory_limit   = \"4Gi\"\n      cpu_request    = \"1000m\"\n      memory_request = \"2Gi\"\n      storage_class  = \"gp2\"\n      storage        = \"40Gi\"\n    }\n\n    kibana_config = {\n      log_level      = \"info\"\n      cpu_limit      = \"500m\"\n      memory_limit   = \"1Gi\"\n      cpu_request    = \"250m\"\n      memory_request = \"500Mi\"\n\n      ingress_enabled     = true\n      aws_certificate_arn = \"arn:aws:acm:us-east-1:xx:certificate/xx-46e7-4d99-a523-xxxx\"\n      ingress_host        = \"kibana.xx-xx.xx\"\n\n    }\n  }\n\n  fluentd_config = {\n    k8s_namespace = {\n      name   = \"logging\"\n      create = false\n    }\n    name                = \"fluentd\"\n    search_engine       = \"elasticsearch\"\n    cpu_limit           = \"100m\"\n    memory_limit        = \"512Mi\"\n    cpu_request         = \"100m\"\n    memory_request      = \"128Mi\"\n    logstash_dateformat = \"%Y.%m.%d\"\n    log_level           = \"info\"\n  }\n}\n\n\n```\n### Prometheus\n\n```hcl\n\nmodule \"prometheus\" {\n  source                      = \"sourcefuse/arc-observability-stack/aws\"\n  version                     = \"0.0.1\"\n\n  environment = var.environment\n  namespace   = var.namespace\n\n  metrics_monitoring_system = \"prometheus\"\n\n  prometheus_config = {\n    k8s_namespace = {\n      name   = \"metrics\"\n      create = true\n    }\n    log_level = \"info\"\n    resources = {\n      cpu_limit      = \"100m\"\n      memory_limit   = \"512Mi\"\n      cpu_request    = \"100m\"\n      memory_request = \"128Mi\"\n    }\n    replicas                  = 1\n    storage                   = \"8Gi\"\n    enable_kube_state_metrics = true\n    enable_node_exporter      = true\n    retention_period          = \"30d\"\n\n    grafana_config = {\n      replicas            = 1\n      ingress_enabled     = true\n      ingress_host        = \"grafana.arc-xx.xx\"\n      aws_certificate_arn = \"arn:aws:acm:us-east-1:xx:certificate/xx-46e7-4d99-a523-xxxx\"\n      lb_visibility       = \"internet-facing\"\n      dashboard_list = [\n        {\n          name = \"node-metrics\"\n          json = templatefile(\"${path.module}/grafana-dashbord.json\", {})\n        }\n      ]\n    }\n\n    blackbox_exporter_config = {\n      name = \"blackbox-exporter\"\n      monitoring_targets = [{\n        name                     = \"google\"\n        url                      = \"https://google.com\"\n        scrape_interval          = \"60s\"\n        status_code_pattern_list = \"[http_2xx]\" // Note :- This i string not list\n      }]\n    }\n\n    alertmanager_config = {\n      name            = \"alertmanager\"\n      replica_count   = 1\n      alert_rule_yaml = \"\"\n    }\n\n  }\n}\n\n```\n\u003c!-- BEGINNING OF PRE-COMMIT-TERRAFORM DOCS HOOK --\u003e\n## Requirements\n\n| Name | Version |\n|------|---------|\n| \u003ca name=\"requirement_terraform\"\u003e\u003c/a\u003e [terraform](#requirement\\_terraform) | \u003e= 1.4, \u003c 2.0.0 |\n| \u003ca name=\"requirement_aws\"\u003e\u003c/a\u003e [aws](#requirement\\_aws) | \u003e= 4.0, \u003c 6.0 |\n| \u003ca name=\"requirement_helm\"\u003e\u003c/a\u003e [helm](#requirement\\_helm) | 2.17.0 |\n| \u003ca name=\"requirement_random\"\u003e\u003c/a\u003e [random](#requirement\\_random) | ~\u003e 3.6.0 |\n| \u003ca name=\"requirement_tls\"\u003e\u003c/a\u003e [tls](#requirement\\_tls) | ~\u003e 4.0.6 |\n\n## Providers\n\nNo providers.\n\n## Modules\n\n| Name | Source | Version |\n|------|--------|---------|\n| \u003ca name=\"module_elasticsearch\"\u003e\u003c/a\u003e [elasticsearch](#module\\_elasticsearch) | ./modules/elasticsearch | n/a |\n| \u003ca name=\"module_fluentbit\"\u003e\u003c/a\u003e [fluentbit](#module\\_fluentbit) | ./modules/fluent-bit | n/a |\n| \u003ca name=\"module_fluentd\"\u003e\u003c/a\u003e [fluentd](#module\\_fluentd) | ./modules/fluentd | n/a |\n| \u003ca name=\"module_jaeger\"\u003e\u003c/a\u003e [jaeger](#module\\_jaeger) | ./modules/jaeger | n/a |\n| \u003ca name=\"module_prometheus\"\u003e\u003c/a\u003e [prometheus](#module\\_prometheus) | ./modules/prometheus | n/a |\n| \u003ca name=\"module_signoz\"\u003e\u003c/a\u003e [signoz](#module\\_signoz) | ./modules/signoz | n/a |\n| \u003ca name=\"module_signoz_metrics_logs\"\u003e\u003c/a\u003e [signoz\\_metrics\\_logs](#module\\_signoz\\_metrics\\_logs) | ./modules/signoz-infra | n/a |\n\n## Resources\n\nNo resources.\n\n## Inputs\n\n| Name | Description | Type | Default | Required |\n|------|-------------|------|---------|:--------:|\n| \u003ca name=\"input_elasticsearch_config\"\u003e\u003c/a\u003e [elasticsearch\\_config](#input\\_elasticsearch\\_config) | Configuration settings for deploying Elasticsearch | \u003cpre\u003eobject({\u003cbr\u003e    name = optional(string, \"elasticsearch-master\") # Name of the Elasticsearch cluster\u003cbr\u003e    k8s_namespace = object({\u003cbr\u003e      name   = optional(string, \"logging\")\u003cbr\u003e      create = optional(bool, true)\u003cbr\u003e    })\u003cbr\u003e\u003cbr\u003e    tls_self_signed_cert_data = optional(object({     # Self-signed TLS certificate data\u003cbr\u003e      organisation          = optional(string, null)  # Organisation name for certificate\u003cbr\u003e      validity_period_hours = optional(number, 26280) # 3 years validity\u003cbr\u003e      early_renewal_hours   = optional(number, 168)   # 1 week early renewal\u003cbr\u003e    }))\u003cbr\u003e\u003cbr\u003e    cluster_config = object({\u003cbr\u003e      port           = optional(string, \"9200\")    # Elasticsearch HTTP port\u003cbr\u003e      transport_port = optional(string, \"9300\")    # Elasticsearch transport port\u003cbr\u003e      user           = optional(string, \"elastic\") # Elasticsearch username\u003cbr\u003e      log_level      = optional(string, \"INFO\")    # Log level (DEBUG, INFO, WARN, ERROR)\u003cbr\u003e      cpu_limit      = optional(string, \"2000m\")   # CPU limit for the Elasticsearch container\u003cbr\u003e      memory_limit   = optional(string, \"4Gi\")     # Memory limit for the Elasticsearch container\u003cbr\u003e      cpu_request    = optional(string, \"1000m\")   # CPU request for the Elasticsearch container\u003cbr\u003e      memory_request = optional(string, \"2Gi\")     # Memory request for the Elasticsearch container\u003cbr\u003e      storage_class  = optional(string, \"gp2\")\u003cbr\u003e      storage        = optional(string, \"30Gi\") # Persistent volume storage for Elasticsearch\u003cbr\u003e      replica_count  = optional(string, 3)\u003cbr\u003e    })\u003cbr\u003e\u003cbr\u003e    kibana_config = object({\u003cbr\u003e      name                = optional(string, \"kibana\")\u003cbr\u003e      replica_count       = optional(string, 3)\u003cbr\u003e      http_port           = optional(string, \"5601\")\u003cbr\u003e      user                = optional(string, \"elastic\")\u003cbr\u003e      log_level           = optional(string, \"info\") // values include Options are all, fatal, error, warn, info, debug, trace, off\u003cbr\u003e      cpu_limit           = optional(string, \"500m\")\u003cbr\u003e      memory_limit        = optional(string, \"1Gi\")\u003cbr\u003e      cpu_request         = optional(string, \"250m\")\u003cbr\u003e      memory_request      = optional(string, \"500Mi\")\u003cbr\u003e      ingress_enabled     = optional(bool, false)\u003cbr\u003e      ingress_host        = optional(string, \"\")\u003cbr\u003e      aws_certificate_arn = optional(string, \"\")\u003cbr\u003e      lb_visibility       = optional(string, \"internet-facing\")\u003cbr\u003e    })\u003cbr\u003e  })\u003c/pre\u003e | \u003cpre\u003e{\u003cbr\u003e  \"cluster_config\": {\u003cbr\u003e    \"cpu_limit\": \"2000m\",\u003cbr\u003e    \"cpu_request\": \"1000m\",\u003cbr\u003e    \"log_level\": \"INFO\",\u003cbr\u003e    \"memory_limit\": \"4Gi\",\u003cbr\u003e    \"memory_request\": \"2Gi\",\u003cbr\u003e    \"port\": \"9200\",\u003cbr\u003e    \"replica_count\": 3,\u003cbr\u003e    \"storage\": \"30Gi\",\u003cbr\u003e    \"transport_port\": \"9300\",\u003cbr\u003e    \"user\": \"elastic\"\u003cbr\u003e  },\u003cbr\u003e  \"k8s_namespace\": {\u003cbr\u003e    \"create\": true,\u003cbr\u003e    \"name\": \"logging\"\u003cbr\u003e  },\u003cbr\u003e  \"kibana_config\": {\u003cbr\u003e    \"cpu_limit\": \"500m\",\u003cbr\u003e    \"cpu_request\": \"250m\",\u003cbr\u003e    \"elasticsearch_url\": \"https://elasticsearch-master:9200\",\u003cbr\u003e    \"http_port\": \"5601\",\u003cbr\u003e    \"ingress_enabled\": false,\u003cbr\u003e    \"ingress_host\": \"\",\u003cbr\u003e    \"log_level\": \"info\",\u003cbr\u003e    \"memory_limit\": \"1Gi\",\u003cbr\u003e    \"memory_request\": \"500Mi\",\u003cbr\u003e    \"name\": \"kibana\",\u003cbr\u003e    \"user\": \"elastic\"\u003cbr\u003e  },\u003cbr\u003e  \"name\": \"elasticsearch-master\",\u003cbr\u003e  \"tls_self_signed_cert_data\": {\u003cbr\u003e    \"early_renewal_hours\": 168,\u003cbr\u003e    \"organisation\": null,\u003cbr\u003e    \"validity_period_hours\": 26280\u003cbr\u003e  }\u003cbr\u003e}\u003c/pre\u003e | no |\n| \u003ca name=\"input_environment\"\u003e\u003c/a\u003e [environment](#input\\_environment) | Environment name | `string` | n/a | yes |\n| \u003ca name=\"input_fluentbit_config\"\u003e\u003c/a\u003e [fluentbit\\_config](#input\\_fluentbit\\_config) | Configuration for Fluentbit | \u003cpre\u003eobject({\u003cbr\u003e    k8s_namespace = object({\u003cbr\u003e      name   = optional(string, \"logging\")\u003cbr\u003e      create = optional(bool, false)\u003cbr\u003e    })\u003cbr\u003e    name                = optional(string, \"fluent-bit\")\u003cbr\u003e    cpu_limit           = optional(string, \"100m\")\u003cbr\u003e    memory_limit        = optional(string, \"512Mi\")\u003cbr\u003e    cpu_request         = optional(string, \"100m\")\u003cbr\u003e    memory_request      = optional(string, \"128Mi\")\u003cbr\u003e    logstash_dateformat = optional(string, \"%Y.%m.%d\") # Default time format\u003cbr\u003e    time_format         = optional(string, \"%Y-%m-%dT%H:%M:%S.%L\")\u003cbr\u003e    log_level           = optional(string, \"info\") # Default log level\u003cbr\u003e    aws_region          = optional(string, \"\")\u003cbr\u003e    aws_role_arn        = optional(string, \"\")\u003cbr\u003e  })\u003c/pre\u003e | \u003cpre\u003e{\u003cbr\u003e  \"cpu_limit\": \"100m\",\u003cbr\u003e  \"cpu_request\": \"100m\",\u003cbr\u003e  \"k8s_namespace\": {\u003cbr\u003e    \"create\": false,\u003cbr\u003e    \"name\": \"logging\"\u003cbr\u003e  },\u003cbr\u003e  \"logstash_dateformat\": \"%Y.%m.%d\",\u003cbr\u003e  \"memory_limit\": \"512Mi\",\u003cbr\u003e  \"memory_request\": \"128Mi\",\u003cbr\u003e  \"name\": \"fluent-bit\",\u003cbr\u003e  \"search_engine\": \"elasticsearch\"\u003cbr\u003e}\u003c/pre\u003e | no |\n| \u003ca name=\"input_fluentd_config\"\u003e\u003c/a\u003e [fluentd\\_config](#input\\_fluentd\\_config) | Configuration for Fluentd | \u003cpre\u003eobject({\u003cbr\u003e    k8s_namespace = object({\u003cbr\u003e      name   = optional(string, \"logging\")\u003cbr\u003e      create = optional(bool, false)\u003cbr\u003e    })\u003cbr\u003e    name                = optional(string, \"fluentd\")\u003cbr\u003e    cpu_limit           = optional(string, \"100m\")\u003cbr\u003e    memory_limit        = optional(string, \"512Mi\")\u003cbr\u003e    cpu_request         = optional(string, \"100m\")\u003cbr\u003e    memory_request      = optional(string, \"128Mi\")\u003cbr\u003e    logstash_dateformat = optional(string, \"%Y.%m.%d\") # Default time format\u003cbr\u003e    log_level           = optional(string, \"info\")     # Default log level\u003cbr\u003e    opensearch_url      = optional(string, \"\")\u003cbr\u003e    aws_region          = optional(string, \"\")\u003cbr\u003e    aws_role_arn        = optional(string, \"\")\u003cbr\u003e  })\u003c/pre\u003e | \u003cpre\u003e{\u003cbr\u003e  \"cpu_limit\": \"100m\",\u003cbr\u003e  \"cpu_request\": \"100m\",\u003cbr\u003e  \"k8s_namespace\": {\u003cbr\u003e    \"create\": false,\u003cbr\u003e    \"name\": \"logging\"\u003cbr\u003e  },\u003cbr\u003e  \"logstash_dateformat\": \"%Y.%m.%d\",\u003cbr\u003e  \"memory_limit\": \"512Mi\",\u003cbr\u003e  \"memory_request\": \"128Mi\",\u003cbr\u003e  \"name\": \"fluentd\",\u003cbr\u003e  \"search_engine\": \"elasticsearch\"\u003cbr\u003e}\u003c/pre\u003e | no |\n| \u003ca name=\"input_log_aggregator\"\u003e\u003c/a\u003e [log\\_aggregator](#input\\_log\\_aggregator) | (optional) Log aggregator to choose | `string` | `null` | no |\n| \u003ca name=\"input_metrics_monitoring_system\"\u003e\u003c/a\u003e [metrics\\_monitoring\\_system](#input\\_metrics\\_monitoring\\_system) | Monotoring system for metrics | `string` | `null` | no |\n| \u003ca name=\"input_namespace\"\u003e\u003c/a\u003e [namespace](#input\\_namespace) | Namespace for the resources. | `string` | n/a | yes |\n| \u003ca name=\"input_prometheus_config\"\u003e\u003c/a\u003e [prometheus\\_config](#input\\_prometheus\\_config) | Configuration settings for deploying Prometheus | \u003cpre\u003eobject({\u003cbr\u003e    name = optional(string, \"prometheus\")\u003cbr\u003e    k8s_namespace = object({\u003cbr\u003e      name   = optional(string, \"metrics\")\u003cbr\u003e      create = optional(bool, true)\u003cbr\u003e    })\u003cbr\u003e    log_level                 = optional(string, \"info\")\u003cbr\u003e    replica_count             = optional(number, 1)\u003cbr\u003e    storage                   = optional(string, \"8Gi\")\u003cbr\u003e    storage_class             = optional(string, \"gp2\")\u003cbr\u003e    enable_kube_state_metrics = optional(bool, true)\u003cbr\u003e    enable_node_exporter      = optional(bool, true)\u003cbr\u003e    cpu_limit                 = optional(string, \"100m\")\u003cbr\u003e    memory_limit              = optional(string, \"512Mi\")\u003cbr\u003e    cpu_request               = optional(string, \"100m\")\u003cbr\u003e    memory_request            = optional(string, \"128Mi\")\u003cbr\u003e    retention_period          = optional(string, \"15d\")\u003cbr\u003e\u003cbr\u003e    grafana_config = object({\u003cbr\u003e      name                = optional(string, \"grafana\")\u003cbr\u003e      replica_count       = optional(number, 1)\u003cbr\u003e      ingress_enabled     = optional(bool, false)\u003cbr\u003e      lb_visibility       = optional(string, \"internet-facing\") # Options: \"internal\" or \"internet-facing\"\u003cbr\u003e      aws_certificate_arn = optional(string, \"\")\u003cbr\u003e      ingress_host        = optional(string, \"\")\u003cbr\u003e      admin_user          = optional(string, \"admin\")\u003cbr\u003e      cpu_limit           = optional(string, \"100m\")\u003cbr\u003e      memory_limit        = optional(string, \"128Mi\")\u003cbr\u003e      cpu_request         = optional(string, \"100m\")\u003cbr\u003e      memory_request      = optional(string, \"128Mi\")\u003cbr\u003e      dashboard_list = optional(list(object({\u003cbr\u003e        name = string\u003cbr\u003e        json = string\u003cbr\u003e      })), [])\u003cbr\u003e    })\u003cbr\u003e\u003cbr\u003e    blackbox_exporter_config = object({\u003cbr\u003e      name           = optional(string, \"blackbox-exporter\")\u003cbr\u003e      replica_count  = optional(number, 1)\u003cbr\u003e      cpu_limit      = optional(string, \"100m\")\u003cbr\u003e      memory_limit   = optional(string, \"500Mi\")\u003cbr\u003e      cpu_request    = optional(string, \"100m\")\u003cbr\u003e      memory_request = optional(string, \"50Mi\")\u003cbr\u003e      monitoring_targets = list(object({\u003cbr\u003e        name                     = string                         # Target name (e.g., google)\u003cbr\u003e        url                      = string                         # URL to monitor (e.g., https://google.com)\u003cbr\u003e        scrape_interval          = optional(string, \"60s\")        # Scrape interval (e.g., 60s)\u003cbr\u003e        scrape_timeout           = optional(string, \"60s\")        # Scrape timeout (e.g., 60s)\u003cbr\u003e        status_code_pattern_list = optional(string, \"[http_2xx]\") # Blackbox module to use (e.g., http_2xx)\u003cbr\u003e      }))\u003cbr\u003e    })\u003cbr\u003e\u003cbr\u003e    alertmanager_config = object({\u003cbr\u003e      name                        = optional(string, \"alertmanager\")\u003cbr\u003e      replica_count               = optional(number, 1)\u003cbr\u003e      cpu_limit                   = optional(string, \"100m\")\u003cbr\u003e      memory_limit                = optional(string, \"128Mi\")\u003cbr\u003e      cpu_request                 = optional(string, \"10m\")\u003cbr\u003e      memory_request              = optional(string, \"32Mi\")\u003cbr\u003e      custom_alerts               = optional(string, \"\")\u003cbr\u003e      alert_notification_settings = optional(string, \"\")\u003cbr\u003e    })\u003cbr\u003e  })\u003c/pre\u003e | \u003cpre\u003e{\u003cbr\u003e  \"alertmanager_config\": {\u003cbr\u003e    \"name\": \"alertmanager\"\u003cbr\u003e  },\u003cbr\u003e  \"blackbox_exporter_config\": {\u003cbr\u003e    \"monitoring_targets\": [],\u003cbr\u003e    \"name\": \"blackbox-exporter\"\u003cbr\u003e  },\u003cbr\u003e  \"enable_kube_state_metrics\": true,\u003cbr\u003e  \"enable_node_exporter\": true,\u003cbr\u003e  \"grafana_config\": {\u003cbr\u003e    \"admin_user\": \"admin\",\u003cbr\u003e    \"ingress_enabled\": false,\u003cbr\u003e    \"lb_visibility\": \"internet-facing\",\u003cbr\u003e    \"prometheus_endpoint\": \"prometheus\"\u003cbr\u003e  },\u003cbr\u003e  \"k8s_namespace\": {\u003cbr\u003e    \"create\": true,\u003cbr\u003e    \"name\": \"metrics\"\u003cbr\u003e  },\u003cbr\u003e  \"log_level\": \"info\",\u003cbr\u003e  \"replica_count\": 1,\u003cbr\u003e  \"resources\": {\u003cbr\u003e    \"cpu_limit\": \"100m\",\u003cbr\u003e    \"cpu_request\": \"100m\",\u003cbr\u003e    \"memory_limit\": \"512Mi\",\u003cbr\u003e    \"memory_request\": \"128Mi\"\u003cbr\u003e  },\u003cbr\u003e  \"retention_period\": \"15d\",\u003cbr\u003e  \"storage\": \"8Gi\"\u003cbr\u003e}\u003c/pre\u003e | no |\n| \u003ca name=\"input_search_engine\"\u003e\u003c/a\u003e [search\\_engine](#input\\_search\\_engine) | (optional) Search engine for logs | `string` | `null` | no |\n| \u003ca name=\"input_signoz_config\"\u003e\u003c/a\u003e [signoz\\_config](#input\\_signoz\\_config) | Configuration for observability components in the monitoring stack. This variable encapsulates\u003cbr\u003esettings for the following components:\u003cbr\u003e\u003cbr\u003e- ClickHouse:\u003cbr\u003e  Used as the backend storage engine for observability data (like traces and metrics).\u003cbr\u003e  Includes credentials and resource limits/requests for tuning performance.\u003cbr\u003e\u003cbr\u003e- SigNoz:\u003cbr\u003e  Provides the UI and analytics for monitoring and tracing applications.\u003cbr\u003e  Includes ingress setup and compute resource configuration.\u003cbr\u003e\u003cbr\u003e- Alertmanager:\u003cbr\u003e  Handles alerting rules and notifications for monitoring data.\u003cbr\u003e  Includes configuration for storage, scaling, and ingress settings.\u003cbr\u003e\u003cbr\u003e- OTEL Collector:\u003cbr\u003e  Collects telemetry data (logs, metrics, traces) from the applications and\u003cbr\u003e  routes it to appropriate backends.\u003cbr\u003e  Includes resource definitions and optional ingress configuration.\u003cbr\u003e\u003cbr\u003eThis structure enables centralized management of observability stack deployment in Kubernetes\u003cbr\u003evia Terraform. | \u003cpre\u003eobject({\u003cbr\u003e    k8s_namespace = object({\u003cbr\u003e      name   = optional(string, \"signoz\")\u003cbr\u003e      create = optional(bool, false)\u003cbr\u003e    })\u003cbr\u003e    name          = optional(string, \"signoz\")\u003cbr\u003e    storage_class = optional(string, \"gp3\")\u003cbr\u003e    cluster_name  = string\u003cbr\u003e    clickhouse = optional(object({\u003cbr\u003e      user           = optional(string, \"admin\")\u003cbr\u003e      cpu_limit      = optional(string, \"2000m\")\u003cbr\u003e      memory_limit   = optional(string, \"4Gi\")\u003cbr\u003e      cpu_request    = optional(string, \"100m\")\u003cbr\u003e      memory_request = optional(string, \"200Mi\")\u003cbr\u003e      storage        = optional(string, \"20Gi\")\u003cbr\u003e    }))\u003cbr\u003e\u003cbr\u003e    signoz_bin = optional(object({\u003cbr\u003e      replica_count       = optional(number, 1)\u003cbr\u003e      cpu_limit           = optional(string, \"750m\")\u003cbr\u003e      memory_limit        = optional(string, \"1000Mi\")\u003cbr\u003e      cpu_request         = optional(string, \"100m\")\u003cbr\u003e      memory_request      = optional(string, \"200Mi\")\u003cbr\u003e      ingress_enabled     = optional(bool, false)\u003cbr\u003e      aws_certificate_arn = optional(string, null)\u003cbr\u003e      domain              = string\u003cbr\u003e      root_domain         = optional(string, null)              // if root domain is provided, it creates DNS record\u003cbr\u003e      lb_visibility       = optional(string, \"internet-facing\") # Options: \"internal\" or \"internet-facing\"\u003cbr\u003e    }))\u003cbr\u003e\u003cbr\u003e    alertmanager = optional(object({\u003cbr\u003e      enable              = optional(bool, false)\u003cbr\u003e      replica_count       = optional(number, 1)\u003cbr\u003e      cpu_limit           = optional(string, \"750m\")\u003cbr\u003e      memory_limit        = optional(string, \"1000Mi\")\u003cbr\u003e      cpu_request         = optional(string, \"100m\")\u003cbr\u003e      memory_request      = optional(string, \"200Mi\")\u003cbr\u003e      storage             = optional(string, \"100Mi\")\u003cbr\u003e      enable_ingress      = optional(bool, false)\u003cbr\u003e      aws_certificate_arn = optional(string, null)\u003cbr\u003e      domain              = optional(string, \"signoz.example.com\")\u003cbr\u003e    }))\u003cbr\u003e\u003cbr\u003e    otel_collector = optional(object({\u003cbr\u003e      cpu_limit           = optional(string, \"1\")\u003cbr\u003e      memory_limit        = optional(string, \"2Gi\")\u003cbr\u003e      cpu_request         = optional(string, \"100m\")\u003cbr\u003e      memory_request      = optional(string, \"200Mi\")\u003cbr\u003e      storage             = optional(string, \"100Mi\")\u003cbr\u003e      enable_ingress      = optional(bool, false)\u003cbr\u003e      aws_certificate_arn = optional(string, null)\u003cbr\u003e      domain              = optional(string, \"signoz.example.com\")\u003cbr\u003e    }))\u003cbr\u003e  })\u003c/pre\u003e | \u003cpre\u003e{\u003cbr\u003e  \"cluster_name\": null,\u003cbr\u003e  \"k8s_namespace\": {\u003cbr\u003e    \"create\": true,\u003cbr\u003e    \"name\": \"signoz\"\u003cbr\u003e  },\u003cbr\u003e  \"name\": null\u003cbr\u003e}\u003c/pre\u003e | no |\n| \u003ca name=\"input_signoz_infra_monitor_config\"\u003e\u003c/a\u003e [signoz\\_infra\\_monitor\\_config](#input\\_signoz\\_infra\\_monitor\\_config) | Configuration object for deploying SigNoz infrastructure monitoring components.\u003cbr\u003e\u003cbr\u003eAttributes:\u003cbr\u003e- name: A name identifier for the monitoring deployment (used in naming resources).\u003cbr\u003e- storage\\_class: (Optional) The Kubernetes storage class to be used for persistent volumes. Defaults to \"gp3\".\u003cbr\u003e- cluster\\_name: The name of the Kubernetes cluster where SigNoz is being deployed.\u003cbr\u003e- otel\\_collector\\_endpoint: The endpoint URL for the OpenTelemetry Collector to which metrics, logs, and traces will be exported.\u003cbr\u003e- metric\\_collection\\_interval: (Optional) The interval at which metrics are collected. Defaults to \"30s\".\u003cbr\u003e- if any one ofr the values enable\\_log\\_collection,enable\\_metrics\\_collection is true, then helm chart gets installed\u003cbr\u003e\u003cbr\u003eThis variable is used to centralize configuration related to monitoring infrastructure via SigNoz. | \u003cpre\u003eobject({\u003cbr\u003e    k8s_namespace = optional(object({\u003cbr\u003e      name   = optional(string, \"signoz\")\u003cbr\u003e      create = optional(bool, false)\u003cbr\u003e    }))\u003cbr\u003e    name                       = string\u003cbr\u003e    storage_class              = optional(string, \"gp3\")\u003cbr\u003e    cluster_name               = string\u003cbr\u003e    enable_log_collection      = optional(bool, false)\u003cbr\u003e    enable_metrics_collection  = optional(bool, false)\u003cbr\u003e    otel_collector_endpoint    = optional(string, null)\u003cbr\u003e    metric_collection_interval = optional(string, \"30s\")\u003cbr\u003e  })\u003c/pre\u003e | \u003cpre\u003e{\u003cbr\u003e  \"cluster_name\": null,\u003cbr\u003e  \"name\": null\u003cbr\u003e}\u003c/pre\u003e | no |\n| \u003ca name=\"input_tags\"\u003e\u003c/a\u003e [tags](#input\\_tags) | (optional) Tags for AWS resources | `map(string)` | `{}` | no |\n| \u003ca name=\"input_tracing_stack\"\u003e\u003c/a\u003e [tracing\\_stack](#input\\_tracing\\_stack) | (optional) Distributed tracing stack | `string` | `null` | no |\n\n## Outputs\n\n| Name | Description |\n|------|-------------|\n| \u003ca name=\"output_grafana_lb_dns\"\u003e\u003c/a\u003e [grafana\\_lb\\_dns](#output\\_grafana\\_lb\\_dns) | Grafana ingress loadbalancer DNS |\n| \u003ca name=\"output_kibana_lb_dns\"\u003e\u003c/a\u003e [kibana\\_lb\\_dns](#output\\_kibana\\_lb\\_dns) | Kibana ingress loadbalancer DNS |\n| \u003ca name=\"output_otel_collector_endpoint\"\u003e\u003c/a\u003e [otel\\_collector\\_endpoint](#output\\_otel\\_collector\\_endpoint) | OTEL collector endpoint |\n| \u003ca name=\"output_signoz_lb_dns\"\u003e\u003c/a\u003e [signoz\\_lb\\_dns](#output\\_signoz\\_lb\\_dns) | Signoz ingress loadbalancer DNS |\n\u003c!-- END OF PRE-COMMIT-TERRAFORM DOCS HOOK --\u003e\n\n## Development\n\n### Prerequisites\n- [terraform](https://learn.hashicorp.com/terraform/getting-started/install#installing-terraform)\n- [terraform-docs](https://github.com/segmentio/terraform-docs)\n- [pre-commit](https://pre-commit.com/#install)\n- [golang](https://golang.org/doc/install#install)\n- [golint](https://github.com/golang/lint#installation)\n\n### Configurations\n- Configure pre-commit hooks\n  ```sh\n  pre-commit install\n  ```\n- Configure golang deps for tests\n  ```sh\n  go get github.com/gruntwork-io/terratest/modules/terraform\n  go get github.com/stretchr/testify/assert\n  ```\n### Git commits\n\nwhile Contributing or doing git commit please specify the breaking change in your commit message whether its major,minor or patch\n\nFor Example\n\n```sh\ngit commit -m \"your commit message #major\"\n```\nBy specifying this , it will bump the version and if you dont specify this in your commit message then by default it will consider patch and will bump that accordingly\n\n### Tests\n- Tests are available in `test` directory\n- In the test directory, run the below command\n  ```sh\n  go test -timeout 1800s\n  ```\n\n## Authors\nThis project is authored by:\n- SourceFuse\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsourcefuse%2Fterraform-aws-arc-observability-stack","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsourcefuse%2Fterraform-aws-arc-observability-stack","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsourcefuse%2Fterraform-aws-arc-observability-stack/lists"}