vitalrix 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 93255b47a14ac846e6b1c893f1efa58ff45c77ece320b05fb60d2a7cfec60f25
4
+ data.tar.gz: 3fa5684934d90c7928411dfb40c5154df36b6728dc1cdd3de973f335761fbf9d
5
+ SHA512:
6
+ metadata.gz: 602fa953ff5b9896d1d4dc79e1d3fad3e610a1afd7707453a1825c33a2e073c0efb0a6fd59ed937547e9062944969840f4fc17ff17301cd4aa7eda74302e871b
7
+ data.tar.gz: 0b6f97518b156d6d1d7479f42cc5f207a7a1157b439ce2b08669e306c88eb551085b6430d0736cd1ea5029ba23910d358b2082bf18fd230631d6dc8f45601925
data/README.md ADDED
@@ -0,0 +1,26 @@
1
+ # vitalrix (Ruby)
2
+
3
+ Send traces, metrics and logs from Ruby to [VitalRix](https://vitalrix.com) with the official OpenTelemetry SDK (OTLP/HTTP).
4
+
5
+ ```ruby
6
+ # Gemfile
7
+ gem "vitalrix"
8
+ gem "opentelemetry-instrumentation-all" # optional: Rails, Rack, Sinatra, Net::HTTP, pg, Redis, Sidekiq, Logger, ...
9
+ ```
10
+
11
+ ```bash
12
+ VITALRIX_URL=https://api.vitalrix.com
13
+ VITALRIX_API_KEY=pk_... # log.write, metric.write, trace.write (the Connect tab in VitalRix creates it)
14
+ OTEL_SERVICE_NAME=shop-api # the application's name in VitalRix
15
+ DEPLOYMENT_ENVIRONMENT=production
16
+ SERVICE_VERSION=1.4.2 # optional: marks deployments
17
+ ```
18
+
19
+ ```ruby
20
+ require "vitalrix"
21
+ Vitalrix.init # Rails: in config/initializers/vitalrix.rb
22
+ Vitalrix.log(:info, "order placed", order_id: id)
23
+ ```
24
+
25
+ `init` sets the standard OpenTelemetry variables (values you set yourself win) and turns on every installed
26
+ instrumentation. Check the key: `bundle exec vitalrix check`. Ruby 3.1+.
data/exe/vitalrix ADDED
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # `vitalrix check`: sends one test log so you know the key and URL work.
5
+ require "vitalrix"
6
+
7
+ unless ARGV.first == "check"
8
+ warn "usage: vitalrix check"
9
+ exit 2
10
+ end
11
+ begin
12
+ puts Vitalrix.check
13
+ rescue StandardError => e
14
+ warn "vitalrix: #{e.message}"
15
+ exit 1
16
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Vitalrix
4
+ VERSION = "0.1.0"
5
+ end
data/lib/vitalrix.rb ADDED
@@ -0,0 +1,96 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+ require "socket"
5
+ require "net/http"
6
+ require "uri"
7
+ require_relative "vitalrix/version"
8
+
9
+ # VitalRix for Ruby: the official OpenTelemetry SDK wired to VitalRix (traces, metrics and logs over OTLP/HTTP).
10
+ #
11
+ # require "vitalrix"
12
+ # Vitalrix.init # reads VITALRIX_URL, VITALRIX_API_KEY, OTEL_SERVICE_NAME, ...
13
+ module Vitalrix
14
+ Config = Struct.new(:url, :api_key, :service, :environment, :version, :sample_rate) do
15
+ def endpoint(path) = "#{url}/api/v1/#{path}"
16
+ end
17
+
18
+ # Settings from VITALRIX_URL, VITALRIX_API_KEY, OTEL_SERVICE_NAME, DEPLOYMENT_ENVIRONMENT, SERVICE_VERSION, TRACE_SAMPLE_RATE.
19
+ def self.config(env = ENV)
20
+ pick = ->(k, d) { (v = env[k]).nil? || v.empty? ? d : v }
21
+ rate = Float(pick.("TRACE_SAMPLE_RATE", "1"), exception: false) || 1.0
22
+ Config.new(pick.("VITALRIX_URL", "https://api.vitalrix.com").sub(%r{/+\z}, ""), pick.("VITALRIX_API_KEY", ""),
23
+ pick.("OTEL_SERVICE_NAME", "unknown"), pick.("DEPLOYMENT_ENVIRONMENT", "production"),
24
+ pick.("SERVICE_VERSION", "0.0.0"), rate.clamp(0.0, 1.0))
25
+ end
26
+
27
+ # The standard OpenTelemetry variables that point the SDK at VitalRix. Values the application already set win.
28
+ def self.otel_environment(c = config)
29
+ {
30
+ "OTEL_SERVICE_NAME" => c.service,
31
+ # host.name: VitalRix counts APM hosts by it, the same way for every SDK.
32
+ "OTEL_RESOURCE_ATTRIBUTES" => "deployment.environment.name=#{c.environment},service.version=#{c.version},host.name=#{Socket.gethostname}",
33
+ "OTEL_EXPORTER_OTLP_PROTOCOL" => "http/protobuf",
34
+ "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT" => c.endpoint("traces/otlp/v1/traces"),
35
+ "OTEL_EXPORTER_OTLP_METRICS_ENDPOINT" => c.endpoint("metrics/otlp/v1/metrics"),
36
+ "OTEL_EXPORTER_OTLP_LOGS_ENDPOINT" => c.endpoint("logs/otlp/v1/logs"),
37
+ "OTEL_EXPORTER_OTLP_HEADERS" => "x-api-key=#{c.api_key}",
38
+ "OTEL_TRACES_EXPORTER" => "otlp",
39
+ "OTEL_METRICS_EXPORTER" => "otlp",
40
+ "OTEL_LOGS_EXPORTER" => "otlp",
41
+ # Parent-based: a request arriving with a sampled traceparent (browser, another service) stays sampled.
42
+ "OTEL_TRACES_SAMPLER" => "parentbased_traceidratio",
43
+ "OTEL_TRACES_SAMPLER_ARG" => c.sample_rate.to_s,
44
+ }
45
+ end
46
+
47
+ # Starts sending. Returns false (and sends nothing) without VITALRIX_API_KEY. Turns on every installed
48
+ # opentelemetry-instrumentation-* gem (Rails, Rack, Sinatra, Net::HTTP, pg, Redis, Sidekiq, Logger, ...).
49
+ def self.init(instrument: true)
50
+ return true if @started
51
+ c = config
52
+ if c.api_key.empty?
53
+ warn "[vitalrix] VITALRIX_API_KEY is not set: nothing is sent"
54
+ return false
55
+ end
56
+ otel_environment(c).each { |k, v| ENV[k] = v if ENV[k].nil? || ENV[k].empty? }
57
+ require "opentelemetry/sdk"
58
+ require "opentelemetry/exporter/otlp"
59
+ require "opentelemetry-metrics-sdk"
60
+ require "opentelemetry/exporter/otlp_metrics"
61
+ require "opentelemetry-logs-sdk"
62
+ require "opentelemetry/exporter/otlp_logs"
63
+ OpenTelemetry::SDK.configure { |cfg| cfg.use_all if instrument }
64
+ @started = true
65
+ at_exit { shutdown }
66
+ true
67
+ end
68
+
69
+ # A log line with the current trace id. No-op before init.
70
+ def self.log(severity, message, attributes = {})
71
+ return unless @started
72
+ logger = OpenTelemetry.logger_provider.logger(name: "vitalrix", version: VERSION)
73
+ logger.on_emit(severity_text: severity.to_s.upcase, severity_number: SEVERITY.fetch(severity.to_sym, 9), body: message.to_s,
74
+ attributes: attributes.transform_keys(&:to_s), context: OpenTelemetry::Context.current)
75
+ end
76
+ SEVERITY = { debug: 5, info: 9, warn: 13, error: 17, fatal: 21 }.freeze
77
+
78
+ # Flushes and stops (also runs at exit).
79
+ def self.shutdown
80
+ return unless @started
81
+ OpenTelemetry.tracer_provider.shutdown if OpenTelemetry.tracer_provider.respond_to?(:shutdown)
82
+ OpenTelemetry.meter_provider.shutdown if OpenTelemetry.meter_provider.respond_to?(:shutdown)
83
+ OpenTelemetry.logger_provider.shutdown if OpenTelemetry.logger_provider.respond_to?(:shutdown)
84
+ @started = false
85
+ end
86
+
87
+ # Sends one test log line; raises with the server's answer when the key or URL does not work.
88
+ def self.check(c = config)
89
+ raise "VITALRIX_API_KEY is not set" if c.api_key.empty?
90
+ uri = URI(c.endpoint("logs"))
91
+ body = { logs: [{ level: "info", message: "vitalrix check: connection works", service: c.service, environment: c.environment }] }.to_json
92
+ res = Net::HTTP.post(uri, body, "content-type" => "application/json", "x-api-key" => c.api_key)
93
+ raise "#{res.code} #{res.body}" unless res.is_a?(Net::HTTPSuccess)
94
+ %(ok: a test log from "#{c.service}" (#{c.environment}) reached #{c.url})
95
+ end
96
+ end
metadata ADDED
@@ -0,0 +1,132 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: vitalrix
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - VitalRix
8
+ bindir: exe
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: opentelemetry-sdk
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '1.5'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '1.5'
26
+ - !ruby/object:Gem::Dependency
27
+ name: opentelemetry-exporter-otlp
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '0.29'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '0.29'
40
+ - !ruby/object:Gem::Dependency
41
+ name: opentelemetry-logs-sdk
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0.1'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0.1'
54
+ - !ruby/object:Gem::Dependency
55
+ name: opentelemetry-exporter-otlp-logs
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0.1'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0.1'
68
+ - !ruby/object:Gem::Dependency
69
+ name: opentelemetry-metrics-sdk
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0.2'
75
+ type: :runtime
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0.2'
82
+ - !ruby/object:Gem::Dependency
83
+ name: opentelemetry-exporter-otlp-metrics
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0.2'
89
+ type: :runtime
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0.2'
96
+ description: Configures the official OpenTelemetry Ruby SDK to export traces, metrics
97
+ and logs to VitalRix over OTLP/HTTP, turns on installed instrumentations, and adds
98
+ a `vitalrix check` command.
99
+ executables:
100
+ - vitalrix
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - README.md
105
+ - exe/vitalrix
106
+ - lib/vitalrix.rb
107
+ - lib/vitalrix/version.rb
108
+ homepage: https://vitalrix.com
109
+ licenses:
110
+ - MIT
111
+ metadata:
112
+ source_code_uri: https://github.com/avinashManiTripathi/vitalrix-sdks
113
+ documentation_uri: https://docs.vitalrix.com/apm/setup
114
+ rdoc_options: []
115
+ require_paths:
116
+ - lib
117
+ required_ruby_version: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - ">="
120
+ - !ruby/object:Gem::Version
121
+ version: '3.1'
122
+ required_rubygems_version: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - ">="
125
+ - !ruby/object:Gem::Version
126
+ version: '0'
127
+ requirements: []
128
+ rubygems_version: 4.0.23
129
+ specification_version: 4
130
+ summary: Send traces, metrics and logs from Ruby to VitalRix in one call (OpenTelemetry
131
+ under the hood).
132
+ test_files: []