{"id":19347791,"url":"https://github.com/devopscorner/golang-adot","last_synced_at":"2025-04-23T05:32:29.689Z","repository":{"id":153629014,"uuid":"630083141","full_name":"devopscorner/golang-adot","owner":"devopscorner","description":"AWS Summit 2023 ASEAN --- COM301 Implementing Observability using AWS Distro for OpenTelemetry (ADOT). Usecase Implementation for Simple Golang RESTful API Application (Bookstore)","archived":false,"fork":false,"pushed_at":"2024-10-29T18:18:40.000Z","size":2316,"stargazers_count":6,"open_issues_count":0,"forks_count":1,"subscribers_count":4,"default_branch":"master","last_synced_at":"2024-10-29T20:25:28.166Z","etag":null,"topics":["adot","aws","awscli","awscliv2","devops","devopscorner","eks","eksctl","go","helm-template","helmchart","opensearch","opentelemetry","otel","otel-agent","otel-collector","terraform"],"latest_commit_sha":null,"homepage":"https://devopscorner.id","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/devopscorner.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"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}},"created_at":"2023-04-19T16:22:18.000Z","updated_at":"2024-10-29T18:41:56.000Z","dependencies_parsed_at":"2023-09-26T05:42:23.577Z","dependency_job_id":"3153add8-e1bd-457d-aa45-8ef531584c66","html_url":"https://github.com/devopscorner/golang-adot","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devopscorner%2Fgolang-adot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devopscorner%2Fgolang-adot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devopscorner%2Fgolang-adot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devopscorner%2Fgolang-adot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/devopscorner","download_url":"https://codeload.github.com/devopscorner/golang-adot/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":223910280,"owners_count":17223662,"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","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":["adot","aws","awscli","awscliv2","devops","devopscorner","eks","eksctl","go","helm-template","helmchart","opensearch","opentelemetry","otel","otel-agent","otel-collector","terraform"],"created_at":"2024-11-10T04:18:04.007Z","updated_at":"2024-11-10T04:18:04.674Z","avatar_url":"https://github.com/devopscorner.png","language":"HCL","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Golang Bookstore ADOT\n\nADOT (AWS Distro for OpenTelemetry) Implementation for Simple Golang RESTful API Application (Bookstore)\n\n[![goreport](https://goreportcard.com/badge/github.com/devopscorner/golang-adot/src)](https://goreportcard.com/badge/github.com/devopscorner/golang-adot/src)\n[![all contributors](https://img.shields.io/github/contributors/devopscorner/golang-adot)](https://github.com/devopscorner/golang-adot/graphs/contributors)\n[![tags](https://img.shields.io/github/v/tag/devopscorner/golang-adot?sort=semver)](https://github.com/devopscorner/golang-adot/releases)\n[![docker pulls](https://img.shields.io/docker/pulls/devopscorner/bookstore-adot.svg)](https://hub.docker.com/r/devopscorner/bookstore-adot/)\n![download all](https://img.shields.io/github/downloads/devopscorner/golang-adot/total.svg)\n![download latest](https://img.shields.io/github/downloads/devopscorner/golang-adot/1.1.4/total)\n![view](https://views.whatilearened.today/views/github/devopscorner/golang-adot.svg)\n![clone](https://img.shields.io/badge/dynamic/json?color=success\u0026label=clone\u0026query=count\u0026url=https://github.com/devopscorner/golang-adot/blob/master/clone.json?raw=True\u0026logo=github)\n[![issues](https://img.shields.io/github/issues/devopscorner/golang-adot)](https://github.com/devopscorner/golang-adot/issues)\n[![pull requests](https://img.shields.io/github/issues-pr/devopscorner/golang-adot)](https://github.com/devopscorner/golang-adot/pulls)\n[![forks](https://img.shields.io/github/forks/devopscorner/golang-adot)](https://github.com/devopscorner/golang-adot/fork)\n[![stars](https://img.shields.io/github/stars/devopscorner/golang-adot)](https://github.com/devopscorner/golang-adot/stargazers)\n[![license](https://img.shields.io/github/license/devopscorner/golang-adot)](https://img.shields.io/github/license/devopscorner/golang-adot)\n\n---\n\n## Available Tags\n\n### Alpine GOLANG\n\n| Image name | Size |\n|------------|------|\n| `devopscorner/bookstore-adot:latest` | [![docker image size](https://img.shields.io/docker/image-size/devopscorner/bookstore-adot/latest.svg?label=Image%20size\u0026logo=docker)](https://hub.docker.com/repository/docker/devopscorner/bookstore-adot/tags?page=1\u0026ordering=last_updated\u0026name=latest) ![default-latest](https://img.shields.io/static/v1?label=latest\u0026message=default\u0026color=brightgreen) ![latest](https://img.shields.io/static/v1?label=latest\u0026message=alpine\u0026color=orange) |\n| `devopscorner/bookstore-adot:alpine` | [![docker image size](https://img.shields.io/docker/image-size/devopscorner/bookstore-adot/alpine.svg?label=Image%20size\u0026logo=docker)](https://hub.docker.com/repository/docker/devopscorner/bookstore-adot/tags?page=1\u0026ordering=last_updated\u0026name=alpine) ![latest](https://img.shields.io/static/v1?label=latest\u0026message=alpine\u0026color=orange) |\n| `devopscorner/bookstore-adot:alpine-latest` | [![docker image size](https://img.shields.io/docker/image-size/devopscorner/bookstore-adot/alpine-latest.svg?label=Image%20size\u0026logo=docker)](https://hub.docker.com/repository/docker/devopscorner/bookstore-adot/tags?page=1\u0026ordering=last_updated\u0026name=alpine-latest) |\n| `devopscorner/bookstore-adot:alpine-3.17` | [![docker image size](https://img.shields.io/docker/image-size/devopscorner/bookstore-adot/alpine-3.17.svg?label=Image%20size\u0026logo=docker)](https://hub.docker.com/repository/docker/devopscorner/bookstore-adot/tags?page=1\u0026ordering=last_updated\u0026name=alpine-3.17) |\n\n### CICD Alpine-3.17\n\n| Image name | Size |\n|------------|------|\n| `devopscorner/bookstore-adot:cicd-alpine` | [![docker image size](https://img.shields.io/docker/image-size/devopscorner/bookstore-adot/cicd-alpine.svg?label=Image%20size\u0026logo=docker)](https://hub.docker.com/repository/docker/devopscorner/bookstore-adot/tags?page=1\u0026ordering=last_updated\u0026name=cicd-alpine) |\n| `devopscorner/bookstore-adot:cicd-alpine-latest` | [![docker image size](https://img.shields.io/docker/image-size/devopscorner/bookstore-adot/cicd-alpine-latest.svg?label=Image%20size\u0026logo=docker)](https://hub.docker.com/repository/docker/devopscorner/bookstore-adot/tags?page=1\u0026ordering=last_updated\u0026name=cicd-alpine-latest) |\n| `devopscorner/bookstore-adot:cicd-alpine-3.17` | [![docker image size](https://img.shields.io/docker/image-size/devopscorner/bookstore-adot/cicd-alpine-3.17.svg?label=Image%20size\u0026logo=docker)](https://hub.docker.com/repository/docker/devopscorner/bookstore-adot/tags?page=1\u0026ordering=last_updated\u0026name=cicd-alpine-3.17) |\n\n### CICD CodeBuild-4.0\n\n| Image name | Size |\n|------------|------|\n| `devopscorner/bookstore-adot:cicd-codebuild` | [![docker image size](https://img.shields.io/docker/image-size/devopscorner/bookstore-adot/cicd-codebuild.svg?label=Image%20size\u0026logo=docker)](https://hub.docker.com/repository/docker/devopscorner/bookstore-adot/tags?page=1\u0026ordering=last_updated\u0026name=cicd-codebuild) ![default-cicd-codebuild](https://img.shields.io/static/v1?label=latest\u0026message=default\u0026color=brightgreen) ![cicd-codebuild](https://img.shields.io/static/v1?label=latest\u0026message=cicd-codebuild\u0026color=orange) |\n| `devopscorner/bookstore-adot:cicd-codebuild-latest` | [![docker image size](https://img.shields.io/docker/image-size/devopscorner/bookstore-adot/cicd-codebuild-latest.svg?label=Image%20size\u0026logo=docker)](https://hub.docker.com/repository/docker/devopscorner/bookstore-adot/tags?page=1\u0026ordering=last_updated\u0026name=cicd-codebuild-latest) |\n| `devopscorner/bookstore-adot:cicd-codebuild-4.0` | [![docker image size](https://img.shields.io/docker/image-size/devopscorner/bookstore-adot/cicd-codebuild-4.0.svg?label=Image%20size\u0026logo=docker)](https://hub.docker.com/repository/docker/devopscorner/bookstore-adot/tags?page=1\u0026ordering=last_updated\u0026name=cicd-codebuild-4.0) |\n| `devopscorner/bookstore-adot:cicd-latest` | [![docker image size](https://img.shields.io/docker/image-size/devopscorner/bookstore-adot/cicd-latest.svg?label=Image%20size\u0026logo=docker)](https://hub.docker.com/repository/docker/devopscorner/bookstore-adot/tags?page=1\u0026ordering=last_updated\u0026name=cicd-latest) ![cicd-latest](https://img.shields.io/static/v1?label=latest\u0026message=cicd-codebuild\u0026color=orange) |\n\n---\n\n## Documentation\n\n- Index Documentation, go to [this](docs/README.md) link\n- Build, Tag \u0026 Push container image to **DockerHub**, go to [this](docs/container-bookstore-adot-dockerhub.md) link\n- Build, Tag \u0026 Push container image to **Amazon ECR (Elastic Container Registry)**, go to [this](docs/container-bookstore-adot-ecr.md) link\n- Workflow CI/CD Pipeline, go to [this](docs/workflow-cicd-bookstore-adot-pipeline.md) link\n- Deployments:\n  - **AWS Developer Tools** (AWS CodeCommit, AWS CodeBuild \u0026 AWS CodePipeline), detail [here](docs/deployment-aws-developer-tools.md) link\n  - **Jenkins CI/CD**, detail [here](docs/deployment-jenkins.md) link\n  - **Terraform AWS CodeBuild, AWS CodePipeline \u0026 Amazon SNS**, detail [here](docs/deployment-terraform.md) link\n\n\n## GO Repository Pattern\n\n- Folder Structure\n\n```\n.\n├── .env\n├── .env.example\n├── config\n│   ├── config.go\n│   ├── config_test.go\n│   ├── const.go\n│   ├── logger.go\n│   └── value.go\n├── controller\n│   ├── book_controller.go\n│   ├── book_controller_test.go\n│   ├── login_controller.go\n│   └── login_controller_test.go\n├── driver\n│   ├── db.go\n│   ├── dynamodb.go\n│   ├── mysql.go\n│   ├── psql.go\n│   └── sqlite.go\n├── go.mod\n├── go.sum\n├── main.go\n├── main_test.go\n├── middleware\n│   ├── auth_middleware.go\n│   └── auth_middleware_test.go\n├── migrate_book.go.example\n├── migrate_book_dynamo.go.example\n├── model\n│   └── book.go\n├── observability\n│   ├── metrics.go\n│   ├── provider.go\n│   ├── tracing-otel.go\n│   └── tracing-xray.go\n├── repository\n│   └── book_repository.go\n├── routes\n│   ├── book_routes.go\n│   ├── main_routes.go\n│   ├── telemetry_routes.go\n│   └── tracing_routes.go\n└── view\n    ├── book_view.go\n    ├── error_view.go\n    └── login_view.go\n\n10 directories, 37 files\n```\n\n## Coverages:\n### AWS Services\n- Amazon Elastic Container Registry (ECR)\n- Amazon Managed Service for Prometheus (AMP)\n- Amazon Managed Service for Grafana (AMG)\n- AWS Distro for OpenTelemetry (ADOT)\n- AWS CloudWatch\n- AWS X-Ray\n- AWS Systems Manager Parameter Store\n- AWS Developer Tools (AWS CodeCommit, AWS CodePipeline, AWS CodeBuild)\n- Amazon EKS\n- Amazon OpenSearch -- *(Optional)*\n- Amazon DynamoDB\n\n### Others:\n- Docker\n- Docker-Compose\n- Golang\n- HelmChart\n- Postman\n- Terraform\n\n## Environment Variables\n\n- Default Value\n  ```\n  GIN_MODE=release\n  APP_URL=http://localhost\n  APP_PORT=8080\n  DB_CONNECTION=dynamo\n  DB_HOST=localhost\n  DB_PORT=\n  DB_DATABASE=dynamodb-golang-adot\n  DB_USERNAME=root\n  DB_PASSWORD=\n  JWT_AUTH_USERNAME=devopscorner\n  JWT_AUTH_PASSWORD=DevOpsCorner2023\n  JWT_SECRET=s3cr3t\n  ```\n\n- Multi Driver Connection\n  ```\n  # default\n  DB_CONNECTION=dynamo\n  ---\n  Available for:\n  - sqlite\n  - mysql\n  - postgres\n  - dynamo\n  ```\n\n- DynamoDB Connection\n  ```\n  DB_CONNECTION=dynamo\n  ---\n  DB_DATABASE       --\u003e Dynamo Table\n  AWS_REGION        --\u003e AWS Region (Dynamo Region)\n  AWS_ACCESS_KEY    --\u003e AWS Access Key\n  AWS_SECRET_KEY_ID --\u003e AWS Secret Key Id\n  ```\n\n- AWS X-Ray (AWS Distribution Tracing System)\n  - `XRAY_VERSION`: Daemon Version X-Ray\n    - `latest`: Use the latest version of the AWS X-Ray daemon available.\n    - `3.x`: Use version 3.x of the AWS X-Ray daemon.\n    - `2.x`: Use version 2.x of the AWS X-Ray daemon.\n    - `1.x`: Use version 1.x of the AWS X-Ray daemon.\n\n  - `XRAY_DAEMON_ENDPOINT: Daemon Endpoint of X-Ray\n    ```\n    XRAY_DAEMON_ENDPOINT=http://localhost:2000\n    ```\n  - `XRAY_DAEMON_PORT: Daemon Endpoint Port of X-Ray\n    ```\n    XRAY_DAEMON_PORT=2000\n    ```\n\n- Prometheus\n  ```\n  PROMETHEUS_ENDPOINT=http://localhost:9090\n  PROMETHEUS_PORT=9090\n  ```\n\n- Grafana\n  ```\n  GRAFANA_ENDPOINT=http://localhost:3000\n  GRAFANA_API_KEY=YOUR_GRAFANA_API_KEY\n  ```\n\n- OpenTelemetry\n  ```\n  OTEL_INSTRUMENTATION_METRIC_ENABLED=true\n  OTEL_INSTRUMENTATION_TRACE_ENABLED=true\n  OTEL_INSTRUMENTATION_LOG_ENABLED=true\n\n  # Trace Type: xray / jaeger\n  OTEL_INSTRUMENTATION_TRACE_NAME=xray\n\n  OTEL_SERVICE_NAME=bookstore-adot\n  OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317\n  OTEL_EXPORTER_OTLP_PORT=4317\n  OTEL_EXPORTER_OTLP_INSECURE=true\n  OTEL_EXPORTER_OTLP_HEADERS=\n  OTEL_RESOURCE_ATTRIBUTES=\n  ```\n\n- Jaeger Environment\n  - `JAEGER_SERVICE_NAME`: The name of the service being instrumented (`JAEGER_SERVICE_NAME` = `OTEL_SERVICE_NAME`).\n  - `JAEGER_AGENT_HOST`: The host name or IP address of the Jaeger agent to use for sending trace data.\n  - `JAEGER_AGENT_PORT`: The port number of the Jaeger agent to use for sending trace data.\n  - `JAEGER_SAMPLER_TYPE`: The type of sampling to use for tracing (e.g. const, probabilistic, rateLimiting, remote).\n  - `JAEGER_SAMPLER_PARAM`: The parameter value to use for the selected sampler type.\n  - `JAEGER_SAMPLER_MANAGER_HOST_PORT`: The host name and port of the remote sampling manager to use (if using remote sampling).\n  - `JAEGER_REPORTER_LOG_SPANS`: Whether to log spans instead of sending them to a Jaeger agent (e.g. true or false).\n  - `JAEGER_REPORTER_MAX_QUEUE_SIZE`: The maximum number of spans that can be queued before they are sent to a Jaeger agent.\n  - `JAEGER_REPORTER_FLUSH_INTERVAL`: The interval at which to flush the span queue and send spans to a Jaeger agent (e.g. 1 * time.Second).\n  - `JAEGER_REPORTER_LOCAL_AGENT_HOST_PORT`: The host and port of the local Jaeger agent, if using UDP instead of HTTP.\n  - `JAEGER_REPORTER_COLLECTOR_ENDPOINT`: The endpoint URL of the Jaeger collector (e.g. `http://localhost:14268/api/traces`).\n  - `JAEGER_REPORTER_COLLECTOR_USER`: The username for authenticating with the Jaeger collector, if required.\n  - `JAEGER_REPORTER_COLLECTOR_PASSWORD`: The password for authenticating with the Jaeger collector, if required.\n  - `JAEGER_TAGS`: Additional tags to attach to the trace (e.g. key1=value1,key2=value2).\n\n\n## Reproduce Testing\n\n- RESTful API Testing, go to [this](docs/test-restful-api.md) link\n\n## Reproduce Provisioning\n  1. Install Terraform Modules, detail [here](docs/reproduce-01-teraform-modules.md)\n  2. Provisioning HelmChart Template, detail [here](docs/reproduce-02-helm-template.md)\n  3. Provisioning TFState DB \u0026 Bucket, detail [here](docs/reproduce-03-provisioning-tfstate-db-bucket.md)\n  4. Provisioning Infra Core, detail [here](docs/reproduce-04-provisioning-infra-core.md)\n  5. Provisioning Infra CI/CD, detail [here](docs/reproduce-05-provisioning-infra-cicd.md)\n  6. Provisioning Resources Amazon EKS, detail [here](docs/reproduce-06-provisioning-resources-eks.md)\n  7. Provisioning Resources Managed Services Prometheus (AMP), detail [here](docs/reproduce-07-provisioning-resources-amp.md)\n  8. Provisioning Resources Managed Services Grafana (AMG), detail [here](docs/reproduce-08-provisioning-resources-amg.md)\n  9. Provisioning Resources Managed Services OpenSearch, detail [here](docs/reproduce-09-provisioning-resources-opensearch.md)\n  10. Provisioning Resources EKS ADOT Collector, detail [here](docs/reproduce-10-provisioning-resources-eks-adot-collector.md)\n\n## Snapshots\n\n- Grafana Dashboard\n  ![golang-adot-001](./docs/assets/adot-001.png)\n  ![golang-adot-002](./docs/assets/adot-002.png)\n\n- XRay\n  ![golang-adot-003](./docs/assets/adot-003.png)\n  ![golang-adot-004](./docs/assets/adot-004.png)\n\n## Tested Environment\n\n### Versioning\n\n- Docker version\n\n  ```\n  docker version\n\n  Client:\n    Cloud integration: v1.0.22\n    Version:           20.10.17-rd\n    API version:       1.41\n    Go version:        go1.17.11\n    Git commit:        c2e4e01\n    Built:             Fri Jul 22 18:31:17 2022\n    OS/Arch:           darwin/amd64\n    Context:           default\n    Experimental:      true\n  ```\n\n- Docker-Compose version\n\n  ```\n  docker-compose -v\n  ---\n  Docker Compose version v2.11.1\n  ```\n\n- AWS Cli\n\n  ```\n  aws --version\n  ---\n  aws-cli/2.8.7 Python/3.9.11 Darwin/21.6.0 exe/x86_64 prompt/off\n  ```\n\n- Terraform Cli\n\n  ```\n  terraform version\n  ---\n  Terraform v1.3.5\n  on darwin_amd64\n  - provider registry.terraform.io/hashicorp/aws v3.74.3\n  - provider registry.terraform.io/hashicorp/local v2.1.0\n  - provider registry.terraform.io/hashicorp/null v3.1.0\n  - provider registry.terraform.io/hashicorp/random v3.1.0\n  - provider registry.terraform.io/hashicorp/time v0.7.2\n  ```\n\n- Terraform Environment Cli\n\n  ```\n  tfenv -v\n  ---\n  tfenv 2.2.2\n  ```\n\n- Golang Version Manager (GVM)\n\n  ```\n  gvm version\n  ---\n  Go Version Manager v1.0.22 installed at /Users/devopscorner/.gvm\n  ```\n\n- Golang Version\n  ```\n  go version\n  ---\n  go version go1.19.6 darwin/arm64\n  ```\n\n## Security Check\n\nMake sure that you didn't push sensitive information in this repository\n\n- [ ] AWS Credentials (AWS_ACCESS_KEY, AWS_SECRET_KEY)\n- [ ] AWS Account ID\n- [ ] AWS Resources ARN\n- [ ] Username \u0026 Password\n- [ ] Private (id_rsa) \u0026 Public Key (id_rsa.pub)\n- [ ] DNS Zone ID\n- [ ] APP \u0026 API Key\n\n## Copyright\n\n- Author: **Dwi Fahni Denni (@zeroc0d3)**\n- Vendor: **DevOps Corner Indonesia (devopscorner.id)**\n- License: **Apache v2**\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevopscorner%2Fgolang-adot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdevopscorner%2Fgolang-adot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevopscorner%2Fgolang-adot/lists"}