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 +7 -0
- data/README.md +26 -0
- data/exe/vitalrix +16 -0
- data/lib/vitalrix/version.rb +5 -0
- data/lib/vitalrix.rb +96 -0
- metadata +132 -0
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
|
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: []
|