prometheus-api-client 0.1.1 → 0.2.10
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 +4 -4
- data/README.md +20 -4
- data/lib/prometheus/api_client.rb +15 -52
- data/lib/prometheus/api_client/cadvisor.rb +92 -0
- data/lib/prometheus/api_client/client.rb +122 -4
- data/lib/prometheus/api_client/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7248e7525d856f9fbf407b8e15b6f761e84115af
|
4
|
+
data.tar.gz: a590b35b49f625b63bc572948f2dbd4292b08a8c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c7df2b7fd83c373290b1fa2bbe8335dda983f376b4371b90f34d78b12ee68e3c66e81314193ec8e5c93d1ed7da0a8f8072906733d54a42906a501164e222e8ab
|
7
|
+
data.tar.gz: 8153bee7639544c55f133216e295d10f23ad82fca6045bf0686fd76268bd3cc59cac62e02fe69e580b39daf03f782214dd8ecc39edafe5c107dd71e9096a8032
|
data/README.md
CHANGED
@@ -36,7 +36,7 @@ prometheus.get(
|
|
36
36
|
|
37
37
|
```ruby
|
38
38
|
# return a client for host http://example.com:9090/api/v1/
|
39
|
-
prometheus = Prometheus::ApiClient.client('http://example.com:9090')
|
39
|
+
prometheus = Prometheus::ApiClient.client(url: 'http://example.com:9090')
|
40
40
|
```
|
41
41
|
|
42
42
|
#### Authentication proxy
|
@@ -45,7 +45,7 @@ If an authentication proxy ( e.g. oauth2 ) is used in a layer above the promethe
|
|
45
45
|
|
46
46
|
```ruby
|
47
47
|
# return a client for host https://example.com/api/v1/ using a Bearer token "TopSecret"
|
48
|
-
prometheus = Prometheus::ApiClient.client('https://example.com:443', credentials: {token: 'TopSecret'})
|
48
|
+
prometheus = Prometheus::ApiClient.client(url: 'https://example.com:443', credentials: {token: 'TopSecret'})
|
49
49
|
```
|
50
50
|
|
51
51
|
#### High level calls
|
@@ -55,8 +55,7 @@ prometheus = Prometheus::ApiClient.client('https://example.com:443', credentials
|
|
55
55
|
# send a query request to server
|
56
56
|
prometheus.query(
|
57
57
|
:query => "sum(container_cpu_usage_seconds_total{container_name=\"prometheus-hgv4s\",job=\"kubernetes-nodes\"})",
|
58
|
-
:
|
59
|
-
:end => "2015-07-02T20:10:30.781Z"
|
58
|
+
:time => "2015-07-01T20:10:30.781Z",
|
60
59
|
)
|
61
60
|
|
62
61
|
# send a query_range request to server
|
@@ -70,6 +69,23 @@ prometheus.query_range(
|
|
70
69
|
# send a label request to server
|
71
70
|
prometheus.label('__name__')
|
72
71
|
```
|
72
|
+
|
73
|
+
#### cAdvisor specialize client
|
74
|
+
|
75
|
+
```ruby
|
76
|
+
|
77
|
+
# create a client for cAdvisor metrics of a Node instance 'example.com'
|
78
|
+
prometheus = Prometheus::ApiClient::Cadvisor::Node.new(
|
79
|
+
instance: 'example.com',
|
80
|
+
url: 'http://example.com:8080',
|
81
|
+
)
|
82
|
+
|
83
|
+
# send a query request to server
|
84
|
+
prometheus.query(
|
85
|
+
:query => "sum(container_cpu_usage_seconds_total)",
|
86
|
+
:time => "2015-07-01T20:10:30.781Z",
|
87
|
+
)
|
88
|
+
|
73
89
|
## Tests
|
74
90
|
|
75
91
|
Install necessary development gems with `bundle install` and run tests with
|
@@ -3,61 +3,24 @@
|
|
3
3
|
require 'uri'
|
4
4
|
require 'openssl'
|
5
5
|
require 'prometheus/api_client/client'
|
6
|
+
require 'prometheus/api_client/cadvisor'
|
6
7
|
|
7
8
|
module Prometheus
|
8
|
-
# Client is a ruby implementation for a Prometheus compatible api_client.
|
9
|
+
# Api Client is a ruby implementation for a Prometheus compatible api_client.
|
9
10
|
module ApiClient
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
#
|
21
|
-
def self.client(
|
22
|
-
|
23
|
-
|
24
|
-
Client.new(
|
25
|
-
prometheus_args(entrypoint, args),
|
26
|
-
)
|
27
|
-
end
|
28
|
-
|
29
|
-
def self.prometheus_proxy(options)
|
30
|
-
options[:http_proxy_uri] if options[:http_proxy_uri]
|
31
|
-
end
|
32
|
-
|
33
|
-
def self.prometheus_verify_ssl(options)
|
34
|
-
return unless options[:verify_ssl]
|
35
|
-
|
36
|
-
{
|
37
|
-
verify: options[:verify_ssl] != OpenSSL::SSL::VERIFY_NONE,
|
38
|
-
cert_store: options[:ssl_cert_store],
|
39
|
-
}
|
40
|
-
end
|
41
|
-
|
42
|
-
def self.prometheus_headers(credentials)
|
43
|
-
return unless credentials[:token]
|
44
|
-
|
45
|
-
{
|
46
|
-
Authorization: 'Bearer ' + credentials[:token].to_s,
|
47
|
-
}
|
48
|
-
end
|
49
|
-
|
50
|
-
def self.prometheus_args(entrypoint, args = {})
|
51
|
-
{
|
52
|
-
url: entrypoint + args[:path],
|
53
|
-
proxy: prometheus_proxy(args[:options]),
|
54
|
-
ssl: prometheus_verify_ssl(args[:options]),
|
55
|
-
headers: prometheus_headers(args[:credentials]),
|
56
|
-
request: {
|
57
|
-
open_timeout: args[:options][:open_timeout],
|
58
|
-
timeout: args[:options][:timeout],
|
59
|
-
},
|
60
|
-
}
|
11
|
+
# Create a Prometheus API client:
|
12
|
+
#
|
13
|
+
# @param [Hash] options
|
14
|
+
# @option options [Hash] :url String base URL.
|
15
|
+
# @option options [Hash] :params URI query unencoded key/value pairs.
|
16
|
+
# @option options [Hash] :headers Unencoded HTTP header key/value pairs.
|
17
|
+
# @option options [Hash] :request Request options.
|
18
|
+
# @option options [Hash] :ssl SSL options.
|
19
|
+
# @option options [Hash] :proxy Proxy options.
|
20
|
+
#
|
21
|
+
# A default client is created if options is omitted.
|
22
|
+
def self.client(options = {})
|
23
|
+
Client.new(options)
|
61
24
|
end
|
62
25
|
end
|
63
26
|
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require 'prometheus/api_client/client'
|
4
|
+
|
5
|
+
module Prometheus
|
6
|
+
# Client is a ruby implementation for a Prometheus compatible api_client.
|
7
|
+
module ApiClient
|
8
|
+
# Client contains the implementation for a Prometheus compatible api_client,
|
9
|
+
# With special labels for the cadvisor job.
|
10
|
+
module Cadvisor
|
11
|
+
# Create a Prometheus API client:
|
12
|
+
#
|
13
|
+
# @param [Hash] options
|
14
|
+
# @option options [Hash] :url String base URL.
|
15
|
+
# @option options [Hash] :params URI query unencoded key/value pairs.
|
16
|
+
# @option options [Hash] :headers Unencoded HTTP header key/value pairs.
|
17
|
+
# @option options [Hash] :request Request options.
|
18
|
+
# @option options [Hash] :ssl SSL options.
|
19
|
+
# @option options [Hash] :proxy Proxy options.
|
20
|
+
#
|
21
|
+
# A default client is created if options is omitted.
|
22
|
+
class Node < Client
|
23
|
+
def initialize(instance:, **options)
|
24
|
+
region = options[:region] || 'infra'
|
25
|
+
zone = options[:zone] || 'default'
|
26
|
+
|
27
|
+
@labels = "job=\"kubernetes-cadvisor\",region=\"#{region}\"," \
|
28
|
+
"zone=\"#{zone}\",instance=\"#{instance}\""
|
29
|
+
super(options)
|
30
|
+
end
|
31
|
+
|
32
|
+
def query(options)
|
33
|
+
options[:query] = update_query(options[:query], @labels)
|
34
|
+
super(options)
|
35
|
+
end
|
36
|
+
|
37
|
+
def query_range(options)
|
38
|
+
options[:query] = update_query(options[:query], @labels)
|
39
|
+
super(options)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# A client with special labels for pod cadvisor metrics
|
44
|
+
class Pod < Client
|
45
|
+
def initialize(pod_name:, **options)
|
46
|
+
namespace = options[:namespace] || 'default'
|
47
|
+
region = options[:region] || 'infra'
|
48
|
+
zone = options[:zone] || 'default'
|
49
|
+
|
50
|
+
@labels = "job=\"kubernetes-cadvisor\",region=\"#{region}\"," \
|
51
|
+
"zone=\"#{zone}\",namespace=\"#{namespace}\"," \
|
52
|
+
"pod_name=\"#{pod_name}\",container_name=\"POD\""
|
53
|
+
super(options)
|
54
|
+
end
|
55
|
+
|
56
|
+
def query(options)
|
57
|
+
options[:query] = update_query(options[:query], @labels)
|
58
|
+
super(options)
|
59
|
+
end
|
60
|
+
|
61
|
+
def query_range(options)
|
62
|
+
options[:query] = update_query(options[:query], @labels)
|
63
|
+
super(options)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
# A client with special labels for container cadvisor metrics
|
68
|
+
class Container < Client
|
69
|
+
def initialize(container_name:, pod_name:, **options)
|
70
|
+
namespace = args[:namespace] || 'default'
|
71
|
+
region = options[:region] || 'infra'
|
72
|
+
zone = options[:zone] || 'default'
|
73
|
+
|
74
|
+
@labels = "job=\"kubernetes-cadvisor\",region=\"#{region}\"," \
|
75
|
+
"zone=\"#{zone}\",namespace=\"#{namespace}\"," \
|
76
|
+
"pod_name=\"#{pod_name}\",container_name=\"#{container_name}\""
|
77
|
+
super(options)
|
78
|
+
end
|
79
|
+
|
80
|
+
def query(options)
|
81
|
+
options[:query] = update_query(options[:query], @labels)
|
82
|
+
super(options)
|
83
|
+
end
|
84
|
+
|
85
|
+
def query_range(options)
|
86
|
+
options[:query] = update_query(options[:query], @labels)
|
87
|
+
super(options)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -10,26 +10,93 @@ module Prometheus
|
|
10
10
|
class Client
|
11
11
|
class RequestError < StandardError; end
|
12
12
|
|
13
|
-
|
14
|
-
|
13
|
+
# Default paramters for creating default client
|
14
|
+
DEFAULT_ARGS = {
|
15
|
+
url: 'http://localhost:9090',
|
16
|
+
path: '/api/v1/',
|
17
|
+
credentials: {},
|
18
|
+
options: {
|
19
|
+
open_timeout: 2,
|
20
|
+
timeout: 5,
|
21
|
+
},
|
22
|
+
}.freeze
|
23
|
+
|
24
|
+
# Create a Prometheus API client:
|
25
|
+
#
|
26
|
+
# @param [Hash] options
|
27
|
+
# @option options [Hash] :url String base URL.
|
28
|
+
# @option options [Hash] :params URI query unencoded key/value pairs.
|
29
|
+
# @option options [Hash] :headers Unencoded HTTP header key/value pairs.
|
30
|
+
# @option options [Hash] :request Request options.
|
31
|
+
# @option options [Hash] :ssl SSL options.
|
32
|
+
# @option options [Hash] :proxy Proxy options.
|
33
|
+
#
|
34
|
+
# A default client is created if options is omitted.
|
35
|
+
def initialize(options)
|
36
|
+
options = DEFAULT_ARGS.merge(options)
|
37
|
+
|
38
|
+
@client = Faraday.new(
|
39
|
+
faraday_options(options),
|
40
|
+
)
|
15
41
|
end
|
16
42
|
|
43
|
+
# Evaluates an instant query at a single point in time:
|
44
|
+
#
|
45
|
+
# @param [Hash] options
|
46
|
+
# @option options [String] :query Prometheus expression query string.
|
47
|
+
# @option options [String] :time <rfc3339 | unix_timestamp> Evaluation
|
48
|
+
# timestamp. Optional.
|
49
|
+
# @option options [String] :timeout Evaluation timeout. Optional.
|
50
|
+
# Defaults to and is capped by the value of the -query.timeout flag.
|
51
|
+
#
|
52
|
+
# The current server time is used if the time parameter is omitted.
|
17
53
|
def query(options)
|
18
54
|
run_command('query', options)
|
19
55
|
end
|
20
56
|
|
57
|
+
# Evaluates an expression query over a range of time:
|
58
|
+
#
|
59
|
+
# @param [Hash] options
|
60
|
+
# @option options [String] :query Prometheus expression query string.
|
61
|
+
# @option options [String] :start <rfc3339 | unix_timestamp> Start
|
62
|
+
# timestamp.
|
63
|
+
# @option options [String] :end <rfc3339 | unix_timestamp> End timestamp.
|
64
|
+
# @option options [String] :step <duration> Query resolution step width.
|
65
|
+
# @option options [String] :timeout Evaluation timeout. Optional.
|
66
|
+
# Defaults to and is capped by the value of the -query.timeout flag.
|
67
|
+
#
|
68
|
+
# The current server time is used if the time parameter is omitted.
|
21
69
|
def query_range(options)
|
22
70
|
run_command('query_range', options)
|
23
71
|
end
|
24
72
|
|
25
|
-
|
26
|
-
|
73
|
+
# Returns an overview of the current state of the Prometheus target
|
74
|
+
# discovery:
|
75
|
+
#
|
76
|
+
# @param [Hash] options
|
77
|
+
#
|
78
|
+
# No options used.
|
79
|
+
def targets(options = {})
|
80
|
+
run_command('targets', options)
|
81
|
+
end
|
82
|
+
|
83
|
+
# Returns a list of label values for a provided label name:
|
84
|
+
#
|
85
|
+
# @param [String] label Label name
|
86
|
+
# @param [Hash] options
|
87
|
+
#
|
88
|
+
# No options used.
|
89
|
+
def label(label, options = {})
|
90
|
+
run_command("label/#{label}/values", options)
|
27
91
|
end
|
28
92
|
|
93
|
+
# Issues a get request to the low level client.
|
29
94
|
def get(command, options)
|
30
95
|
@client.get(command, options)
|
31
96
|
end
|
32
97
|
|
98
|
+
# Issues a get request to the low level client, and evalueate the
|
99
|
+
# response JSON.
|
33
100
|
def run_command(command, options)
|
34
101
|
response = get(command, options)
|
35
102
|
|
@@ -37,6 +104,57 @@ module Prometheus
|
|
37
104
|
rescue
|
38
105
|
raise RequestError, 'Bad response from server'
|
39
106
|
end
|
107
|
+
|
108
|
+
# Add labels to simple query variables.
|
109
|
+
#
|
110
|
+
# Example:
|
111
|
+
# "cpu_usage" => "cpu_usage{labels...}"
|
112
|
+
# "sum(cpu_usage)" => "sum(cpu_usage{labels...})"
|
113
|
+
# "rate(cpu_usage[5m])" => "rate(cpu_usage{labels...}[5m])"
|
114
|
+
#
|
115
|
+
# Note:
|
116
|
+
# Not supporting more complex queries.
|
117
|
+
def update_query(query, labels)
|
118
|
+
query.sub(/(?<r>\[.+\])?(?<f>[)])?$/, "{#{labels}}\\k<r>\\k<f>")
|
119
|
+
end
|
120
|
+
|
121
|
+
# Helper function to evalueate the low level proxy option
|
122
|
+
def faraday_proxy(options)
|
123
|
+
options[:http_proxy_uri] if options[:http_proxy_uri]
|
124
|
+
end
|
125
|
+
|
126
|
+
# Helper function to evalueate the low level ssl option
|
127
|
+
def faraday_verify_ssl(options)
|
128
|
+
return unless options[:verify_ssl]
|
129
|
+
|
130
|
+
{
|
131
|
+
verify: options[:verify_ssl] != OpenSSL::SSL::VERIFY_NONE,
|
132
|
+
cert_store: options[:ssl_cert_store],
|
133
|
+
}
|
134
|
+
end
|
135
|
+
|
136
|
+
# Helper function to evalueate the low level headers option
|
137
|
+
def faraday_headers(credentials)
|
138
|
+
return unless credentials[:token]
|
139
|
+
|
140
|
+
{
|
141
|
+
Authorization: 'Bearer ' + credentials[:token].to_s,
|
142
|
+
}
|
143
|
+
end
|
144
|
+
|
145
|
+
# Helper function to create the args for the low level client
|
146
|
+
def faraday_options(options)
|
147
|
+
{
|
148
|
+
url: options[:url] + options[:path],
|
149
|
+
proxy: faraday_proxy(options[:options]),
|
150
|
+
ssl: faraday_verify_ssl(options[:options]),
|
151
|
+
headers: faraday_headers(options[:credentials]),
|
152
|
+
request: {
|
153
|
+
open_timeout: options[:options][:open_timeout],
|
154
|
+
timeout: options[:options][:timeout],
|
155
|
+
},
|
156
|
+
}
|
157
|
+
end
|
40
158
|
end
|
41
159
|
end
|
42
160
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: prometheus-api-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yaacov Zamir
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-08-
|
11
|
+
date: 2017-08-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: quantile
|
@@ -48,6 +48,7 @@ files:
|
|
48
48
|
- README.md
|
49
49
|
- lib/prometheus.rb
|
50
50
|
- lib/prometheus/api_client.rb
|
51
|
+
- lib/prometheus/api_client/cadvisor.rb
|
51
52
|
- lib/prometheus/api_client/client.rb
|
52
53
|
- lib/prometheus/api_client/version.rb
|
53
54
|
homepage: https://github.com/yaacov/prometheus_api_client_ruby
|