SQL
The SQL plugin can be used to get run queries against a SQL database. Currently we are supporting ClickHouse, Postgres and MySQL databases.
Configuration
To use the SQL plugin the following configuration is needed in the satellites configuration file:
| Field | Type | Description | Required |
|---|---|---|---|
| name | string | The name of the SQL plugin instance. | Yes |
| type | sql |
The type for the SQL plugin. | Yes |
| options.connection | string | The connection string, to connect to a SQL database. | Yes |
| options.driver | string | The driver which should be used for the database instance. This must be clickhouse, postgres or mysql. |
Yes |
plugins:
- name: sql
type: sql
options:
connection:
driver:
Insight Options
Note
The SQL plugin can not be used within the insights section of an application.
Variable Options
Note
The SQL plugin can not be used to get a list of variable values.
Panel Options
The following options can be used for a panel with the SQL plugin:
| Field | Type | Description | Required |
|---|---|---|---|
| type | string | The type which should be used to visualize the data. This can be table or chart. |
Yes |
| queries | []Query | A list of queries, which can be selected by the user. This is required when the type is set to table. |
No |
| chart | Chart | Settings to render the results of a query in a chart. This is required when the type is set to chart. |
No |
Query
| Field | Type | Description | Required |
|---|---|---|---|
| name | string | A name for the SQL query, which is displayed in the select box. | Yes |
| query | string | The query which should be run against the configured SQL database. | Yes |
| columns | map |
A map of columns to format the returned data for a query. The key must match the returned column name. | No |
Column
| Field | Type | Description | Required |
|---|---|---|---|
| title | string | Set a title for the column. | No |
| unit | string | A unit which should be displayed behind the column value. If this is time we automatically try to auto format the column to the users local time. |
No |
Chart
| Field | Type | Description | Required |
|---|---|---|---|
| type | string | The chart type. This could be pie, line or area. |
Yes |
| query | string | The query which which results should be used in the chart. | Yes |
| pieLabelColumn | string | The name of the column which should be used for the labels in the pie chart. This is required when the type is pie. |
No |
| pieValueColumn | string | The name of the column which should be used for the values in the pie chart. This is required when the type is pie. |
No |
| xAxisColumn | string | The column which should be used for the x axis. This is required when the type is line or area. |
No |
| xAxisType | string | The type for the x axis. This could be empty or time. |
No |
| xAxisUnit | string | The unit which should be used for the x axis. | No |
| yAxisColumns | []string | A list of columns which should be shown for the y axis. This is required when the type is line or area. |
No |
| yAxisUnit | string | The unit for the y axis. | No |
| yAxisStacked | boolean | When this is true the values of the y axis are stacked. |
No |
| legend | map |
A map of string pairs, to set the displayed title for a column in the legend. The key is the column name as returned by the query and the value is the shown title. | No |
Usage
Application
---
apiVersion: kobs.io/v1
kind: Application
metadata:
name: example-application
namespace: kobs
spec:
dashboards:
- title: Latency
inline:
rows:
- size: 3
panels:
- title: Raw Data
colSpan: 6
rowSpan: 2
plugin:
name: sql
type: sql
options:
type: table
queries:
- name: Duration and Upstream Service Time
query: |
SELECT
toStartOfInterval(timestamp, INTERVAL 60 second) AS time,
avg(fields_number.value[indexOf(fields_number.key, 'content.duration')]) as avg_duration,
avg(fields_number.value[indexOf(fields_number.key, 'content.upstream_service_time')]) as avg_ust,
avg_duration - avg_ust as avg_diff
FROM
logs.logs
WHERE
timestamp >= FROM_UNIXTIME({% .__timeStart %})
AND timestamp <= FROM_UNIXTIME({% .__timeEnd %})
AND namespace='myservice'
AND app='myservice'
AND container_name='istio-proxy'
AND match(fields_string.value[indexOf(fields_string.key, 'content.upstream_cluster')], '^inbound.*')
GROUP BY
time
ORDER BY
time
columns:
time:
title: Time
unit: time
avg_duration:
title: Duration
unit: ms
avg_ust:
title: Upstream Service Time
unit: ms
avg_diff:
title: Difference
unit: ms
- title: Difference
colSpan: 6
plugin:
name: sql
type: sql
options:
type: chart
chart:
type: line
query: |
SELECT
toStartOfInterval(timestamp, INTERVAL 60 second) AS time,
avg(fields_number.value[indexOf(fields_number.key, 'content.duration')]) - avg(fields_number.value[indexOf(fields_number.key, 'content.upstream_service_time')]) as avg_diff
FROM
logs.logs
WHERE
timestamp >= FROM_UNIXTIME({% .__timeStart %})
AND timestamp <= FROM_UNIXTIME({% .__timeEnd %})
AND namespace='myservice'
AND app='myservice'
AND container_name='istio-proxy'
AND match(fields_string.value[indexOf(fields_string.key, 'content.upstream_cluster')], '^inbound.*')
GROUP BY
time
ORDER BY
time
xAxisColumn: time
xAxisType: time
yAxisColumns:
- avg_diff
yAxisUnit: ms
yAxisStacked: false
legend:
avg_diff: Difference
- title: Duration vs Upstream Service Time
colSpan: 6
plugin:
name: sql
type: sql
options:
type: chart
chart:
type: line
query: |
SELECT
toStartOfInterval(timestamp, INTERVAL 60 second) AS time,
avg(fields_number.value[indexOf(fields_number.key, 'content.duration')]) as avg_duration,
avg(fields_number.value[indexOf(fields_number.key, 'content.upstream_service_time')]) as avg_ust
FROM
logs.logs
WHERE
timestamp >= FROM_UNIXTIME({% .__timeStart %})
AND timestamp <= FROM_UNIXTIME({% .__timeEnd %})
AND namespace='myservice'
AND app='myservice'
AND container_name='istio-proxy'
AND match(fields_string.value[indexOf(fields_string.key, 'content.upstream_cluster')], '^inbound.*')
GROUP BY
time
ORDER BY
time
xAxisColumn: time
xAxisType: time
yAxisColumns:
- avg_duration
- avg_ust
yAxisUnit: ms
yAxisStacked: false
legend:
avg_duration: Duration
avg_ust: Upstream Service Time
- title: Log Levels
inline:
rows:
- size: 3
panels:
- title: Raw Data
colSpan: 6
plugin:
name: sql
type: sql
options:
type: table
queries:
- name: Log Levels
query: |
SELECT
content.level,
count(content.level) as count_data
FROM
logs.logs
WHERE
timestamp >= FROM_UNIXTIME({% .__timeStart %})
AND timestamp <= FROM_UNIXTIME({% .__timeEnd %})
AND namespace='myservice'
AND app='myservice'
AND container_name='myservice'
GROUP BY
content.level
columns:
content.level:
title: Level
count_data:
title: Count
- title: Log Level Distribution
colSpan: 6
plugin:
name: sql
type: sql
options:
type: chart
chart:
type: pie
query: |
SELECT
content.level,
count(content.level) as count_data
FROM
logs.logs
WHERE
timestamp >= FROM_UNIXTIME({% .__timeStart %})
AND timestamp <= FROM_UNIXTIME({% .__timeEnd %})
AND namespace='myservice'
AND app='myservice'
AND container_name='myservice'
GROUP BY
content.level
pieLabelColumn: content.level
pieValueColumn: count_data

