c76b560e4efafa05ea6fbf0fd3e076c9356a9cf8
[osm/tests.git] / robot-systest / lib / prometheus_lib.robot
1 #   Licensed under the Apache License, Version 2.0 (the "License");
2 #   you may not use this file except in compliance with the License.
3 #   You may obtain a copy of the License at
4 #
5 #       http://www.apache.org/licenses/LICENSE-2.0
6 #
7 #   Unless required by applicable law or agreed to in writing, software
8 #   distributed under the License is distributed on an "AS IS" BASIS,
9 #   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10 #   See the License for the specific language governing permissions and
11 #   limitations under the License.
12
13 *** Settings ***
14 Documentation   Library to obtain metrics from Prometheus.
15
16 Library   String
17 Library   Collections
18 Library   RequestsLibrary
19
20
21 *** Variables ***
22 ${timeout}   30
23 ${max_retries}   1
24
25
26 *** Keywords ***
27 Get Metric
28     [Documentation]   Get the instant value of a metric from Prometheus using multiple filter parameters.
29     ...                 The filter parameters are given to this function in key=value format (one argument per key/value pair).
30     ...                 Fails if the metric is not found or has multiple values.
31     ...                 Examples of execution:
32     ...                     \${metric}=   Get Metric   \${prometheus_ip}   \${prometheus_port}   \${metric}
33     ...                     \${metric}=   Get Metric   \${prometheus_ip}   \${prometheus_port}   \${metric}   \${param1}=\${value1}   \${param2}=\${value2}
34
35     [Arguments]   ${prometheus_ip}   ${prometheus_port}   ${metric}   @{filter_parameters}
36
37     ${filter}=   Set Variable   ${EMPTY}
38     FOR   ${param}   IN   @{filter_parameters}
39         ${match}   ${param_name}   ${param_value} =   Should Match Regexp   ${param}   (.+)=(.+)   msg=Syntax error in filter parameters
40         ${filter}=   Catenate   SEPARATOR=   ${filter}   ${param_name}="${param_value}",
41     END
42     ${resp}=   Execute Prometheus Instant Query   ${prometheus_host}   ${prometheus_port}   query=${metric}{${filter}}
43     ${result_list}=   Convert To List   ${resp["data"]["result"]}
44     ${results}=   Get Length   ${result_list}
45     Should Not Be Equal As Numbers   0   ${results}   msg=Metric ${metric} not found   values=false
46     Should Be Equal As Integers   1   ${results}   msg=Metric ${metric} with multiple values   values=false
47     [Return]   ${result_list[0]["value"][1]}
48
49
50 Execute Prometheus Instant Query
51     [Documentation]   Execute a Prometheus Instant Query using HTTP API.
52     ...                 Return an inline json with the result of the query.
53     ...                 The requested URL is the next: http://\${prometheus_ip}:\${prometheus_port}/api/v1/query?\${querystring}
54
55     [Arguments]   ${prometheus_ip}   ${prometheus_port}   ${querystring}
56
57     Create Session   prometheus   http://${prometheus_ip}:${prometheus_port}   timeout=${timeout}   max_retries=${max_retries}
58     ${resp}=   GET On Session   prometheus   /api/v1/query?${querystring}   timeout=${timeout}
59     Status Should Be   200   ${resp}
60     [Return]   ${resp.json()}