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
The SQL plugin can be used within the hub or cluster. To use the SQL plugin the following configuration is needed:
| Field | Type | Description | Required |
|---|---|---|---|
| name | string | The name of the SQL plugin instance. | Yes |
| type | sql |
The type for the SQL plugin. | Yes |
| options.driver | string | The driver which should be used for the database instance. This must be clickhouse, postgres, mysql or bigquery. |
Yes |
| options.address | string | The connection string, to connect to a SQL database. | Yes |
| options.database | string | The name of the database. | Yes |
plugins:
- name: sql
type: sql
options:
driver:
address:
database:
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, area, bar or singlestats. |
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 |
| yAxisGroup | string | The name of the column, which values should be used to group the data. | 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 |
| thresholds | map |
A map of string pairs, to set the background color in a singlestats chart. |
No |
Usage
Example 1
---
apiVersion: kobs.io/v1
kind: Application
metadata:
name: default
namespace: default
spec:
description: The default application is an application to test all available kobs plugins.
dashboards:
- title: Latency
inline:
rows:
- panels:
- title: Raw Data
plugin:
name: clickhouse-logging
type: sql
options:
type: table
queries:
- name: Duration and Upstream Service Time
query: |
SELECT
toStartOfInterval(timestamp, INTERVAL 60 second) AS time,
avg(fields_number['content_duration']) as avg_duration,
avg(fields_number['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['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
h: 14
w: 6
x: 0
'y': 0
- title: Difference
plugin:
name: clickhouse-logging
type: sql
options:
type: chart
chart:
type: line
query: |
SELECT
toStartOfInterval(timestamp, INTERVAL 60 second) AS time,
avg(fields_number['content_duration']) - avg(fields_number['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['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
h: 7
w: 6
x: 6
'y': 0
- title: Duration vs Upstream Service Time
plugin:
name: clickhouse-logging
type: sql
options:
type: chart
chart:
type: line
query: |
SELECT
toStartOfInterval(timestamp, INTERVAL 60 second) AS time,
avg(fields_number['content_duration']) as avg_duration,
avg(fields_number['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['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
h: 7
w: 6
x: 6
'y': 7

Example 2
---
apiVersion: kobs.io/v1
kind: Application
metadata:
name: default
namespace: default
spec:
description: The default application is an application to test all available kobs plugins.
dashboards:
- title: Log Levels
inline:
rows:
- panels:
- title: Log Levels
plugin:
name: clickhouse-logging
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
h: 8
w: 6
x: 0
'y': 0
- title: Log Level Distribution
plugin:
name: clickhouse-logging
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
h: 8
w: 6
x: 6
'y': 0

Example 3
---
apiVersion: kobs.io/v1
kind: Application
metadata:
name: default
namespace: default
spec:
description: The default application is an application to test all available kobs plugins.
dashboards:
- title: Latency
inline:
rows:
- panels:
- title: Current Latency
plugin:
name: clickhouse-tracing
type: sql
options:
type: chart
chart:
type: singlestats
query: |
SELECT
floor(quantile(0.5)(JSONExtractInt(model, 'duration')) / 1000000, 2) as p50,
floor(quantile(0.95)(JSONExtractInt(model, 'duration')) / 1000000, 2) as p95,
floor(quantile(0.99)(JSONExtractInt(model, 'duration')) / 1000000, 2) as p99
FROM
(
SELECT * FROM jaeger_spans
WHERE
timestamp >= FROM_UNIXTIME({% .__timeStart %})
AND timestamp <= FROM_UNIXTIME({% .__timeEnd %})
AND JSONExtractString(model, 'operation_name') = 'async envoy.service.auth.v3.Authorization.Check egress'
)
yAxisColumns:
- p50
- p95
- p99
yAxisUnit: ms
legend:
p50: P50
p95: P95
p99: P99
thresholds:
'4': '#F0AB00'
'6': '#C9190B'
'-1024': '#3E8635'
h: 4
w: 12
x: 0
'y': 0
- title: Latency over Time
plugin:
name: clickhouse-tracing
type: sql
options:
type: chart
chart:
type: line
query: |
SELECT
toStartOfInterval(timestamp, INTERVAL 60 second) AS time,
floor(quantile(0.5)(JSONExtractInt(model, 'duration')) / 1000000, 2) as p50,
floor(quantile(0.95)(JSONExtractInt(model, 'duration')) / 1000000, 2) as p95,
floor(quantile(0.99)(JSONExtractInt(model, 'duration')) / 1000000, 2) as p99
FROM
(
SELECT * FROM jaeger_spans
WHERE
timestamp >= FROM_UNIXTIME({% .__timeStart %})
AND timestamp <= FROM_UNIXTIME({% .__timeEnd %})
AND JSONExtractString(model, 'operation_name') = 'async envoy.service.auth.v3.Authorization.Check egress'
)
GROUP BY time
ORDER BY time
xAxisColumn: time
xAxisType: time
yAxisColumns:
- p50
- p95
- p99
yAxisUnit: ms
legend:
p50: P50
p95: P95
p99: P99
h: 9
w: 12
x: 0
'y': 4
