| 714 | } |
| 715 | |
| 716 | void HTTPHandler::handleRequest(HTTPServerRequest & request, HTTPServerResponse & response, const ProfileEvents::Event & write_event) |
| 717 | { |
| 718 | DB::setThreadName(ThreadName::HTTP_HANDLER); |
| 719 | |
| 720 | session = std::make_unique<Session>(server.context(), ClientInfo::Interface::HTTP, request.isSecure()); |
| 721 | SCOPE_EXIT({ session.reset(); }); |
| 722 | QueryScope query_scope; |
| 723 | |
| 724 | Output used_output; |
| 725 | |
| 726 | /// In case of exception, send stack trace to client. |
| 727 | bool with_stacktrace = false; |
| 728 | |
| 729 | OpenTelemetry::TracingContextHolderPtr thread_trace_context; |
| 730 | SCOPE_EXIT({ |
| 731 | // make sure the response status is recorded |
| 732 | if (thread_trace_context) |
| 733 | thread_trace_context->root_span.addAttribute("clickhouse.http_status", response.getStatus()); |
| 734 | }); |
| 735 | |
| 736 | try |
| 737 | { |
| 738 | if (request.getMethod() == HTTPServerRequest::HTTP_OPTIONS) |
| 739 | { |
| 740 | processOptionsRequest(response, server.config()); |
| 741 | return; |
| 742 | } |
| 743 | |
| 744 | // Parse the OpenTelemetry traceparent header. |
| 745 | auto & client_trace_context = session->getClientTraceContext(); |
| 746 | if (request.has("traceparent")) |
| 747 | { |
| 748 | std::string opentelemetry_traceparent = request.get("traceparent"); |
| 749 | std::string error; |
| 750 | if (!client_trace_context.parseTraceparentHeader(opentelemetry_traceparent, error)) |
| 751 | { |
| 752 | LOG_DEBUG(log, "Failed to parse OpenTelemetry traceparent header '{}': {}", opentelemetry_traceparent, error); |
| 753 | } |
| 754 | client_trace_context.tracestate = request.get("tracestate", ""); |
| 755 | } |
| 756 | |
| 757 | // Setup tracing context for this thread |
| 758 | auto context = session->sessionOrGlobalContext(); |
| 759 | thread_trace_context = std::make_unique<OpenTelemetry::TracingContextHolder>("HTTPHandler", |
| 760 | client_trace_context, |
| 761 | context->getSettingsRef(), |
| 762 | context->getOpenTelemetrySpanLog()); |
| 763 | thread_trace_context->root_span.kind = OpenTelemetry::SpanKind::SERVER; |
| 764 | thread_trace_context->root_span.addAttribute("clickhouse.uri", request.getURI()); |
| 765 | thread_trace_context->root_span.addAttribute("http.referer", request.get("Referer", "")); |
| 766 | thread_trace_context->root_span.addAttribute("http.user.agent", request.get("User-Agent", "")); |
| 767 | thread_trace_context->root_span.addAttribute("http.method", request.getMethod()); |
| 768 | |
| 769 | response.setContentType("text/plain; charset=UTF-8"); |
| 770 | response.add("Access-Control-Expose-Headers", "X-ClickHouse-Query-Id,X-ClickHouse-Summary,X-ClickHouse-Server-Display-Name,X-ClickHouse-Format,X-ClickHouse-Timezone,X-ClickHouse-Exception-Code,X-ClickHouse-Exception-Tag"); |
| 771 | response.set("X-ClickHouse-Server-Display-Name", server_display_name); |
| 772 | |
| 773 | if (!request.get("Origin", "").empty()) |
no test coverage detected