ClickHouse/tests/queries/0_stateless/01455_opentelemetry_distributed.sh

122 lines
4.4 KiB
Bash
Raw Normal View History

2020-08-28 23:25:30 +00:00
#!/usr/bin/env bash
set -ue
unset CLICKHOUSE_LOG_COMMENT
2021-01-30 23:22:55 +00:00
2020-08-28 23:25:30 +00:00
CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
2020-12-28 11:46:53 +00:00
# shellcheck source=../shell_config.sh
2020-08-28 23:25:30 +00:00
. "$CURDIR"/../shell_config.sh
function check_log
{
${CLICKHOUSE_CLIENT} --format=JSONEachRow -nq "
2020-08-28 23:25:30 +00:00
system flush logs;
-- Check the number of query spans with given trace id, to verify it was
-- propagated.
select count(*) "'"'"total spans"'"'",
uniqExact(span_id) "'"'"unique spans"'"'",
uniqExactIf(parent_span_id, parent_span_id != 0)
"'"'"unique non-zero parent spans"'"'"
2020-10-22 16:47:20 +00:00
from system.opentelemetry_span_log
2020-08-28 23:25:30 +00:00
where trace_id = reinterpretAsUUID(reverse(unhex('$trace_id')))
and operation_name = 'query'
;
-- Also check that the initial query span in ClickHouse has proper parent span.
select count(*) "'"'"initial query spans with proper parent"'"'"
from
(select *, attribute_name, attribute_value
2020-10-22 16:47:20 +00:00
from system.opentelemetry_span_log
array join attribute.names as attribute_name,
attribute.values as attribute_value) o
join system.query_log on query_id = o.attribute_value
where
trace_id = reinterpretAsUUID(reverse(unhex('$trace_id')))
and current_database = currentDatabase()
and operation_name = 'query'
and parent_span_id = reinterpretAsUInt64(unhex('73'))
and o.attribute_name = 'clickhouse.query_id'
and is_initial_query
and type = 'QueryFinish'
;
2020-08-28 23:25:30 +00:00
-- Check that the tracestate header was propagated. It must have exactly the
-- same non-empty value for all 'query' spans in this trace.
select uniqExact(value) "'"'"unique non-empty tracestate values"'"'"
2020-10-22 16:47:20 +00:00
from system.opentelemetry_span_log
2020-08-28 23:25:30 +00:00
array join attribute.names as name, attribute.values as value
where
trace_id = reinterpretAsUUID(reverse(unhex('$trace_id')))
and operation_name = 'query'
2020-09-08 13:19:27 +00:00
and name = 'clickhouse.tracestate'
2020-08-28 23:25:30 +00:00
and length(value) > 0
;
"
}
# Generate some random trace id so that the prevous runs of the test do not interfere.
2020-09-08 13:19:27 +00:00
echo "===http==="
2020-08-28 23:25:30 +00:00
trace_id=$(${CLICKHOUSE_CLIENT} -q "select lower(hex(reverse(reinterpretAsString(generateUUIDv4()))))")
# Check that the HTTP traceparent is read, and then passed through `remote`
# table function. We expect 4 queries -- one initial, one SELECT and two
# DESC TABLE. Two DESC TABLE instead of one looks like a bug, see the issue:
# https://github.com/ClickHouse/ClickHouse/issues/14228
2020-09-08 13:19:27 +00:00
${CLICKHOUSE_CURL} \
--header "traceparent: 00-$trace_id-0000000000000073-01" \
--header "tracestate: some custom state" "$CLICKHOUSE_URL" \
2020-09-08 13:19:27 +00:00
--get \
--data-urlencode "query=select 1 from remote('127.0.0.2', system, one) format Null"
2020-08-28 23:25:30 +00:00
check_log
# With another trace id, check that clickhouse-client accepts traceparent, and
# that it is passed through URL table function. We expect two query spans, one
# for the initial query, and one for the HTTP query.
2020-09-08 13:19:27 +00:00
echo "===native==="
2020-08-28 23:25:30 +00:00
trace_id=$(${CLICKHOUSE_CLIENT} -q "select lower(hex(reverse(reinterpretAsString(generateUUIDv4()))))")
2020-09-08 13:19:27 +00:00
${CLICKHOUSE_CLIENT} \
--opentelemetry-traceparent "00-$trace_id-0000000000000073-01" \
2020-09-08 13:19:27 +00:00
--opentelemetry-tracestate "another custom state" \
--query "select * from url('http://127.0.0.2:8123/?query=select%201%20format%20Null', CSV, 'a int')"
2020-08-28 23:25:30 +00:00
check_log
2020-09-08 13:19:27 +00:00
# Test sampled tracing. The traces should be started with the specified
# probability, only for initial queries.
2020-09-08 13:19:27 +00:00
echo "===sampled==="
query_id=$(${CLICKHOUSE_CLIENT} -q "select lower(hex(reverse(reinterpretAsString(generateUUIDv4()))))")
2020-10-15 17:27:18 +00:00
for i in {1..200}
2020-09-08 13:19:27 +00:00
do
${CLICKHOUSE_CLIENT} \
--opentelemetry_start_trace_probability=0.1 \
2020-10-15 17:27:18 +00:00
--query_id "$query_id-$i" \
--query "select 1 from remote('127.0.0.2', system, one) format Null" \
&
# clickhouse-client is slow to start (initialization of DateLUT), so run
# several clients in parallel, but not too many.
2020-10-15 17:27:18 +00:00
if [[ $((i % 10)) -eq 0 ]]
then
wait
fi
2020-09-08 13:19:27 +00:00
done
2020-10-15 17:27:18 +00:00
wait
2020-09-08 13:19:27 +00:00
2020-10-15 17:27:18 +00:00
${CLICKHOUSE_CLIENT} -q "system flush logs"
2020-09-08 13:19:27 +00:00
${CLICKHOUSE_CLIENT} -q "
with count(*) as c
-- expect 200 * 0.1 = 20 sampled events on average
select if(c > 1 and c < 50, 'OK', 'fail: ' || toString(c))
2020-10-22 16:47:20 +00:00
from system.opentelemetry_span_log
2020-09-08 13:19:27 +00:00
array join attribute.names as name, attribute.values as value
where name = 'clickhouse.query_id'
2020-10-15 17:27:18 +00:00
and operation_name = 'query'
and parent_span_id = 0 -- only account for the initial queries
and value like '$query_id-%'
2020-09-08 13:19:27 +00:00
;
"