From dd9f12c2dff346cb5fac080d266e02ed7e2b18b6 Mon Sep 17 00:00:00 2001 From: Matteo Busi Date: Mon, 18 Oct 2021 17:11:28 +0200 Subject: [PATCH] Publish on hex.pm (#2) --- .credo.exs | 189 ++++++++++++ .dialyzer_ignore.exs | 1 + .drone.yml | 286 ++++++++++++++++++ Dockerfile | 14 + LICENSE.md | 21 ++ README.md | 12 + deploy/build | 31 ++ docker-compose.yml | 10 + entrypoint | 7 + lib/prima_opentelemetry_ex.ex | 13 +- .../resource_detector.ex | 11 +- mix.exs | 60 +++- mix.lock | 11 + test/resource_detector_test.exs | 24 ++ 14 files changed, 681 insertions(+), 9 deletions(-) create mode 100644 .credo.exs create mode 100644 .dialyzer_ignore.exs create mode 100644 .drone.yml create mode 100644 Dockerfile create mode 100644 LICENSE.md create mode 100755 deploy/build create mode 100644 docker-compose.yml create mode 100755 entrypoint create mode 100644 test/resource_detector_test.exs diff --git a/.credo.exs b/.credo.exs new file mode 100644 index 0000000..7bc729a --- /dev/null +++ b/.credo.exs @@ -0,0 +1,189 @@ +# This file contains the configuration for Credo and you are probably reading +# this after creating it with `mix credo.gen.config`. +# +# If you find anything wrong or unclear in this file, please report an +# issue on GitHub: https://github.com/rrrene/credo/issues +# +%{ + # + # You can have as many configs as you like in the `configs:` field. + configs: [ + %{ + # + # Run any config using `mix credo -C `. If no config name is given + # "default" is used. + # + name: "default", + # + # These are the files included in the analysis: + files: %{ + # + # You can give explicit globs or simply directories. + # In the latter case `**/*.{ex,exs}` will be used. + # + included: [ + "lib/", + "src/", + "test/", + "web/", + "apps/*/lib/", + "apps/*/src/", + "apps/*/test/", + "apps/*/web/" + ], + excluded: [~r"/_build/", ~r"/deps/", ~r"/node_modules/"] + }, + # + # Load and configure plugins here: + # + plugins: [], + # + # If you create your own checks, you must specify the source files for + # them here, so they can be loaded by Credo before running the analysis. + # + requires: [], + # + # If you want to enforce a style guide and need a more traditional linting + # experience, you can change `strict` to `true` below: + # + strict: false, + # + # To modify the timeout for parsing files, change this value: + # + parse_timeout: 5000, + # + # If you want to use uncolored output by default, you can change `color` + # to `false` below: + # + color: true, + # + # You can customize the parameters of any check by adding a second element + # to the tuple. + # + # To disable a check put `false` as second element: + # + # {Credo.Check.Design.DuplicatedCode, false} + # + checks: [ + # + ## Consistency Checks + # + {Credo.Check.Consistency.ExceptionNames, []}, + {Credo.Check.Consistency.LineEndings, []}, + {Credo.Check.Consistency.ParameterPatternMatching, []}, + {Credo.Check.Consistency.SpaceAroundOperators, []}, + {Credo.Check.Consistency.SpaceInParentheses, []}, + {Credo.Check.Consistency.TabsOrSpaces, []}, + + # + ## Design Checks + # + # You can customize the priority of any check + # Priority values are: `low, normal, high, higher` + # + {Credo.Check.Design.AliasUsage, + [priority: :low, if_nested_deeper_than: 2, if_called_more_often_than: 0]}, + # You can also customize the exit_status of each check. + # If you don't want TODO comments to cause `mix credo` to fail, just + # set this value to 0 (zero). + # + {Credo.Check.Design.TagTODO, [exit_status: 2]}, + {Credo.Check.Design.TagFIXME, []}, + + # + ## Readability Checks + # + {Credo.Check.Readability.AliasOrder, []}, + {Credo.Check.Readability.FunctionNames, []}, + {Credo.Check.Readability.LargeNumbers, []}, + {Credo.Check.Readability.MaxLineLength, [priority: :low, max_length: 120]}, + {Credo.Check.Readability.ModuleAttributeNames, []}, + {Credo.Check.Readability.ModuleDoc, []}, + {Credo.Check.Readability.ModuleNames, []}, + {Credo.Check.Readability.ParenthesesInCondition, []}, + {Credo.Check.Readability.ParenthesesOnZeroArityDefs, []}, + {Credo.Check.Readability.PredicateFunctionNames, []}, + {Credo.Check.Readability.PreferImplicitTry, []}, + {Credo.Check.Readability.RedundantBlankLines, []}, + {Credo.Check.Readability.Semicolons, []}, + {Credo.Check.Readability.SpaceAfterCommas, []}, + {Credo.Check.Readability.StringSigils, []}, + {Credo.Check.Readability.TrailingBlankLine, []}, + {Credo.Check.Readability.TrailingWhiteSpace, []}, + {Credo.Check.Readability.UnnecessaryAliasExpansion, []}, + {Credo.Check.Readability.VariableNames, []}, + + # + ## Refactoring Opportunities + # + {Credo.Check.Refactor.CondStatements, []}, + {Credo.Check.Refactor.CyclomaticComplexity, []}, + {Credo.Check.Refactor.FunctionArity, []}, + {Credo.Check.Refactor.LongQuoteBlocks, []}, + # {Credo.Check.Refactor.MapInto, []}, + {Credo.Check.Refactor.MatchInCondition, []}, + {Credo.Check.Refactor.NegatedConditionsInUnless, []}, + {Credo.Check.Refactor.NegatedConditionsWithElse, []}, + {Credo.Check.Refactor.Nesting, []}, + {Credo.Check.Refactor.UnlessWithElse, []}, + {Credo.Check.Refactor.WithClauses, []}, + + # + ## Warnings + # + {Credo.Check.Warning.ApplicationConfigInModuleAttribute, []}, + {Credo.Check.Warning.BoolOperationOnSameValues, []}, + {Credo.Check.Warning.ExpensiveEmptyEnumCheck, []}, + {Credo.Check.Warning.IExPry, []}, + {Credo.Check.Warning.IoInspect, []}, + # {Credo.Check.Warning.LazyLogging, []}, + {Credo.Check.Warning.MixEnv, false}, + {Credo.Check.Warning.OperationOnSameValues, []}, + {Credo.Check.Warning.OperationWithConstantResult, []}, + {Credo.Check.Warning.RaiseInsideRescue, []}, + {Credo.Check.Warning.UnusedEnumOperation, []}, + {Credo.Check.Warning.UnusedFileOperation, []}, + {Credo.Check.Warning.UnusedKeywordOperation, []}, + {Credo.Check.Warning.UnusedListOperation, []}, + {Credo.Check.Warning.UnusedPathOperation, []}, + {Credo.Check.Warning.UnusedRegexOperation, []}, + {Credo.Check.Warning.UnusedStringOperation, []}, + {Credo.Check.Warning.UnusedTupleOperation, []}, + {Credo.Check.Warning.UnsafeExec, []}, + + # + # Checks scheduled for next check update (opt-in for now, just replace `false` with `[]`) + + # + # Controversial and experimental checks (opt-in, just replace `false` with `[]`) + # + {Credo.Check.Consistency.MultiAliasImportRequireUse, false}, + {Credo.Check.Consistency.UnusedVariableNames, false}, + {Credo.Check.Design.DuplicatedCode, false}, + {Credo.Check.Readability.AliasAs, false}, + {Credo.Check.Readability.BlockPipe, false}, + {Credo.Check.Readability.ImplTrue, false}, + {Credo.Check.Readability.MultiAlias, false}, + {Credo.Check.Readability.SeparateAliasRequire, false}, + {Credo.Check.Readability.SinglePipe, false}, + {Credo.Check.Readability.Specs, false}, + {Credo.Check.Readability.StrictModuleLayout, false}, + {Credo.Check.Readability.WithCustomTaggedTuple, false}, + {Credo.Check.Refactor.ABCSize, false}, + {Credo.Check.Refactor.AppendSingleItem, false}, + {Credo.Check.Refactor.DoubleBooleanNegation, false}, + {Credo.Check.Refactor.ModuleDependencies, false}, + {Credo.Check.Refactor.NegatedIsNil, false}, + {Credo.Check.Refactor.PipeChainStart, false}, + {Credo.Check.Refactor.VariableRebinding, false}, + {Credo.Check.Warning.LeakyEnvironment, false}, + {Credo.Check.Warning.MapGetUnsafePass, false}, + {Credo.Check.Warning.UnsafeToAtom, false} + + # + # Custom checks can be created using `mix credo.gen.check`. + # + ] + } + ] +} diff --git a/.dialyzer_ignore.exs b/.dialyzer_ignore.exs new file mode 100644 index 0000000..fe51488 --- /dev/null +++ b/.dialyzer_ignore.exs @@ -0,0 +1 @@ +[] diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 0000000..3e988f9 --- /dev/null +++ b/.drone.yml @@ -0,0 +1,286 @@ +--- +kind: pipeline +name: default + +platform: + os: linux + arch: amd64 + +clone: + disable: true + +steps: +- name: git-clone + image: public.ecr.aws/prima/drone-git:1.3-3 + environment: + PLUGIN_DEPTH: 5 + +- name: cache-restore + image: public.ecr.aws/prima/drone-tools:1.21.0 + commands: + - . /etc/profile.d/ecs-credentials-endpoint + - cache-restore + environment: + BUCKET_NAME: prima-ci-cache + volumes: + - name: ecs + path: /etc/profile.d/ecs-credentials-endpoint + - name: docker + path: /var/run/docker.sock + - name: docker-conf + path: /root/.docker + depends_on: + - git-clone + +- name: check-secrets + image: public.ecr.aws/prima/drone-tools:1.21.0 + commands: + - . /etc/profile.d/ecs-credentials-endpoint + - check-secrets-grants + volumes: + - name: ecs + path: /etc/profile.d/ecs-credentials-endpoint + depends_on: + - git-clone + +- name: check-public-docker-images + image: public.ecr.aws/prima/drone-tools:1.21.0 + commands: + - check-public-docker-images + depends_on: + - git-clone + +- name: build-image + image: public.ecr.aws/prima/drone-tools:1.21.0 + commands: + - sed -i 's/USER app/USER root/g' ./Dockerfile + - docker build -t prima/prima_opentelemetry_ex-ci:${DRONE_COMMIT} ./ + volumes: + - name: docker + path: /var/run/docker.sock + - name: docker-conf + path: /root/.docker + depends_on: + - cache-restore + +- name: elixir-dependencies + image: prima/prima_opentelemetry_ex-ci:${DRONE_COMMIT} + commands: + - mix deps.get + depends_on: + - build-image + +- name: elixir-compile + image: prima/prima_opentelemetry_ex-ci:${DRONE_COMMIT} + commands: + - mix compile --all-warnings --warnings-as-errors --ignore-module-conflict --debug-info + environment: + MIX_ENV: test + depends_on: + - elixir-dependencies + +- name: elixir-dep-check + image: prima/prima_opentelemetry_ex-ci:${DRONE_COMMIT} + commands: + - mix deps.unlock --check-unused + environment: + MIX_ENV: test + depends_on: + - elixir-compile + +- name: elixir-format + image: prima/prima_opentelemetry_ex-ci:${DRONE_COMMIT} + commands: + - mix format --check-formatted + environment: + MIX_ENV: test + depends_on: + - elixir-compile + +- name: elixir-test + image: prima/prima_opentelemetry_ex-ci:${DRONE_COMMIT} + commands: + - mix test + environment: + MIX_ENV: test + depends_on: + - elixir-compile + +- name: elixir-credo + image: prima/prima_opentelemetry_ex-ci:${DRONE_COMMIT} + commands: + - mix credo -a --strict + environment: + MIX_ENV: test + depends_on: + - elixir-compile + +- name: elixir-dialyzer + image: prima/prima_opentelemetry_ex-ci:${DRONE_COMMIT} + commands: + - mix dialyzer + environment: + MIX_ENV: test + depends_on: + - elixir-compile + +- name: cache-save + image: public.ecr.aws/prima/drone-tools:1.21.0 + commands: + - . /etc/profile.d/ecs-credentials-endpoint + - cache-save _build deps + environment: + BUCKET_NAME: prima-ci-cache + volumes: + - name: ecs + path: /etc/profile.d/ecs-credentials-endpoint + - name: docker + path: /var/run/docker.sock + - name: docker-conf + path: /root/.docker + when: + branch: + - master + depends_on: + - elixir-compile + - elixir-format + - elixir-test + - elixir-credo + - elixir-dialyzer + - elixir-dep-check + +volumes: +- name: docker + host: + path: /var/run/docker.sock +- name: ecs + host: + path: /etc/profile.d/ecs-credentials-endpoint +- name: docker-conf + host: + path: /home/ec2-user/.docker + +trigger: + event: + - push + +--- +kind: pipeline +name: build-production + +platform: + os: linux + arch: amd64 + +clone: + disable: true + +steps: +- name: git-clone + image: public.ecr.aws/prima/drone-git:1.3-3 + environment: + PLUGIN_DEPTH: 5 + +- name: cache-restore + image: public.ecr.aws/prima/drone-tools:1.21.0 + commands: + - . /etc/profile.d/ecs-credentials-endpoint + - cache-restore + environment: + BUCKET_NAME: prima-ci-cache + volumes: + - name: ecs + path: /etc/profile.d/ecs-credentials-endpoint + - name: docker + path: /var/run/docker.sock + - name: docker-conf + path: /root/.docker + depends_on: + - git-clone + +- name: build-image + image: public.ecr.aws/prima/drone-tools:1.21.0 + commands: + - sed -i 's/USER app/USER root/g' ./Dockerfile + - docker build -t prima/prima_opentelemetry_ex-ci:${DRONE_COMMIT} ./ + volumes: + - name: docker + path: /var/run/docker.sock + - name: docker-conf + path: /root/.docker + depends_on: + - cache-restore + +- name: build-production + image: prima/prima_opentelemetry_ex-ci:${DRONE_COMMIT} + commands: + - . /etc/profile.d/ecs-credentials-endpoint + - ./deploy/build production + environment: + HEX_AUTH_KEY: + from_secret: hex_auth_key + MIX_ENV: dev + volumes: + - name: ecs + path: /etc/profile.d/ecs-credentials-endpoint + depends_on: + - build-image + +volumes: +- name: docker + host: + path: /var/run/docker.sock +- name: ecs + host: + path: /etc/profile.d/ecs-credentials-endpoint +- name: docker-conf + host: + path: /home/ec2-user/.docker + +trigger: + event: + - tag + ref: + - refs/tags/*.*.* + +--- +kind: pipeline +name: email-failure + +platform: + os: linux + arch: amd64 + +clone: + disable: true + +steps: +- name: email-failure + image: public.ecr.aws/prima/drone-email + settings: + from: drone@prima.it + host: email-smtp.eu-west-1.amazonaws.com + environment: + PLUGIN_PASSWORD: + from_secret: email_password + PLUGIN_USERNAME: + from_secret: email_username + +trigger: + status: + - failure + target: + exclude: + - qa-stack + - qa-it + - qa + +depends_on: +- default +- build-production + +--- +kind: signature +hmac: 4cdb7b936550f0da6f173d4c255860d50475532c3c8774ef9489cf3fa2fd6bb1 + +... diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..7d02421 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,14 @@ +FROM public.ecr.aws/prima/elixir:1.11.2-2 + +WORKDIR /code + +RUN mix local.hex --force && \ + mix local.rebar --force && \ + cp -rp /root/.mix /home/app/ && \ + chown -R app:app /home/app/.mix + +USER app + +COPY ["entrypoint", "/entrypoint"] + +ENTRYPOINT ["/entrypoint"] diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..078ae7f --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,21 @@ +# The MIT License (MIT) + +Copyright (c) 2020 Prima.it + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index baa233c..a958604 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,9 @@ # PrimaOpentelemetryEx +[![Module Version](https://img.shields.io/hexpm/v/prima_opentelemetry_ex.svg)](https://hex.pm/packages/prima_opentelemetry_ex) +[![Hex Docs](https://img.shields.io/badge/hex-docs-lightgreen.svg)](https://hexdocs.pm/telepoison/) +[![Total Download](https://img.shields.io/hexpm/dt/telepoison.svg)](https://hex.pm/packages/telepoison) +[![License](https://img.shields.io/hexpm/l/telepoison.svg)](https://github.com/primait/telepoison/blob/master/LICENSE.md) +[![Last Updated](https://img.shields.io/github/last-commit/primait/telepoison.svg)](https://github.com/primait/telepoison/commits/master) This is your one-stop source of all things opentelemetry in elixir. You can stop getting headaches figuring out which opentelemetry_beam library you need or resolving dependencies conflicts. @@ -132,3 +137,10 @@ config :prima_opentelemetry_ex, :graphql, ``` All the `:graphql` configurations get passed directly to `OpentelemetryAbsinthe`. For more informations about what you can do with them, see opentelemetry_absinthe [readme](https://github.com/primait/opentelemetry_absinthe#readme) +## Copyright and License + +Copyright (c) 2020 Prima.it + +This work is free. You can redistribute it and/or modify it under the +terms of the MIT License. See the [LICENSE.md](./LICENSE.md) file for more details. + diff --git a/deploy/build b/deploy/build new file mode 100755 index 0000000..4c73723 --- /dev/null +++ b/deploy/build @@ -0,0 +1,31 @@ +#!/usr/bin/env bash + +############################################################################# +# # +# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN # +# # +############################################################################# + +# script exit when a command fails +set -o errexit +# catch a command error in pipe execution +set -o pipefail +# exit when try to use undeclared variables +# set -o nounset +# print and expand each command to stdout before executing it +set -o xtrace + +if [ $# -eq 0 ]; then + echo "Missing required argument: environment" + exit 1 +fi + +export ENV=$1 +export AWS_DEFAULT_REGION="eu-west-1" +export VERSION="${DRONE_TAG:-$DRONE_COMMIT_SHA}" + +mix deps.get + +mix hex.config api_key "$HEX_AUTH_KEY" +mix hex.user whoami +mix hex.publish --yes diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..2b08eca --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,10 @@ +version: '3' +services: + web: + build: . + volumes: + - .:/code + - "~/.ssh:/home/app/.ssh" + - "~/.aws:/home/app/.aws" + - "~/.gitconfig:/home/app/.gitconfig" + working_dir: /code diff --git a/entrypoint b/entrypoint new file mode 100755 index 0000000..507bc00 --- /dev/null +++ b/entrypoint @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +if [ "$1" == "mix" ]; then + exec "$@" +else [ -n "$1" ]; + sh -c "$@" +fi \ No newline at end of file diff --git a/lib/prima_opentelemetry_ex.ex b/lib/prima_opentelemetry_ex.ex index 97c0f18..399896a 100644 --- a/lib/prima_opentelemetry_ex.ex +++ b/lib/prima_opentelemetry_ex.ex @@ -1,6 +1,11 @@ defmodule PrimaOpentelemetryEx do @moduledoc """ - Documentation for `PrimaOpentelemetryEx`. + Swiss knife module for opentelemetry instrumentation. + It can be used to setup instrument: + - Teleplug + - Telepoison + - OpentelemetryAbsinthe + - OpentelemetryEcto """ @doc """ @@ -48,7 +53,7 @@ defmodule PrimaOpentelemetryEx do :opentelemetry, :resource_detectors, detectors ++ [PrimaOpentelemetryEx.ResourceDetector], - permanent: true + persistent: true ) end @@ -58,7 +63,7 @@ defmodule PrimaOpentelemetryEx do endpoint = Application.get_env(:prima_opentelemetry_ex, :endpoint, []) protocol = Keyword.get(endpoint, :protocol, :http) host = Keyword.get(endpoint, :host, "jaeger") - port = Keyword.get(endpoint, :port, 55681) + port = Keyword.get(endpoint, :port, 55_681) Application.put_env( :opentelemetry, @@ -69,7 +74,7 @@ defmodule PrimaOpentelemetryEx do exporter: {:opentelemetry_exporter, %{endpoints: [{protocol, host, port, []}]}} }} ], - permanent: true + persistent: true ) end end diff --git a/lib/prima_opentelemetry_ex/resource_detector.ex b/lib/prima_opentelemetry_ex/resource_detector.ex index c67e2ac..75bb271 100644 --- a/lib/prima_opentelemetry_ex/resource_detector.ex +++ b/lib/prima_opentelemetry_ex/resource_detector.ex @@ -1,12 +1,19 @@ defmodule PrimaOpentelemetryEx.ResourceDetector do + @moduledoc """ + Module implementing the `:otel_resource_detector`. + It reads `APP_NAME` and `VERSION` env variables to use them as `service.name` + and `service.version` tags. + """ + @behaviour :otel_resource_detector @impl :otel_resource_detector def get_resource(_config) do {:otel_resource, [ - {"service.name", System.get_env("APP_NAME", "prima-opentelemetry-service")}, - {"service.version", System.get_env("VERSION", "0.0.0-dev")} + {'service.name', + "APP_NAME" |> System.get_env("prima-opentelemetry-service") |> to_charlist()}, + {'service.version', "VERSION" |> System.get_env("0.0.0-dev") |> to_charlist()} ]} end end diff --git a/mix.exs b/mix.exs index ad0035b..67169e2 100644 --- a/mix.exs +++ b/mix.exs @@ -1,13 +1,25 @@ defmodule PrimaOpentelemetryEx.MixProject do use Mix.Project + @source_url "https://github.com/primait/prima_opentelemetry_ex" + @version "1.0.0-rc.1" + def project do [ app: :prima_opentelemetry_ex, - version: "0.1.3", + version: @version, elixir: "~> 1.11", start_permanent: Mix.env() == :prod, - deps: deps() + deps: deps(), + dialyzer: [ + plt_add_apps: [:mix, :ex_unit], + plt_add_deps: :transitive, + ignore_warnings: ".dialyzer_ignore.exs", + list_unused_filters: true + ], + docs: docs(), + package: package(), + aliases: aliases() ] end @@ -24,7 +36,8 @@ defmodule PrimaOpentelemetryEx.MixProject do {:telemetry, "~> 0.4 or ~> 1.0"} ] ++ opentelemetry_core_deps() ++ - opentelemetry_instrumentation_deps() + opentelemetry_instrumentation_deps() ++ + dev_deps() end defp opentelemetry_core_deps do @@ -43,4 +56,45 @@ defmodule PrimaOpentelemetryEx.MixProject do {:telepoison, "1.0.0-rc.4"} ] end + + defp dev_deps do + [ + {:credo, "~> 1.5", only: [:dev, :test], runtime: false}, + {:dialyxir, "1.1.0", only: [:dev, :test], runtime: false}, + {:ex_doc, ">= 0.25.3", only: :dev, runtime: false} + ] + end + + defp docs do + [ + extras: [ + "LICENSE.md": [title: "License"], + "README.md": [title: "Overview"] + ], + main: "readme", + source_url: @source_url, + source_ref: "v#{@version}", + formatters: ["html"] + ] + end + + def package do + [ + description: + "PrimaOpentelemetryEx is a utility library for opentelemetry instrumentation in Prima elixir projects.", + name: "prima_opentelemetry_ex", + maintainers: ["Matteo Busi"], + licenses: ["MIT"], + links: %{"GitHub" => @source_url} + ] + end + + defp aliases do + [ + c: "compile", + "format.all": [ + "format mix.exs \"lib/**/*.{ex,exs}\" \"test/**/*.{ex,exs}\" \"config/**/*.{ex,exs}\"" + ] + ] + end end diff --git a/mix.lock b/mix.lock index a7e3e1a..f8dc71d 100644 --- a/mix.lock +++ b/mix.lock @@ -1,8 +1,15 @@ %{ "acceptor_pool": {:hex, :acceptor_pool, "1.0.0", "43c20d2acae35f0c2bcd64f9d2bde267e459f0f3fd23dab26485bf518c281b21", [:rebar3], [], "hexpm", "0cbcd83fdc8b9ad2eee2067ef8b91a14858a5883cb7cd800e6fcd5803e158788"}, + "bunt": {:hex, :bunt, "0.2.0", "951c6e801e8b1d2cbe58ebbd3e616a869061ddadcc4863d0a2182541acae9a38", [:mix], [], "hexpm", "7af5c7e09fe1d40f76c8e4f9dd2be7cebd83909f31fee7cd0e9eadc567da8353"}, "certifi": {:hex, :certifi, "2.8.0", "d4fb0a6bb20b7c9c3643e22507e42f356ac090a1dcea9ab99e27e0376d695eba", [:rebar3], [], "hexpm", "6ac7efc1c6f8600b08d625292d4bbf584e14847ce1b6b5c44d983d273e1097ea"}, "chatterbox": {:hex, :ts_chatterbox, "0.11.0", "b8f372c706023eb0de5bf2976764edb27c70fe67052c88c1f6a66b3a5626847f", [:rebar3], [{:hpack, "~>0.2.3", [hex: :hpack_erl, repo: "hexpm", optional: false]}], "hexpm", "722fe2bad52913ab7e87d849fc6370375f0c961ffb2f0b5e6d647c9170c382a6"}, + "credo": {:hex, :credo, "1.5.6", "e04cc0fdc236fefbb578e0c04bd01a471081616e741d386909e527ac146016c6", [:mix], [{:bunt, "~> 0.2.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2.8", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "4b52a3e558bd64e30de62a648518a5ea2b6e3e5d2b164ef5296244753fc7eb17"}, "ctx": {:hex, :ctx, "0.6.0", "8ff88b70e6400c4df90142e7f130625b82086077a45364a78d208ed3ed53c7fe", [:rebar3], [], "hexpm", "a14ed2d1b67723dbebbe423b28d7615eb0bdcba6ff28f2d1f1b0a7e1d4aa5fc2"}, + "dialyxir": {:hex, :dialyxir, "1.1.0", "c5aab0d6e71e5522e77beff7ba9e08f8e02bad90dfbeffae60eaf0cb47e29488", [:mix], [{:erlex, ">= 0.2.6", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "07ea8e49c45f15264ebe6d5b93799d4dd56a44036cf42d0ad9c960bc266c0b9a"}, + "earmark_parser": {:hex, :earmark_parser, "1.4.16", "607709303e1d4e3e02f1444df0c821529af1c03b8578dfc81bb9cf64553d02b9", [:mix], [], "hexpm", "69fcf696168f5a274dd012e3e305027010658b2d1630cef68421d6baaeaccead"}, + "erlex": {:hex, :erlex, "0.2.6", "c7987d15e899c7a2f34f5420d2a2ea0d659682c06ac607572df55a43753aa12e", [:mix], [], "hexpm", "2ed2e25711feb44d52b17d2780eabf998452f6efda104877a3881c2f8c0c0c75"}, + "ex_doc": {:hex, :ex_doc, "0.25.3", "3edf6a0d70a39d2eafde030b8895501b1c93692effcbd21347296c18e47618ce", [:mix], [{:earmark_parser, "~> 1.4.0", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "9ebebc2169ec732a38e9e779fd0418c9189b3ca93f4a676c961be6c1527913f5"}, + "file_system": {:hex, :file_system, "0.2.10", "fb082005a9cd1711c05b5248710f8826b02d7d1784e7c3451f9c1231d4fc162d", [:mix], [], "hexpm", "41195edbfb562a593726eda3b3e8b103a309b733ad25f3d642ba49696bf715dc"}, "gproc": {:hex, :gproc, "0.8.0", "cea02c578589c61e5341fce149ea36ccef236cc2ecac8691fba408e7ea77ec2f", [:rebar3], [], "hexpm", "580adafa56463b75263ef5a5df4c86af321f68694e7786cb057fd805d1e2a7de"}, "grpcbox": {:hex, :grpcbox, "0.14.0", "3eb321bcd2275baf8b54cf381feb7b0559a50c02544de28fda039c7f2f9d1a7a", [:rebar3], [{:acceptor_pool, "~>1.0.0", [hex: :acceptor_pool, repo: "hexpm", optional: false]}, {:chatterbox, "~>0.11.0", [hex: :ts_chatterbox, repo: "hexpm", optional: false]}, {:ctx, "~>0.6.0", [hex: :ctx, repo: "hexpm", optional: false]}, {:gproc, "~>0.8.0", [hex: :gproc, repo: "hexpm", optional: false]}], "hexpm", "e24159b7b6d3f9869bbe528845c0125fed2259366ba908fd04a1f45fe81d0660"}, "hackney": {:hex, :hackney, "1.18.0", "c4443d960bb9fba6d01161d01cd81173089686717d9490e5d3606644c48d121f", [:rebar3], [{:certifi, "~>2.8.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~>6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~>1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.3.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~>1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "9afcda620704d720db8c6a3123e9848d09c87586dc1c10479c42627b905b5c5e"}, @@ -10,9 +17,13 @@ "httpoison": {:hex, :httpoison, "1.8.0", "6b85dea15820b7804ef607ff78406ab449dd78bed923a49c7160e1886e987a3d", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "28089eaa98cf90c66265b6b5ad87c59a3729bea2e74e9d08f9b51eb9729b3c3a"}, "idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"}, "jason": {:hex, :jason, "1.2.2", "ba43e3f2709fd1aa1dce90aaabfd039d000469c05c56f0b8e31978e03fa39052", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "18a228f5f0058ee183f29f9eae0805c6e59d61c3b006760668d8d18ff0d12179"}, + "makeup": {:hex, :makeup, "1.0.5", "d5a830bc42c9800ce07dd97fa94669dfb93d3bf5fcf6ea7a0c67b2e0e4a7f26c", [:mix], [{:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "cfa158c02d3f5c0c665d0af11512fed3fba0144cf1aadee0f2ce17747fba2ca9"}, + "makeup_elixir": {:hex, :makeup_elixir, "0.15.2", "dc72dfe17eb240552857465cc00cce390960d9a0c055c4ccd38b70629227e97c", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.1", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "fd23ae48d09b32eff49d4ced2b43c9f086d402ee4fd4fcb2d7fad97fa8823e75"}, + "makeup_erlang": {:hex, :makeup_erlang, "0.1.1", "3fcb7f09eb9d98dc4d208f49cc955a34218fc41ff6b84df7c75b3e6e533cc65f", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "174d0809e98a4ef0b3309256cbf97101c6ec01c4ab0b23e926a9e17df2077cbb"}, "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"}, "mime": {:hex, :mime, "2.0.1", "0de4c81303fe07806ebc2494d5321ce8fb4df106e34dd5f9d787b637ebadc256", [:mix], [], "hexpm", "7a86b920d2aedce5fb6280ac8261ac1a739ae6c1a1ad38f5eadf910063008942"}, "mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm", "f278585650aa581986264638ebf698f8bb19df297f66ad91b18910dfc6e19323"}, + "nimble_parsec": {:hex, :nimble_parsec, "1.1.0", "3a6fca1550363552e54c216debb6a9e95bd8d32348938e13de5eda962c0d7f89", [:mix], [], "hexpm", "08eb32d66b706e913ff748f11694b17981c0b04a33ef470e33e11b3d3ac8f54b"}, "opentelemetry": {:hex, :opentelemetry, "1.0.0-rc.2", "d3e1fd9debfd73e00b0241cac464be7cd6ca6ac2bd38ab2ebe0c92401c76a342", [:rebar3], [{:opentelemetry_api, "~> 1.0.0-rc.2", [hex: :opentelemetry_api, repo: "hexpm", optional: false]}], "hexpm", "2f810e2eed70a9ea0c9b6943969b59e37f96a2f9e10920045a6c7676c2ab8181"}, "opentelemetry_absinthe": {:hex, :opentelemetry_absinthe, "1.0.0-rc.5", "47ffdf2f922d24f01ff231f0b6462dfede3cfc32ee3a0499b2924dac7ead9c64", [:mix], [{:absinthe, ">= 1.5.0", [hex: :absinthe, repo: "hexpm", optional: true]}, {:jason, "~> 1.2", [hex: :jason, repo: "hexpm", optional: false]}, {:opentelemetry_api, "~> 1.0.0-rc.2", [hex: :opentelemetry_api, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "cd4904e355dc88e6f21221137e7f49e95e106963165c87c7113de5807484907a"}, "opentelemetry_api": {:hex, :opentelemetry_api, "1.0.0-rc.2", "a0ec5b242bb7ce7563b4891e77dcfa529defc9e42c19a5a702574c5ac3d0c6e7", [:mix, :rebar3], [], "hexpm", "426a969c8ee2afa8ab55b58e6e40e81c1f934c064459a1acb530f54042f9a9a3"}, diff --git a/test/resource_detector_test.exs b/test/resource_detector_test.exs new file mode 100644 index 0000000..37839b5 --- /dev/null +++ b/test/resource_detector_test.exs @@ -0,0 +1,24 @@ +defmodule PrimaOpentelemetryEx.ResourceDetectorTest do + use ExUnit.Case, async: true + + describe "use default service name and version if env vars aren't set" do + assert {:otel_resource, resource} = PrimaOpentelemetryEx.ResourceDetector.get_resource([]) + + assert {'service.name', 'prima-opentelemetry-service'} = + List.keyfind(resource, 'service.name', 0) + + assert {'service.version', '0.0.0-dev'} = List.keyfind(resource, 'service.version', 0) + end + + describe "use APP_NAME env var to set service.name" do + System.put_env("APP_NAME", "test") + assert {:otel_resource, resource} = PrimaOpentelemetryEx.ResourceDetector.get_resource([]) + assert {'service.name', 'test'} = List.keyfind(resource, 'service.name', 0) + end + + describe "use VERSION env var to set service.version" do + System.put_env("VERSION", "1.2.3-test") + assert {:otel_resource, resource} = PrimaOpentelemetryEx.ResourceDetector.get_resource([]) + assert {'service.version', '1.2.3-test'} = List.keyfind(resource, 'service.version', 0) + end +end