grafana 0.8.2
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/LICENSE +21 -0
- data/README.md +36 -0
- data/doc/Array.html +200 -0
- data/doc/Boolean.html +122 -0
- data/doc/FalseClass.html +132 -0
- data/doc/Grafana.html +172 -0
- data/doc/Hash.html +212 -0
- data/doc/Logging.html +326 -0
- data/doc/Object.html +286 -0
- data/doc/Time.html +200 -0
- data/doc/TrueClass.html +132 -0
- data/doc/_index.html +380 -0
- data/doc/class_list.html +51 -0
- data/doc/file.README.html +117 -0
- data/doc/file_list.html +56 -0
- data/doc/frames.html +17 -0
- data/doc/index.html +117 -0
- data/doc/method_list.html +771 -0
- data/doc/top-level-namespace.html +112 -0
- data/lib/grafana.rb +7 -0
- data/lib/grafana/admin.rb +310 -0
- data/lib/grafana/alerts.rb +38 -0
- data/lib/grafana/annotations.rb +40 -0
- data/lib/grafana/client.rb +126 -0
- data/lib/grafana/dashboard.rb +149 -0
- data/lib/grafana/dashboard_versions.rb +30 -0
- data/lib/grafana/datasource.rb +271 -0
- data/lib/grafana/login.rb +139 -0
- data/lib/grafana/network.rb +169 -0
- data/lib/grafana/organization.rb +101 -0
- data/lib/grafana/organizations.rb +406 -0
- data/lib/grafana/snapshot.rb +47 -0
- data/lib/grafana/tags.rb +41 -0
- data/lib/grafana/tools.rb +66 -0
- data/lib/grafana/user.rb +116 -0
- data/lib/grafana/users.rb +122 -0
- data/lib/grafana/validator.rb +28 -0
- data/lib/grafana/version.rb +17 -0
- data/lib/logging.rb +35 -0
- data/lib/monkey_patches.rb +92 -0
- metadata +294 -0
@@ -0,0 +1,40 @@
|
|
1
|
+
|
2
|
+
module Grafana
|
3
|
+
|
4
|
+
# http://docs.grafana.org/http_api/annotations/
|
5
|
+
#
|
6
|
+
module Annotations
|
7
|
+
|
8
|
+
# Find Annotations
|
9
|
+
# http://docs.grafana.org/http_api/annotations/#find-annotations
|
10
|
+
# GET /api/annotations?from=1506676478816&to=1507281278816&tags=tag1&tags=tag2&limit=100
|
11
|
+
def find_annotation( params ); end
|
12
|
+
|
13
|
+
# Create Annotation
|
14
|
+
# http://docs.grafana.org/http_api/annotations/#create-annotation
|
15
|
+
# POST /api/annotations
|
16
|
+
def create_annotation( params ); end
|
17
|
+
|
18
|
+
# Create Annotation in Graphite format
|
19
|
+
# http://docs.grafana.org/http_api/annotations/#create-annotation-in-graphite-format
|
20
|
+
# POST /api/annotations/graphite
|
21
|
+
def create_annotation_graphite( params ); end
|
22
|
+
|
23
|
+
# Update Annotation
|
24
|
+
# http://docs.grafana.org/http_api/annotations/#update-annotation
|
25
|
+
# PUT /api/annotations/:id
|
26
|
+
def update_annotation( params ); end
|
27
|
+
|
28
|
+
# Delete Annotation By Id
|
29
|
+
# http://docs.grafana.org/http_api/annotations/#delete-annotation-by-id
|
30
|
+
# DELETE /api/annotation/:id
|
31
|
+
def delete_annotation( params ); end
|
32
|
+
|
33
|
+
# Delete Annotation By RegionId
|
34
|
+
# http://docs.grafana.org/http_api/annotations/#delete-annotation-by-regionid
|
35
|
+
# DELETE /api/annotation/region/:id
|
36
|
+
def delete_annotation_by_region( params ); end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
@@ -0,0 +1,126 @@
|
|
1
|
+
|
2
|
+
require 'ruby_dig' if RUBY_VERSION < '2.3'
|
3
|
+
|
4
|
+
require 'rest-client'
|
5
|
+
require 'json'
|
6
|
+
require 'timeout'
|
7
|
+
|
8
|
+
require_relative 'version'
|
9
|
+
require_relative 'validator'
|
10
|
+
require_relative 'login'
|
11
|
+
require_relative 'network'
|
12
|
+
require_relative 'tools'
|
13
|
+
require_relative 'admin'
|
14
|
+
require_relative 'annotations'
|
15
|
+
require_relative 'user'
|
16
|
+
require_relative 'users'
|
17
|
+
require_relative 'datasource'
|
18
|
+
require_relative 'organization'
|
19
|
+
require_relative 'organizations'
|
20
|
+
require_relative 'dashboard'
|
21
|
+
require_relative 'dashboard_versions'
|
22
|
+
require_relative 'snapshot'
|
23
|
+
|
24
|
+
# -------------------------------------------------------------------------------------------------------------------
|
25
|
+
#
|
26
|
+
# @abstract # Namespace for classes and modules that handle all Grafana API calls
|
27
|
+
#
|
28
|
+
# @author Bodo Schulz <bodo@boone-schulz.de>
|
29
|
+
#
|
30
|
+
#
|
31
|
+
module Grafana
|
32
|
+
|
33
|
+
# Abstract base class for the API calls.
|
34
|
+
# Provides some helper methods
|
35
|
+
#
|
36
|
+
# @author Bodo Schulz
|
37
|
+
#
|
38
|
+
class Client
|
39
|
+
|
40
|
+
include Logging
|
41
|
+
|
42
|
+
include Grafana::Version
|
43
|
+
include Grafana::Validator
|
44
|
+
include Grafana::Login
|
45
|
+
include Grafana::Network
|
46
|
+
include Grafana::Tools
|
47
|
+
include Grafana::Admin
|
48
|
+
include Grafana::Annotations
|
49
|
+
include Grafana::User
|
50
|
+
include Grafana::Users
|
51
|
+
include Grafana::Datasource
|
52
|
+
include Grafana::Organization
|
53
|
+
include Grafana::Organizations
|
54
|
+
include Grafana::Dashboard
|
55
|
+
include Grafana::DashboardVersions
|
56
|
+
include Grafana::Snapshot
|
57
|
+
|
58
|
+
attr_accessor :debug
|
59
|
+
|
60
|
+
# Create a new instance of Class
|
61
|
+
#
|
62
|
+
# @param [Hash, #read] settings the settings for Grafana
|
63
|
+
# @option settings [String] :host ('localhost') the Grafana Hostname
|
64
|
+
# @option settings [Integer] :port (3000) the Grafana HTTP Port
|
65
|
+
# @option settings [String] :url_path ('')
|
66
|
+
# @option settings [Bool] :ssl (false)
|
67
|
+
# @option settings [Integer] :timeout (5)
|
68
|
+
# @option settings [Integer] :open_timeout (5)
|
69
|
+
# @option settings [Hash] :http_headers ({})
|
70
|
+
# @option settings [Bool] :debug (false)
|
71
|
+
#
|
72
|
+
# @example to create an new Instance
|
73
|
+
# config = {
|
74
|
+
# grafana: {
|
75
|
+
# host: '192.168.33.5',
|
76
|
+
# port: 3000,
|
77
|
+
# url_path: '/grafana',
|
78
|
+
# ssl: false,
|
79
|
+
# timeout: 10,
|
80
|
+
# open_timeout: 10,
|
81
|
+
# debug: true
|
82
|
+
# }
|
83
|
+
#
|
84
|
+
# @grafana = Grafana::Client.new(config)
|
85
|
+
#
|
86
|
+
#
|
87
|
+
def initialize( settings )
|
88
|
+
|
89
|
+
raise ArgumentError.new('only Hash are allowed') unless( settings.is_a?(Hash) )
|
90
|
+
raise ArgumentError.new('missing settings') if( settings.size.zero? )
|
91
|
+
|
92
|
+
host = settings.dig(:grafana, :host) || 'localhost'
|
93
|
+
port = settings.dig(:grafana, :port) || 3000
|
94
|
+
url_path = settings.dig(:grafana, :url_path) || ''
|
95
|
+
ssl = settings.dig(:grafana, :ssl) || false
|
96
|
+
@timeout = settings.dig(:grafana, :timeout) || 5
|
97
|
+
@open_timeout = settings.dig(:grafana, :open_timeout) || 5
|
98
|
+
@http_headers = settings.dig(:grafana, :http_headers) || {}
|
99
|
+
@debug = settings.dig(:debug) || false
|
100
|
+
|
101
|
+
raise ArgumentError.new('missing \'host\'') if( host.nil? )
|
102
|
+
|
103
|
+
raise ArgumentError.new(format('wrong type. \'port\' must be an Integer, given \'%s\'', port.class.to_s)) unless( port.is_a?(Integer) )
|
104
|
+
raise ArgumentError.new(format('wrong type. \'url_path\' must be an String, given \'%s\'', url_path.class.to_s)) unless( url_path.is_a?(String) )
|
105
|
+
raise ArgumentError.new(format('wrong type. \'ssl\' must be an Boolean, given \'%s\'', ssl.class.to_s)) unless( ssl.is_a?(Boolean) )
|
106
|
+
raise ArgumentError.new(format('wrong type. \'timeout\' must be an Integer, given \'%s\'', @timeout.class.to_s)) unless( @timeout.is_a?(Integer) )
|
107
|
+
raise ArgumentError.new(format('wrong type. \'open_timeout\' must be an Integer, given \'%s\'', @open_timeout.class.to_s)) unless( @open_timeout.is_a?(Integer) )
|
108
|
+
|
109
|
+
protocoll = ssl == true ? 'https' : 'http'
|
110
|
+
raise ArgumentError.new(format('wrong \'protocoll\'. only \'http\' or \'https\' allowed, given \'%s\'', protocoll)) if( %w[http https].include?(protocoll.downcase) == false )
|
111
|
+
|
112
|
+
@url = format( '%s://%s:%d%s', protocoll, host, port, url_path )
|
113
|
+
end
|
114
|
+
|
115
|
+
def self.logger
|
116
|
+
@@logger ||= defined?(Logging) ? Logging.logger : Logger.new(STDOUT)
|
117
|
+
end
|
118
|
+
|
119
|
+
def self.logger=(logger)
|
120
|
+
@@logger = logger
|
121
|
+
end
|
122
|
+
|
123
|
+
end
|
124
|
+
|
125
|
+
end
|
126
|
+
|
@@ -0,0 +1,149 @@
|
|
1
|
+
|
2
|
+
module Grafana
|
3
|
+
|
4
|
+
# http://docs.grafana.org/http_api/dashboard/
|
5
|
+
#
|
6
|
+
module Dashboard
|
7
|
+
|
8
|
+
|
9
|
+
# Get dashboard
|
10
|
+
# GET /api/dashboards/db/:slug
|
11
|
+
def dashboard( name )
|
12
|
+
|
13
|
+
raise ArgumentError.new(format('wrong type. \'name\' must be an String, given \'%s\'', name.class.to_s)) unless( name.is_a?(String) )
|
14
|
+
raise ArgumentError.new('missing name') if( name.size.zero? )
|
15
|
+
|
16
|
+
# raise ArgumentError.new('name must be an String') unless( name.is_a?(String) )
|
17
|
+
|
18
|
+
endpoint = format( '/api/dashboards/db/%s', slug(name) )
|
19
|
+
|
20
|
+
@logger.debug( "Attempting to get dashboard (GET /api/dashboards/db/#{name})" ) if @debug
|
21
|
+
|
22
|
+
get( endpoint )
|
23
|
+
end
|
24
|
+
|
25
|
+
# Create / Update dashboard
|
26
|
+
# POST /api/dashboards/db
|
27
|
+
def create_dashboard( params )
|
28
|
+
|
29
|
+
raise ArgumentError.new(format('wrong type. params must be an Hash, given %s', params.class.to_s ) ) unless( params.is_a?(Hash) )
|
30
|
+
|
31
|
+
title = params.dig(:title)
|
32
|
+
dashboard = params.dig(:dashboard)
|
33
|
+
|
34
|
+
# raise ArgumentError.new('missing title') if( title.nil? )
|
35
|
+
raise ArgumentError.new('missing dashboard') if( dashboard.nil? )
|
36
|
+
raise ArgumentError.new(format('wrong type. dashboard must be an Hash, given %s', dashboard.class.to_s ) ) unless( dashboard.is_a?(Hash) )
|
37
|
+
|
38
|
+
endpoint = '/api/dashboards/db'
|
39
|
+
# title = slug(title)
|
40
|
+
|
41
|
+
# dashboard = JSON.parse( dashboard ) if( dashboard.is_a?(String) )
|
42
|
+
dashboard = regenerate_template_ids( dashboard )
|
43
|
+
|
44
|
+
if( title.nil? )
|
45
|
+
db = JSON.parse( dashboard ) if( dashboard.is_a?(String) )
|
46
|
+
title = db.dig('dashboard','title')
|
47
|
+
end
|
48
|
+
|
49
|
+
@logger.debug("Creating dashboard: #{title} (POST /api/dashboards/db)") if @debug
|
50
|
+
|
51
|
+
post( endpoint, dashboard )
|
52
|
+
end
|
53
|
+
|
54
|
+
# Delete dashboard
|
55
|
+
# DELETE /api/dashboards/db/:slug
|
56
|
+
def delete_dashboard( name )
|
57
|
+
|
58
|
+
endpoint = format( '/api/dashboards/db/%s', slug(name) )
|
59
|
+
|
60
|
+
@logger.debug("Deleting dashboard #{slug(name)} (DELETE #{endpoint})") if @debug
|
61
|
+
|
62
|
+
delete(endpoint)
|
63
|
+
end
|
64
|
+
|
65
|
+
# Gets the home dashboard
|
66
|
+
# GET /api/dashboards/home
|
67
|
+
def home_dashboard
|
68
|
+
|
69
|
+
endpoint = '/api/dashboards/home'
|
70
|
+
|
71
|
+
@logger.debug("Attempting to get home dashboard (GET #{endpoint})") if @debug
|
72
|
+
|
73
|
+
get(endpoint)
|
74
|
+
end
|
75
|
+
|
76
|
+
# Tags for Dashboard
|
77
|
+
# GET /api/dashboards/tags
|
78
|
+
def dashboard_tags
|
79
|
+
|
80
|
+
endpoint = '/api/dashboards/tags'
|
81
|
+
|
82
|
+
@logger.debug("Attempting to get dashboard tags(GET #{endpoint})") if @debug
|
83
|
+
|
84
|
+
get(endpoint)
|
85
|
+
end
|
86
|
+
|
87
|
+
# Search Dashboards
|
88
|
+
# GET /api/search/
|
89
|
+
#
|
90
|
+
# searchDashboards( { :tags => host } )
|
91
|
+
# searchDashboards( { :tags => [ host, 'tag1' ] } )
|
92
|
+
# searchDashboards( { :tags => [ 'tag2' ] } )
|
93
|
+
# searchDashboards( { :query => title } )
|
94
|
+
# searchDashboards( { :starred => true } )
|
95
|
+
def search_dashboards( params = {} )
|
96
|
+
|
97
|
+
raise ArgumentError.new(format('wrong type. \'params\' must be an Hash, given \'%s\'', params.class.to_s)) unless( params.is_a?(Hash) )
|
98
|
+
|
99
|
+
query = params.dig(:query)
|
100
|
+
starred = params.dig(:starred)
|
101
|
+
tags = params.dig(:tags)
|
102
|
+
api = []
|
103
|
+
|
104
|
+
api << format( 'query=%s', CGI.escape( query ) ) unless query.nil?
|
105
|
+
api << format( 'starred=%s', starred ? 'true' : 'false' ) unless( starred.nil? )
|
106
|
+
|
107
|
+
unless( tags.nil? )
|
108
|
+
|
109
|
+
tags = tags.join( '&tag=' ) if( tags.is_a?( Array ) )
|
110
|
+
|
111
|
+
api << format( 'tag=%s', tags )
|
112
|
+
end
|
113
|
+
|
114
|
+
api = api.join( '&' )
|
115
|
+
|
116
|
+
endpoint = format( '/api/search/?%s' , api )
|
117
|
+
|
118
|
+
@logger.debug("Attempting to search for dashboards (GET #{endpoint})") if @debug
|
119
|
+
|
120
|
+
get( endpoint )
|
121
|
+
end
|
122
|
+
|
123
|
+
|
124
|
+
def import_dashboards_from_directory( directory )
|
125
|
+
|
126
|
+
raise ArgumentError.new('directory must be an String') unless( directory.is_a?(String) )
|
127
|
+
|
128
|
+
result = {}
|
129
|
+
|
130
|
+
dirs = Dir.glob( format( '%s/**.json', directory ) ).sort
|
131
|
+
|
132
|
+
dirs.each do |f|
|
133
|
+
|
134
|
+
@logger.debug( format( 'import \'%s\'', f ) ) if @debug
|
135
|
+
|
136
|
+
dashboard = File.read( f )
|
137
|
+
dashboard = JSON.parse( dashboard )
|
138
|
+
title = dashboard.dig('dashboard','title') || f
|
139
|
+
|
140
|
+
result[f.to_s] ||= {}
|
141
|
+
result[f.to_s] = create_dashboard( title: title, dashboard: dashboard )
|
142
|
+
end
|
143
|
+
|
144
|
+
result
|
145
|
+
end
|
146
|
+
|
147
|
+
end
|
148
|
+
|
149
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
|
2
|
+
module Grafana
|
3
|
+
|
4
|
+
# http://docs.grafana.org/http_api/annotations/
|
5
|
+
#
|
6
|
+
module DashboardVersions
|
7
|
+
|
8
|
+
# Get all dashboard versions
|
9
|
+
# http://docs.grafana.org/http_api/dashboard_versions/#get-all-dashboard-versions
|
10
|
+
# GET /api/dashboards/id/:dashboardId/versions
|
11
|
+
def dashboard_all_versions( params ); end
|
12
|
+
|
13
|
+
# Get dashboard version
|
14
|
+
# http://docs.grafana.org/http_api/dashboard_versions/#get-dashboard-version
|
15
|
+
# GET /api/dashboards/id/:dashboardId/versions/:id
|
16
|
+
def dashboard_version( params ); end
|
17
|
+
|
18
|
+
# Restore dashboard
|
19
|
+
# http://docs.grafana.org/http_api/dashboard_versions/#restore-dashboard
|
20
|
+
# POST /api/dashboards/id/:dashboardId/restore
|
21
|
+
def restore_dashboard( params ); end
|
22
|
+
|
23
|
+
# Compare dashboard versions
|
24
|
+
# http://docs.grafana.org/http_api/dashboard_versions/#compare-dashboard-versions
|
25
|
+
# POST /api/dashboards/calculate-diff
|
26
|
+
def compare_dashboard_version( params ); end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
@@ -0,0 +1,271 @@
|
|
1
|
+
|
2
|
+
module Grafana
|
3
|
+
|
4
|
+
# http://docs.grafana.org/http_api/datasource/
|
5
|
+
#
|
6
|
+
module Datasource
|
7
|
+
|
8
|
+
# Get all datasources
|
9
|
+
#
|
10
|
+
# @example
|
11
|
+
# datasources
|
12
|
+
#
|
13
|
+
# @return [Hash]
|
14
|
+
#
|
15
|
+
def datasources
|
16
|
+
|
17
|
+
endpoint = '/api/datasources'
|
18
|
+
|
19
|
+
@logger.debug("Attempting to get all existing data sources (GET #{endpoint})") if @debug
|
20
|
+
|
21
|
+
datasources = get( endpoint )
|
22
|
+
|
23
|
+
if datasources.nil? || datasources.dig('status').to_i != 200
|
24
|
+
return {
|
25
|
+
'status' => 404,
|
26
|
+
'message' => 'No Datasources found'
|
27
|
+
}
|
28
|
+
end
|
29
|
+
|
30
|
+
datasources = datasources.dig('message')
|
31
|
+
|
32
|
+
datasource_map = {}
|
33
|
+
datasources.each do |ds|
|
34
|
+
datasource_map[ds['id']] = ds
|
35
|
+
end
|
36
|
+
|
37
|
+
datasource_map
|
38
|
+
end
|
39
|
+
|
40
|
+
# Get a single datasources by Id or Name
|
41
|
+
#
|
42
|
+
# @example
|
43
|
+
# datasource( 1 )
|
44
|
+
# datasource( 'foo' )
|
45
|
+
#
|
46
|
+
# @return [Hash]
|
47
|
+
#
|
48
|
+
def datasource( datasource_id )
|
49
|
+
|
50
|
+
raise ArgumentError.new(format('wrong type. user \'datasource_id\' must be an String (for an Datasource name) or an Integer (for an Datasource Id), given \'%s\'', datasource_id.class.to_s)) if( datasource_id.is_a?(String) && datasource_id.is_a?(Integer) )
|
51
|
+
raise ArgumentError.new('missing \'datasource_id\'') if( datasource_id.size.zero? )
|
52
|
+
|
53
|
+
if(datasource_id.is_a?(String))
|
54
|
+
data = datasources.select { |_k,v| v['name'] == datasource_id }
|
55
|
+
datasource_id = data.keys.first if( data )
|
56
|
+
end
|
57
|
+
|
58
|
+
if( datasource_id.nil? )
|
59
|
+
return {
|
60
|
+
'status' => 404,
|
61
|
+
'message' => format( 'No Datasource \'%s\' found', datasource_id)
|
62
|
+
}
|
63
|
+
end
|
64
|
+
|
65
|
+
raise format('DataSource Id can not be 0') if( datasource_id.zero? )
|
66
|
+
|
67
|
+
endpoint = format('/api/datasources/%d', datasource_id )
|
68
|
+
|
69
|
+
@logger.debug("Attempting to get existing data source Id #{datasource_id} (GET #{endpoint})") if @debug
|
70
|
+
|
71
|
+
get(endpoint)
|
72
|
+
end
|
73
|
+
|
74
|
+
# Get a single data source by Name
|
75
|
+
# GET /api/datasources/name/:name
|
76
|
+
|
77
|
+
# Get data source Id by Name
|
78
|
+
# GET /api/datasources/id/:name
|
79
|
+
|
80
|
+
# Update an existing data source
|
81
|
+
#
|
82
|
+
# merge an current existing datasource configuration with the new values
|
83
|
+
#
|
84
|
+
# @param [Hash] params
|
85
|
+
# @option params [Hash] data
|
86
|
+
# @option params [Mixed] datasource Datasource Name (String) or Datasource Id (Integer)
|
87
|
+
#
|
88
|
+
# @example
|
89
|
+
# update_datasource(
|
90
|
+
# datasource: 'graphite',
|
91
|
+
# data: { url: 'http://localhost:2003' }
|
92
|
+
# )
|
93
|
+
#
|
94
|
+
# @return [Hash]
|
95
|
+
#
|
96
|
+
def update_datasource( params )
|
97
|
+
|
98
|
+
raise ArgumentError.new(format('wrong type. \'params\' must be an Hash, given \'%s\'', params.class.to_s)) unless( params.is_a?(Hash) )
|
99
|
+
raise ArgumentError.new('missing \'params\'') if( params.size.zero? )
|
100
|
+
|
101
|
+
data = validate( params, required: true, var: 'data', type: Hash )
|
102
|
+
datasource = validate( params, required: true, var: 'datasource' )
|
103
|
+
|
104
|
+
raise ArgumentError.new(format('wrong type. user \'datasource\' must be an String (for an Datasource name) or an Integer (for an Datasource Id), given \'%s\'', datasource.class.to_s)) if( datasource.is_a?(String) && datasource.is_a?(Integer) )
|
105
|
+
|
106
|
+
existing_ds = datasource(datasource)
|
107
|
+
|
108
|
+
existing_ds.reject! { |x| x == 'status' }
|
109
|
+
existing_ds = existing_ds.deep_string_keys
|
110
|
+
|
111
|
+
datasource_id = existing_ds.dig('id')
|
112
|
+
|
113
|
+
payload = data.deep_string_keys
|
114
|
+
payload = existing_ds.merge(payload).deep_symbolize_keys
|
115
|
+
|
116
|
+
endpoint = format('/api/datasources/%d', datasource_id )
|
117
|
+
@logger.debug("Updating data source Id #{datasource_id} (GET #{endpoint})") if @debug
|
118
|
+
logger.debug(payload.to_json) if(@debug)
|
119
|
+
|
120
|
+
put( endpoint, payload.to_json )
|
121
|
+
end
|
122
|
+
|
123
|
+
# Create data source
|
124
|
+
#
|
125
|
+
# @param [Hash] params
|
126
|
+
# @option params [String] type Datasource Type - (required) (grafana graphite cloudwatch elasticsearch prometheus influxdb mysql opentsdb postgres)
|
127
|
+
# @option params [String] name Datasource Name - (required)
|
128
|
+
# @option params [String] database Datasource Database - (required)
|
129
|
+
# @option params [String] access (proxy) Acess Type - (required) (proxy or direct)
|
130
|
+
# @option params [Boolean] default (false)
|
131
|
+
# @option params [String] user
|
132
|
+
# @option params [String] password
|
133
|
+
# @option params [String] url Datasource URL - (required)
|
134
|
+
# @option params [Hash] json_data
|
135
|
+
# @option params [Hash] json_secure
|
136
|
+
# @option params [String] basic_user
|
137
|
+
# @option params [String] basic_password
|
138
|
+
#
|
139
|
+
# @example
|
140
|
+
# params = {
|
141
|
+
# name: 'graphite',
|
142
|
+
# type: 'graphite',
|
143
|
+
# database: 'graphite',
|
144
|
+
# url: 'http://localhost:8080'
|
145
|
+
# }
|
146
|
+
# create_datasource(params)
|
147
|
+
#
|
148
|
+
# params = {
|
149
|
+
# name: 'graphite',
|
150
|
+
# type: 'graphite',
|
151
|
+
# database: 'graphite',
|
152
|
+
# default: true,
|
153
|
+
# url: 'http://localhost:8080',
|
154
|
+
# json_data: { graphiteVersion: '1.1' }
|
155
|
+
# }
|
156
|
+
# create_datasource(params)
|
157
|
+
#
|
158
|
+
# params = {
|
159
|
+
# name: 'test_datasource',
|
160
|
+
# type: 'cloudwatch',
|
161
|
+
# url: 'http://monitoring.us-west-1.amazonaws.com',
|
162
|
+
# json_data: {
|
163
|
+
# authType: 'keys',
|
164
|
+
# defaultRegion: 'us-west-1'
|
165
|
+
# },
|
166
|
+
# json_secure: {
|
167
|
+
# accessKey: 'Ol4pIDpeKSA6XikgOl4p',
|
168
|
+
# secretKey: 'dGVzdCBrZXkgYmxlYXNlIGRvbid0IHN0ZWFs'
|
169
|
+
# }
|
170
|
+
# }
|
171
|
+
# create_datasource(params)
|
172
|
+
#
|
173
|
+
# @return [Hash]
|
174
|
+
#
|
175
|
+
def create_datasource( params )
|
176
|
+
|
177
|
+
raise ArgumentError.new(format('wrong type. \'params\' must be an Hash, given \'%s\'', params.class.to_s)) unless( params.is_a?(Hash) )
|
178
|
+
raise ArgumentError.new('missing \'params\'') if( params.size.zero? )
|
179
|
+
|
180
|
+
type = validate( params, required: true, var: 'type', type: String )
|
181
|
+
name = validate( params, required: true, var: 'name', type: String )
|
182
|
+
database = validate( params, required: true, var: 'database', type: String )
|
183
|
+
access = validate( params, required: false, var: 'access', type: String ) || 'proxy'
|
184
|
+
default = validate( params, required: false, var: 'default', type: Boolean ) || false
|
185
|
+
user = validate( params, required: false, var: 'user', type: String )
|
186
|
+
password = validate( params, required: false, var: 'password', type: String )
|
187
|
+
url = validate( params, required: true, var: 'url', type: String )
|
188
|
+
json_data = validate( params, required: false, var: 'json_data', type: Hash )
|
189
|
+
json_secure = validate( params, required: false, var: 'json_secure', type: Hash )
|
190
|
+
ba_user = validate( params, required: false, var: 'basic_user', type: String )
|
191
|
+
ba_password = validate( params, required: false, var: 'basic_password', type: String )
|
192
|
+
|
193
|
+
basic_auth = false
|
194
|
+
basic_auth = true unless( ba_user.nil? && ba_password.nil? )
|
195
|
+
|
196
|
+
valid_types = %w[grafana graphite cloudwatch elasticsearch prometheus influxdb mysql opentsdb postgres]
|
197
|
+
|
198
|
+
raise ArgumentError.new(format('wrong datasource type. only %s allowed, given \%s\'', valid_types.join(', '), type)) if( valid_types.include?(type.downcase) == false )
|
199
|
+
|
200
|
+
payload = {
|
201
|
+
isDefault: default,
|
202
|
+
basicAuth: basic_auth,
|
203
|
+
basicAuthUser: ba_user,
|
204
|
+
basicAuthPassword: ba_password,
|
205
|
+
name: name,
|
206
|
+
type: type,
|
207
|
+
url: url,
|
208
|
+
access: access,
|
209
|
+
jsonData: json_data,
|
210
|
+
secureJsonData: json_secure
|
211
|
+
}
|
212
|
+
|
213
|
+
payload.reject!{ |_k, v| v.nil? }
|
214
|
+
|
215
|
+
if( @debug )
|
216
|
+
logger.debug("Creating data source: #{name} (database: #{database})")
|
217
|
+
logger.debug( payload.to_json )
|
218
|
+
end
|
219
|
+
|
220
|
+
endpoint = '/api/datasources'
|
221
|
+
post(endpoint, payload.to_json)
|
222
|
+
end
|
223
|
+
|
224
|
+
# Delete an existing data source by id
|
225
|
+
#
|
226
|
+
# @param [Mixed] datasource_id Datasource Name (String) or Datasource Id (Integer) for delete Datasource
|
227
|
+
#
|
228
|
+
# @example
|
229
|
+
# delete_datasource( 1 )
|
230
|
+
# delete_datasource( 'foo' )
|
231
|
+
#
|
232
|
+
# @return [Hash]
|
233
|
+
#
|
234
|
+
def delete_datasource( datasource_id )
|
235
|
+
|
236
|
+
raise ArgumentError.new(format('wrong type. user \'datasource_id\' must be an String (for an Datasource name) or an Integer (for an Datasource Id), given \'%s\'', datasource_id.class.to_s)) if( datasource_id.is_a?(String) && datasource_id.is_a?(Integer) )
|
237
|
+
raise ArgumentError.new('missing \'datasource_id\'') if( datasource_id.size.zero? )
|
238
|
+
|
239
|
+
if(datasource_id.is_a?(String))
|
240
|
+
data = datasources.select { |_k,v| v['name'] == datasource_id }
|
241
|
+
datasource_id = data.keys.first if( data )
|
242
|
+
end
|
243
|
+
|
244
|
+
if( datasource_id.nil? )
|
245
|
+
return {
|
246
|
+
'status' => 404,
|
247
|
+
'message' => format( 'No Datasource \'%s\' found', datasource_id)
|
248
|
+
}
|
249
|
+
end
|
250
|
+
|
251
|
+
raise format('Data Source Id can not be 0') if( datasource_id.zero? )
|
252
|
+
|
253
|
+
endpoint = format('/api/datasources/%d', datasource_id)
|
254
|
+
logger.debug("Deleting data source Id #{datasource_id} (DELETE #{endpoint})") if @debug
|
255
|
+
|
256
|
+
delete(endpoint)
|
257
|
+
end
|
258
|
+
|
259
|
+
|
260
|
+
# Delete an existing data source by name
|
261
|
+
# DELETE /api/datasources/name/:datasourceName
|
262
|
+
|
263
|
+
# Data source proxy calls
|
264
|
+
# GET /api/datasources/proxy/:datasourceId/*
|
265
|
+
|
266
|
+
|
267
|
+
|
268
|
+
end
|
269
|
+
|
270
|
+
end
|
271
|
+
|