• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

llnl / dftracer-utils / 29787659139

20 Jul 2026 11:34PM UTC coverage: 51.578% (-1.1%) from 52.66%
29787659139

Pull #99

github

web-flow
Merge ee805adeb into 06bc84ec9
Pull Request #99: Support CM time_metric (NS/MS/SEC/US) across reader and viz

34832 of 86278 branches covered (40.37%)

Branch coverage included in aggregate %.

1034 of 1319 new or added lines in 30 files covered. (78.39%)

5193 existing lines in 197 files now uncovered.

35349 of 49791 relevant lines covered (70.99%)

9765.54 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

20.06
/src/dftracer/utils/server/viz_ui.cpp
1
#include <dftracer/utils/server/http_request.h>
2
#include <dftracer/utils/server/http_response.h>
3
#include <dftracer/utils/server/json_builder.h>
4
#include <dftracer/utils/server/router.h>
5
#include <dftracer/utils/server/viz_ui.h>
6
#include <simdjson.h>
7

8
#include <cctype>
9
#include <string>
10

11
namespace dftracer::utils::server {
12

13
static coro::CoroTask<HttpResponse> handle_index() {
5!
14
    co_return HttpResponse::ok(std::string(viz_index_html()),
2!
15
                               "text/html; charset=utf-8");
1!
UNCOV
16
}
×
17

18
namespace {
19

20
// OpenAPI 3.1 generated from the routes' RouteDoc metadata, serialized with
21
// simdjson's builder (correct escaping; examples are inlined raw as they are
22
// already valid JSON).
23
std::string openapi_json(const Router& router) {
×
24
    auto& b = scratch_json_builder();
×
25
    b.start_object();
×
26
    b.append_key_value("openapi", "3.1.0");
×
27
    b.append_comma();
×
28
    b.escape_and_append_with_quotes("info");
×
29
    b.append_colon();
×
30
    b.start_object();
×
31
    b.append_key_value("title", "DFTracer Server API");
×
32
    b.append_comma();
×
33
    b.append_key_value("version", "1");
×
34
    b.append_comma();
×
35
    b.append_key_value("description", "Query and visualize DFTracer traces.");
×
36
    b.end_object();
×
37
    b.append_comma();
×
38
    b.escape_and_append_with_quotes("servers");
×
39
    b.append_colon();
×
40
    b.start_array();
×
41
    b.start_object();
×
42
    b.append_key_value("url", "/");
×
43
    b.end_object();
×
44
    b.end_array();
×
45
    b.append_comma();
×
46
    b.escape_and_append_with_quotes("paths");
×
47
    b.append_colon();
×
48
    b.start_object();
×
49
    bool first = true;
×
50
    for (const auto& r : router.routes()) {
×
51
        if (r.doc.summary.empty()) continue;
×
52
        if (!first) b.append_comma();
×
53
        first = false;
×
54
        b.escape_and_append_with_quotes(r.path);
×
55
        b.append_colon();
×
56
        b.start_object();
×
57
        std::string method;
×
58
        for (char c : r.method)
×
UNCOV
59
            method +=
×
60
                static_cast<char>(std::tolower(static_cast<unsigned char>(c)));
×
61
        b.escape_and_append_with_quotes(method);
×
62
        b.append_colon();
×
63
        b.start_object();
×
64
        b.escape_and_append_with_quotes("tags");
×
65
        b.append_colon();
×
66
        b.start_array();
×
67
        b.escape_and_append_with_quotes(r.doc.tag);
×
68
        b.end_array();
×
69
        b.append_comma();
×
70
        b.append_key_value("summary", r.doc.summary);
×
71
        b.append_comma();
×
72
        b.escape_and_append_with_quotes("parameters");
×
73
        b.append_colon();
×
74
        b.start_array();
×
75
        bool first_param = true;
×
76
        for (const auto& p : r.doc.params) {
×
77
            if (!first_param) b.append_comma();
×
78
            first_param = false;
×
79
            b.start_object();
×
80
            b.append_key_value("name", p.name);
×
81
            b.append_comma();
×
82
            b.append_key_value("in", "query");
×
83
            b.append_comma();
×
84
            b.escape_and_append_with_quotes("required");
×
85
            b.append_colon();
×
86
            b.append(p.required);
×
87
            if (!p.desc.empty()) {
×
88
                b.append_comma();
×
89
                b.append_key_value("description", p.desc);
×
UNCOV
90
            }
×
91
            b.append_comma();
×
92
            b.escape_and_append_with_quotes("schema");
×
93
            b.append_colon();
×
94
            b.start_object();
×
95
            b.append_key_value("type", "string");
×
96
            if (!p.example.empty()) {
×
97
                b.append_comma();
×
98
                b.append_key_value("default", p.example);
×
UNCOV
99
            }
×
100
            b.end_object();
×
101
            b.end_object();
×
102
        }
103
        b.end_array();
×
104
        b.append_comma();
×
105
        b.escape_and_append_with_quotes("responses");
×
106
        b.append_colon();
×
107
        b.start_object();
×
108
        b.escape_and_append_with_quotes("200");
×
109
        b.append_colon();
×
110
        b.start_object();
×
111
        b.append_key_value("description", "OK");
×
112
        if (!r.doc.response_example.empty()) {
×
113
            b.append_comma();
×
114
            b.escape_and_append_with_quotes("content");
×
115
            b.append_colon();
×
116
            b.start_object();
×
117
            b.escape_and_append_with_quotes("application/json");
×
118
            b.append_colon();
×
119
            b.start_object();
×
120
            b.escape_and_append_with_quotes("example");
×
121
            b.append_colon();
×
122
            b.append_raw(r.doc.response_example);
×
123
            b.end_object();
×
124
            b.end_object();
×
UNCOV
125
        }
×
126
        b.end_object();  // 200
×
127
        b.end_object();  // responses
×
128
        b.end_object();  // method
×
129
        b.end_object();  // path
×
130
    }
×
131
    b.end_object();      // paths
×
132
    b.end_object();      // root
×
133
    return std::string(b);
×
UNCOV
134
}
×
135

136
}  // namespace
137

138
void register_viz_ui(Router& router) {
8✔
139
    RouteHandler serve_index = [](const HttpRequest&, const QueryParams&)
15!
140
        -> coro::CoroTask<HttpResponse> { co_return co_await handle_index(); };
5!
141
    router.get("/", serve_index);
8!
142
    router.get("/index.html", serve_index);
8!
143

144
    router.get(
16!
145
        "/api",
8!
146
        [](const HttpRequest&,
8!
UNCOV
147
           const QueryParams&) -> coro::CoroTask<HttpResponse> {
×
UNCOV
148
            co_return HttpResponse::ok(std::string(viz_api_page_html()),
×
UNCOV
149
                                       "text/html; charset=utf-8");
×
150
        },
×
151
        RouteDoc{"Interactive API explorer (web page).", "Meta", {}, ""});
8!
152

153
    Router* r = &router;
8✔
154
    router.get(
16!
155
        "/api/openapi.json",
8!
156
        [r](const HttpRequest&,
8!
UNCOV
157
            const QueryParams&) -> coro::CoroTask<HttpResponse> {
×
UNCOV
158
            co_return HttpResponse::ok(openapi_json(*r), "application/json");
×
159
        },
×
160
        RouteDoc{"OpenAPI 3.1 specification for this server.", "Meta", {}, ""});
8!
161
}
8✔
162

163
}  // namespace dftracer::utils::server
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc