@clickhouse/client-common 1.20.0 → 1.21.0-head.68dd619.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -11
- package/dist/clickhouse_types.js +6 -6
- package/dist/clickhouse_types.js.map +1 -1
- package/dist/client.d.ts +19 -9
- package/dist/client.js +231 -43
- package/dist/client.js.map +1 -1
- package/dist/config.d.ts +54 -10
- package/dist/config.js +42 -38
- package/dist/config.js.map +1 -1
- package/dist/connection.d.ts +12 -8
- package/dist/data_formatter/format_query_params.js +21 -21
- package/dist/data_formatter/format_query_params.js.map +1 -1
- package/dist/data_formatter/format_query_settings.d.ts +1 -1
- package/dist/data_formatter/format_query_settings.js +4 -4
- package/dist/data_formatter/format_query_settings.js.map +1 -1
- package/dist/data_formatter/formatter.d.ts +2 -2
- package/dist/data_formatter/formatter.js +28 -28
- package/dist/data_formatter/formatter.js.map +1 -1
- package/dist/data_formatter/index.d.ts +3 -3
- package/dist/data_formatter/index.js.map +1 -1
- package/dist/error/error.js +18 -4
- package/dist/error/error.js.map +1 -1
- package/dist/error/index.d.ts +1 -1
- package/dist/error/index.js.map +1 -1
- package/dist/index.d.ts +21 -20
- package/dist/index.js +10 -1
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +29 -14
- package/dist/logger.js +40 -27
- package/dist/logger.js.map +1 -1
- package/dist/parse/column_types.d.ts +10 -10
- package/dist/parse/column_types.js +97 -92
- package/dist/parse/column_types.js.map +1 -1
- package/dist/parse/index.d.ts +2 -2
- package/dist/parse/index.js.map +1 -1
- package/dist/parse/json_handling.js.map +1 -1
- package/dist/result.d.ts +4 -4
- package/dist/settings.d.ts +47 -30
- package/dist/settings.js +1 -1
- package/dist/settings.js.map +1 -1
- package/dist/tracing.d.ts +146 -0
- package/dist/tracing.js +76 -0
- package/dist/tracing.js.map +1 -0
- package/dist/utils/connection.d.ts +1 -1
- package/dist/utils/connection.js +7 -7
- package/dist/utils/connection.js.map +1 -1
- package/dist/utils/index.d.ts +5 -4
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/multipart.d.ts +34 -0
- package/dist/utils/multipart.js +81 -0
- package/dist/utils/multipart.js.map +1 -0
- package/dist/utils/sleep.js.map +1 -1
- package/dist/utils/stream.js +4 -4
- package/dist/utils/stream.js.map +1 -1
- package/dist/utils/url.d.ts +5 -2
- package/dist/utils/url.js +21 -16
- package/dist/utils/url.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -84,23 +84,23 @@ The client may work with older versions too; however, this is best-effort suppor
|
|
|
84
84
|
## Quick start
|
|
85
85
|
|
|
86
86
|
```ts
|
|
87
|
-
import { createClient } from
|
|
87
|
+
import { createClient } from "@clickhouse/client"; // or '@clickhouse/client-web'
|
|
88
88
|
|
|
89
89
|
const client = createClient({
|
|
90
|
-
url: process.env.CLICKHOUSE_URL ??
|
|
91
|
-
username: process.env.CLICKHOUSE_USER ??
|
|
92
|
-
password: process.env.CLICKHOUSE_PASSWORD ??
|
|
93
|
-
})
|
|
90
|
+
url: process.env.CLICKHOUSE_URL ?? "http://localhost:8123",
|
|
91
|
+
username: process.env.CLICKHOUSE_USER ?? "default",
|
|
92
|
+
password: process.env.CLICKHOUSE_PASSWORD ?? "",
|
|
93
|
+
});
|
|
94
94
|
|
|
95
95
|
const resultSet = await client.query({
|
|
96
|
-
query:
|
|
97
|
-
format:
|
|
98
|
-
})
|
|
96
|
+
query: "SELECT * FROM system.tables",
|
|
97
|
+
format: "JSONEachRow",
|
|
98
|
+
});
|
|
99
99
|
|
|
100
|
-
const tables = await resultSet.json()
|
|
101
|
-
console.log(tables)
|
|
100
|
+
const tables = await resultSet.json();
|
|
101
|
+
console.log(tables);
|
|
102
102
|
|
|
103
|
-
await client.close()
|
|
103
|
+
await client.close();
|
|
104
104
|
```
|
|
105
105
|
|
|
106
106
|
See more examples in the [examples directory](./examples).
|
package/dist/clickhouse_types.js
CHANGED
|
@@ -7,24 +7,24 @@ exports.isException = isException;
|
|
|
7
7
|
* @see https://clickhouse.com/docs/interfaces/formats/JSONEachRowWithProgress */
|
|
8
8
|
function isProgressRow(row) {
|
|
9
9
|
return (row !== null &&
|
|
10
|
-
typeof row ===
|
|
11
|
-
|
|
10
|
+
typeof row === "object" &&
|
|
11
|
+
"progress" in row &&
|
|
12
12
|
Object.keys(row).length === 1);
|
|
13
13
|
}
|
|
14
14
|
/** Type guard to use with `JSONEachRowWithProgress`, checking if the emitted row is a row with data.
|
|
15
15
|
* @see https://clickhouse.com/docs/interfaces/formats/JSONEachRowWithProgress */
|
|
16
16
|
function isRow(row) {
|
|
17
17
|
return (row !== null &&
|
|
18
|
-
typeof row ===
|
|
19
|
-
|
|
18
|
+
typeof row === "object" &&
|
|
19
|
+
"row" in row &&
|
|
20
20
|
Object.keys(row).length === 1);
|
|
21
21
|
}
|
|
22
22
|
/** Type guard to use with `JSONEachRowWithProgress`, checking if the row contains an exception.
|
|
23
23
|
* @see https://clickhouse.com/docs/interfaces/formats/JSONEachRowWithProgress */
|
|
24
24
|
function isException(row) {
|
|
25
25
|
return (row !== null &&
|
|
26
|
-
typeof row ===
|
|
27
|
-
|
|
26
|
+
typeof row === "object" &&
|
|
27
|
+
"exception" in row &&
|
|
28
28
|
Object.keys(row).length === 1);
|
|
29
29
|
}
|
|
30
30
|
//# sourceMappingURL=clickhouse_types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clickhouse_types.js","sourceRoot":"","sources":["../src/clickhouse_types.ts"],"names":[],"mappings":";;AAyFA,sCAOC;AAID,sBAOC;AAID,kCAOC;AA/BD;kFACkF;AAClF,SAAgB,aAAa,CAAC,GAAY;IACxC,OAAO,CACL,GAAG,KAAK,IAAI;QACZ,OAAO,GAAG,KAAK,QAAQ;QACvB,UAAU,IAAI,GAAG;QACjB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,CAC9B,
|
|
1
|
+
{"version":3,"file":"clickhouse_types.js","sourceRoot":"","sources":["../src/clickhouse_types.ts"],"names":[],"mappings":";;AAyFA,sCAOC;AAID,sBAOC;AAID,kCAOC;AA/BD;kFACkF;AAClF,SAAgB,aAAa,CAAC,GAAY;IACxC,OAAO,CACL,GAAG,KAAK,IAAI;QACZ,OAAO,GAAG,KAAK,QAAQ;QACvB,UAAU,IAAI,GAAG;QACjB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,CAC9B,CAAC;AACJ,CAAC;AAED;kFACkF;AAClF,SAAgB,KAAK,CAAI,GAAY;IACnC,OAAO,CACL,GAAG,KAAK,IAAI;QACZ,OAAO,GAAG,KAAK,QAAQ;QACvB,KAAK,IAAI,GAAG;QACZ,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,CAC9B,CAAC;AACJ,CAAC;AAED;kFACkF;AAClF,SAAgB,WAAW,CAAC,GAAY;IACtC,OAAO,CACL,GAAG,KAAK,IAAI;QACZ,OAAO,GAAG,KAAK,QAAQ;QACvB,WAAW,IAAI,GAAG;QAClB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,CAC9B,CAAC;AACJ,CAAC"}
|
package/dist/client.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type { BaseClickHouseClientConfigOptions, ClickHouseSettings, ConnExecResult, IsSame, WithClickHouseSummary, WithResponseHeaders, DataFormat } from
|
|
2
|
-
import type { InsertValues, NonEmptyArray, WithHttpStatusCode } from
|
|
3
|
-
import type { ImplementationDetails } from
|
|
4
|
-
import type { ConnPingResult } from
|
|
5
|
-
import type { BaseResultSet } from
|
|
1
|
+
import type { BaseClickHouseClientConfigOptions, ClickHouseSettings, ConnExecResult, IsSame, WithClickHouseSummary, WithResponseHeaders, DataFormat } from "./index";
|
|
2
|
+
import type { InsertValues, NonEmptyArray, WithHttpStatusCode } from "./clickhouse_types";
|
|
3
|
+
import type { ImplementationDetails } from "./config";
|
|
4
|
+
import type { ConnPingResult } from "./connection";
|
|
5
|
+
import type { BaseResultSet } from "./result";
|
|
6
6
|
export interface BaseQueryParams {
|
|
7
7
|
/** ClickHouse's settings that can be applied on query level. */
|
|
8
8
|
clickhouse_settings?: ClickHouseSettings;
|
|
@@ -33,6 +33,14 @@ export interface BaseQueryParams {
|
|
|
33
33
|
* Overrides the headers set in {@link BaseClickHouseClientConfigOptions.http_headers}.
|
|
34
34
|
* @default empty object */
|
|
35
35
|
http_headers?: Record<string, string>;
|
|
36
|
+
/** When defined, overrides {@link BaseClickHouseClientConfigOptions.use_multipart_params}
|
|
37
|
+
* for this particular request.
|
|
38
|
+
* @default undefined (no override) */
|
|
39
|
+
use_multipart_params?: boolean;
|
|
40
|
+
/** When defined, overrides {@link BaseClickHouseClientConfigOptions.use_multipart_params_auto}
|
|
41
|
+
* for this particular request.
|
|
42
|
+
* @default undefined (no override) */
|
|
43
|
+
use_multipart_params_auto?: boolean;
|
|
36
44
|
}
|
|
37
45
|
export interface QueryParams extends BaseQueryParams {
|
|
38
46
|
/** Statement to execute. */
|
|
@@ -41,7 +49,7 @@ export interface QueryParams extends BaseQueryParams {
|
|
|
41
49
|
format?: DataFormat;
|
|
42
50
|
}
|
|
43
51
|
/** Same parameters as {@link QueryParams}, but with `format` field as a type */
|
|
44
|
-
export type QueryParamsWithFormat<Format extends DataFormat> = Omit<QueryParams,
|
|
52
|
+
export type QueryParamsWithFormat<Format extends DataFormat> = Omit<QueryParams, "format"> & {
|
|
45
53
|
format?: Format;
|
|
46
54
|
};
|
|
47
55
|
/** If the Format is not a literal type, fall back to the default behavior of the ResultSet,
|
|
@@ -128,14 +136,14 @@ export interface InsertParams<Stream = unknown, T = unknown> extends BaseQueryPa
|
|
|
128
136
|
* This is the default behavior for the Node.js version. */
|
|
129
137
|
export type PingParamsWithEndpoint = {
|
|
130
138
|
select: false;
|
|
131
|
-
} & Pick<BaseQueryParams,
|
|
139
|
+
} & Pick<BaseQueryParams, "abort_signal" | "http_headers">;
|
|
132
140
|
/** Parameters for the health-check request - using a SELECT query.
|
|
133
141
|
* This is the default behavior for the Web version, as the `/ping` endpoint does not support CORS.
|
|
134
142
|
* Most of the standard `query` method params, e.g., `query_id`, `abort_signal`, `http_headers`, etc. will work,
|
|
135
143
|
* except for `query_params`, which does not make sense to allow in this method. */
|
|
136
144
|
export type PingParamsWithSelectQuery = {
|
|
137
145
|
select: true;
|
|
138
|
-
} & Omit<BaseQueryParams,
|
|
146
|
+
} & Omit<BaseQueryParams, "query_params">;
|
|
139
147
|
export type PingParams = PingParamsWithEndpoint | PingParamsWithSelectQuery;
|
|
140
148
|
export type PingResult = ConnPingResult;
|
|
141
149
|
export declare class ClickHouseClient<Stream = unknown> {
|
|
@@ -147,6 +155,7 @@ export declare class ClickHouseClient<Stream = unknown> {
|
|
|
147
155
|
private readonly sessionId?;
|
|
148
156
|
private readonly role?;
|
|
149
157
|
private readonly jsonHandling;
|
|
158
|
+
private readonly tracer;
|
|
150
159
|
constructor(config: BaseClickHouseClientConfigOptions & ImplementationDetails<Stream>);
|
|
151
160
|
/**
|
|
152
161
|
* Used for most statements that can have a response, such as `SELECT`.
|
|
@@ -165,7 +174,7 @@ export declare class ClickHouseClient<Stream = unknown> {
|
|
|
165
174
|
*
|
|
166
175
|
* See {@link DataFormat} for the formats supported by the client.
|
|
167
176
|
*/
|
|
168
|
-
query<Format extends DataFormat =
|
|
177
|
+
query<Format extends DataFormat = "JSON">(params: QueryParamsWithFormat<Format>): Promise<QueryResult<Stream, Format>>;
|
|
169
178
|
/**
|
|
170
179
|
* It should be used for statements that do not have any output,
|
|
171
180
|
* when the format clause is not applicable, or when you are not interested in the response at all.
|
|
@@ -219,5 +228,6 @@ export declare class ClickHouseClient<Stream = unknown> {
|
|
|
219
228
|
* @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/using
|
|
220
229
|
*/
|
|
221
230
|
[Symbol.asyncDispose](): Promise<void>;
|
|
231
|
+
private withBaseSpanAttributes;
|
|
222
232
|
private withClientQueryParams;
|
|
223
233
|
}
|
package/dist/client.js
CHANGED
|
@@ -4,6 +4,7 @@ exports.ClickHouseClient = void 0;
|
|
|
4
4
|
const parse_1 = require("./parse");
|
|
5
5
|
const logger_1 = require("./logger");
|
|
6
6
|
const config_1 = require("./config");
|
|
7
|
+
const tracing_1 = require("./tracing");
|
|
7
8
|
class ClickHouseClient {
|
|
8
9
|
clientClickHouseSettings;
|
|
9
10
|
connectionParams;
|
|
@@ -13,6 +14,7 @@ class ClickHouseClient {
|
|
|
13
14
|
sessionId;
|
|
14
15
|
role;
|
|
15
16
|
jsonHandling;
|
|
17
|
+
tracer;
|
|
16
18
|
constructor(config) {
|
|
17
19
|
const logger = config?.log?.LoggerClass
|
|
18
20
|
? new config.log.LoggerClass()
|
|
@@ -31,6 +33,9 @@ class ClickHouseClient {
|
|
|
31
33
|
...config.json,
|
|
32
34
|
};
|
|
33
35
|
this.valuesEncoder = config.impl.values_encoder(this.jsonHandling);
|
|
36
|
+
// Assigned once at client creation: when no tracer is configured, the
|
|
37
|
+
// shared no-op tracer keeps the hot path branch-free.
|
|
38
|
+
this.tracer = config.tracer ?? tracing_1.NoopClickHouseTracer;
|
|
34
39
|
}
|
|
35
40
|
/**
|
|
36
41
|
* Used for most statements that can have a response, such as `SELECT`.
|
|
@@ -50,28 +55,67 @@ class ClickHouseClient {
|
|
|
50
55
|
* See {@link DataFormat} for the formats supported by the client.
|
|
51
56
|
*/
|
|
52
57
|
async query(params) {
|
|
53
|
-
const format = params.format ??
|
|
58
|
+
const format = params.format ?? "JSON";
|
|
54
59
|
const query = formatQuery(params.query, format);
|
|
55
60
|
const queryParams = this.withClientQueryParams(params);
|
|
56
|
-
const { stream, query_id, response_headers } = await this.connection.query({
|
|
57
|
-
query,
|
|
58
|
-
...queryParams,
|
|
59
|
-
});
|
|
60
61
|
const { log_writer, log_level } = this.connectionParams;
|
|
61
|
-
return this.
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
62
|
+
return this.tracer.startActiveSpan(tracing_1.ClickHouseSpanNames.query, {
|
|
63
|
+
kind: tracing_1.ClickHouseSpanKind.CLIENT,
|
|
64
|
+
attributes: this.withBaseSpanAttributes({
|
|
65
|
+
"clickhouse.response.format": format,
|
|
66
|
+
"clickhouse.request.query_id": queryParams.query_id,
|
|
67
|
+
"clickhouse.request.session_id": queryParams.session_id,
|
|
68
|
+
}),
|
|
69
|
+
}, async (span) => {
|
|
70
|
+
let queryResult;
|
|
71
|
+
try {
|
|
72
|
+
queryResult = await this.connection.query({
|
|
73
|
+
query,
|
|
74
|
+
...queryParams,
|
|
72
75
|
});
|
|
73
76
|
}
|
|
74
|
-
|
|
77
|
+
catch (err) {
|
|
78
|
+
(0, tracing_1.recordSpanError)(span, err);
|
|
79
|
+
span.end();
|
|
80
|
+
throw err;
|
|
81
|
+
}
|
|
82
|
+
const { stream, query_id, response_headers, http_status_code } = queryResult;
|
|
83
|
+
// The query_id may have been generated by the connection layer.
|
|
84
|
+
span.setAttributes({ "clickhouse.request.query_id": query_id });
|
|
85
|
+
setResponseSpanAttributes(span, { http_status_code });
|
|
86
|
+
// The clickhouse.query span covers the HTTP request lifetime only:
|
|
87
|
+
// it ends here, once response headers are received. A separate
|
|
88
|
+
// clickhouse.query.stream child span is started and handed to the
|
|
89
|
+
// ResultSet to track the response stream consumption (decoded bytes,
|
|
90
|
+
// returned rows, streaming errors). Separating the two spans makes
|
|
91
|
+
// it easy to distinguish the original request duration from a stream
|
|
92
|
+
// that may never end (e.g. tailing a live table).
|
|
93
|
+
span.end();
|
|
94
|
+
return this.tracer.startActiveSpan(tracing_1.ClickHouseSpanNames.query_stream, { kind: tracing_1.ClickHouseSpanKind.CLIENT }, (streamSpan) => {
|
|
95
|
+
try {
|
|
96
|
+
return this.makeResultSet(stream, format, query_id, (err) => {
|
|
97
|
+
if (log_level <= logger_1.ClickHouseLogLevel.ERROR) {
|
|
98
|
+
log_writer.error({
|
|
99
|
+
err,
|
|
100
|
+
module: "Client",
|
|
101
|
+
message: "Error while processing the ResultSet.",
|
|
102
|
+
args: {
|
|
103
|
+
session_id: queryParams.session_id,
|
|
104
|
+
role: queryParams.role,
|
|
105
|
+
query_id,
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
}, response_headers, this.jsonHandling, streamSpan);
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
(0, tracing_1.recordSpanError)(streamSpan, err);
|
|
113
|
+
streamSpan.end();
|
|
114
|
+
throw err;
|
|
115
|
+
}
|
|
116
|
+
// streamSpan is NOT ended here - the ResultSet owns its lifetime.
|
|
117
|
+
});
|
|
118
|
+
});
|
|
75
119
|
}
|
|
76
120
|
/**
|
|
77
121
|
* It should be used for statements that do not have any output,
|
|
@@ -86,10 +130,32 @@ class ClickHouseClient {
|
|
|
86
130
|
const query = removeTrailingSemi(params.query.trim());
|
|
87
131
|
const ignore_error_response = params.ignore_error_response ?? false;
|
|
88
132
|
const queryParams = this.withClientQueryParams(params);
|
|
89
|
-
return
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
133
|
+
return this.tracer.startActiveSpan(tracing_1.ClickHouseSpanNames.command, {
|
|
134
|
+
kind: tracing_1.ClickHouseSpanKind.CLIENT,
|
|
135
|
+
attributes: this.withBaseSpanAttributes({
|
|
136
|
+
"clickhouse.request.query_id": queryParams.query_id,
|
|
137
|
+
"clickhouse.request.session_id": queryParams.session_id,
|
|
138
|
+
}),
|
|
139
|
+
}, async (span) => {
|
|
140
|
+
try {
|
|
141
|
+
const result = await this.connection.command({
|
|
142
|
+
query,
|
|
143
|
+
ignore_error_response,
|
|
144
|
+
...queryParams,
|
|
145
|
+
});
|
|
146
|
+
span.setAttributes({
|
|
147
|
+
"clickhouse.request.query_id": result.query_id,
|
|
148
|
+
});
|
|
149
|
+
setResponseSpanAttributes(span, result);
|
|
150
|
+
return result;
|
|
151
|
+
}
|
|
152
|
+
catch (err) {
|
|
153
|
+
(0, tracing_1.recordSpanError)(span, err);
|
|
154
|
+
throw err;
|
|
155
|
+
}
|
|
156
|
+
finally {
|
|
157
|
+
span.end();
|
|
158
|
+
}
|
|
93
159
|
});
|
|
94
160
|
}
|
|
95
161
|
/**
|
|
@@ -102,16 +168,38 @@ class ClickHouseClient {
|
|
|
102
168
|
*/
|
|
103
169
|
async exec(params) {
|
|
104
170
|
const query = removeTrailingSemi(params.query.trim());
|
|
105
|
-
const values =
|
|
171
|
+
const values = "values" in params ? params.values : undefined;
|
|
106
172
|
const decompress_response_stream = params.decompress_response_stream ?? true;
|
|
107
173
|
const ignore_error_response = params.ignore_error_response ?? false;
|
|
108
174
|
const queryParams = this.withClientQueryParams(params);
|
|
109
|
-
return
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
175
|
+
return this.tracer.startActiveSpan(tracing_1.ClickHouseSpanNames.exec, {
|
|
176
|
+
kind: tracing_1.ClickHouseSpanKind.CLIENT,
|
|
177
|
+
attributes: this.withBaseSpanAttributes({
|
|
178
|
+
"clickhouse.request.query_id": queryParams.query_id,
|
|
179
|
+
"clickhouse.request.session_id": queryParams.session_id,
|
|
180
|
+
}),
|
|
181
|
+
}, async (span) => {
|
|
182
|
+
try {
|
|
183
|
+
const result = await this.connection.exec({
|
|
184
|
+
query,
|
|
185
|
+
values,
|
|
186
|
+
decompress_response_stream,
|
|
187
|
+
ignore_error_response,
|
|
188
|
+
...queryParams,
|
|
189
|
+
});
|
|
190
|
+
span.setAttributes({
|
|
191
|
+
"clickhouse.request.query_id": result.query_id,
|
|
192
|
+
});
|
|
193
|
+
setResponseSpanAttributes(span, result);
|
|
194
|
+
return result;
|
|
195
|
+
}
|
|
196
|
+
catch (err) {
|
|
197
|
+
(0, tracing_1.recordSpanError)(span, err);
|
|
198
|
+
throw err;
|
|
199
|
+
}
|
|
200
|
+
finally {
|
|
201
|
+
span.end();
|
|
202
|
+
}
|
|
115
203
|
});
|
|
116
204
|
}
|
|
117
205
|
/**
|
|
@@ -125,18 +213,55 @@ class ClickHouseClient {
|
|
|
125
213
|
*/
|
|
126
214
|
async insert(params) {
|
|
127
215
|
if (Array.isArray(params.values) && params.values.length === 0) {
|
|
128
|
-
return { executed: false, query_id:
|
|
216
|
+
return { executed: false, query_id: "", response_headers: {} };
|
|
129
217
|
}
|
|
130
|
-
const format = params.format ||
|
|
218
|
+
const format = params.format || "JSONCompactEachRow";
|
|
131
219
|
this.valuesEncoder.validateInsertValues(params.values, format);
|
|
132
220
|
const query = getInsertQuery(params, format);
|
|
133
221
|
const queryParams = this.withClientQueryParams(params);
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
222
|
+
return this.tracer.startActiveSpan(tracing_1.ClickHouseSpanNames.insert, {
|
|
223
|
+
kind: tracing_1.ClickHouseSpanKind.CLIENT,
|
|
224
|
+
attributes: this.withBaseSpanAttributes({
|
|
225
|
+
"db.operation.name": "INSERT",
|
|
226
|
+
"db.collection.name": params.table,
|
|
227
|
+
"clickhouse.request.format": format,
|
|
228
|
+
"clickhouse.request.query_id": queryParams.query_id,
|
|
229
|
+
"clickhouse.request.session_id": queryParams.session_id,
|
|
230
|
+
// Only known up front for array-based inserts; for streamed
|
|
231
|
+
// inserts, the row count is not observable by the client.
|
|
232
|
+
"clickhouse.request.sent_rows": Array.isArray(params.values)
|
|
233
|
+
? params.values.length
|
|
234
|
+
: undefined,
|
|
235
|
+
}),
|
|
236
|
+
}, async (span) => {
|
|
237
|
+
try {
|
|
238
|
+
const values = this.valuesEncoder.encodeValues(params.values, format);
|
|
239
|
+
// TODO: record `clickhouse.request.encoded_bytes` (the
|
|
240
|
+
// pre-compression request body size) here. This is a
|
|
241
|
+
// post-common-deprecation feature: once `client-common` is
|
|
242
|
+
// deprecated and the Node.js / Web clients are fully independent,
|
|
243
|
+
// each client can measure the encoded payload using its own
|
|
244
|
+
// platform-native byte-length primitive (e.g. `Buffer.byteLength`)
|
|
245
|
+
// instead of a hand-rolled common implementation.
|
|
246
|
+
const result = await this.connection.insert({
|
|
247
|
+
query,
|
|
248
|
+
values,
|
|
249
|
+
...queryParams,
|
|
250
|
+
});
|
|
251
|
+
span.setAttributes({
|
|
252
|
+
"clickhouse.request.query_id": result.query_id,
|
|
253
|
+
});
|
|
254
|
+
setResponseSpanAttributes(span, result);
|
|
255
|
+
return { ...result, executed: true };
|
|
256
|
+
}
|
|
257
|
+
catch (err) {
|
|
258
|
+
(0, tracing_1.recordSpanError)(span, err);
|
|
259
|
+
throw err;
|
|
260
|
+
}
|
|
261
|
+
finally {
|
|
262
|
+
span.end();
|
|
263
|
+
}
|
|
138
264
|
});
|
|
139
|
-
return { ...result, executed: true };
|
|
140
265
|
}
|
|
141
266
|
/**
|
|
142
267
|
* A health-check request. It does not throw if an error occurs - the error is returned inside the result object.
|
|
@@ -148,7 +273,24 @@ class ClickHouseClient {
|
|
|
148
273
|
* **NOTE**: Since the `/ping` endpoint does not support CORS, the Web version always uses a `SELECT` query.
|
|
149
274
|
*/
|
|
150
275
|
async ping(params) {
|
|
151
|
-
|
|
276
|
+
const select = params?.select ?? false;
|
|
277
|
+
return this.tracer.startActiveSpan(tracing_1.ClickHouseSpanNames.ping, {
|
|
278
|
+
kind: tracing_1.ClickHouseSpanKind.CLIENT,
|
|
279
|
+
attributes: this.withBaseSpanAttributes({
|
|
280
|
+
"clickhouse.ping.select": select,
|
|
281
|
+
}),
|
|
282
|
+
}, async (span) => {
|
|
283
|
+
try {
|
|
284
|
+
return await this.connection.ping(params ?? { select: false });
|
|
285
|
+
}
|
|
286
|
+
catch (err) {
|
|
287
|
+
(0, tracing_1.recordSpanError)(span, err);
|
|
288
|
+
throw err;
|
|
289
|
+
}
|
|
290
|
+
finally {
|
|
291
|
+
span.end();
|
|
292
|
+
}
|
|
293
|
+
});
|
|
152
294
|
}
|
|
153
295
|
/**
|
|
154
296
|
* Shuts down the underlying connection.
|
|
@@ -168,6 +310,23 @@ class ClickHouseClient {
|
|
|
168
310
|
async [Symbol.asyncDispose]() {
|
|
169
311
|
await this.close();
|
|
170
312
|
}
|
|
313
|
+
withBaseSpanAttributes(extra) {
|
|
314
|
+
const url = this.connectionParams.url;
|
|
315
|
+
const attrs = {
|
|
316
|
+
"db.system.name": "clickhouse",
|
|
317
|
+
"server.address": url.hostname,
|
|
318
|
+
"server.port": getServerPort(url),
|
|
319
|
+
"db.namespace": this.connectionParams.database,
|
|
320
|
+
};
|
|
321
|
+
if (this.connectionParams.application_id !== undefined) {
|
|
322
|
+
attrs["clickhouse.application"] = this.connectionParams.application_id;
|
|
323
|
+
}
|
|
324
|
+
for (const [k, v] of Object.entries(extra)) {
|
|
325
|
+
if (v !== undefined)
|
|
326
|
+
attrs[k] = v;
|
|
327
|
+
}
|
|
328
|
+
return attrs;
|
|
329
|
+
}
|
|
171
330
|
withClientQueryParams(params) {
|
|
172
331
|
return {
|
|
173
332
|
clickhouse_settings: {
|
|
@@ -181,19 +340,48 @@ class ClickHouseClient {
|
|
|
181
340
|
role: params.role ?? this.role,
|
|
182
341
|
auth: params.auth,
|
|
183
342
|
http_headers: params.http_headers,
|
|
343
|
+
use_multipart_params: params.use_multipart_params,
|
|
344
|
+
use_multipart_params_auto: params.use_multipart_params_auto,
|
|
184
345
|
};
|
|
185
346
|
}
|
|
186
347
|
}
|
|
187
348
|
exports.ClickHouseClient = ClickHouseClient;
|
|
349
|
+
function getServerPort(url) {
|
|
350
|
+
if (url.port !== "") {
|
|
351
|
+
return Number(url.port);
|
|
352
|
+
}
|
|
353
|
+
return url.protocol === "https:" ? 443 : 80;
|
|
354
|
+
}
|
|
355
|
+
/** Records HTTP status and `X-ClickHouse-Summary` counters on the span once
|
|
356
|
+
* the response (headers) arrived. The summary values are complete only when
|
|
357
|
+
* the query was executed with `wait_end_of_query=1`; see
|
|
358
|
+
* {@link ClickHouseSummary}. */
|
|
359
|
+
function setResponseSpanAttributes(span, result) {
|
|
360
|
+
const attributes = {};
|
|
361
|
+
if (result.http_status_code !== undefined) {
|
|
362
|
+
attributes["db.response.status_code"] = result.http_status_code;
|
|
363
|
+
}
|
|
364
|
+
const summary = result.summary;
|
|
365
|
+
if (summary !== undefined) {
|
|
366
|
+
attributes["clickhouse.summary.read_rows"] = summary.read_rows;
|
|
367
|
+
attributes["clickhouse.summary.read_bytes"] = summary.read_bytes;
|
|
368
|
+
attributes["clickhouse.summary.written_rows"] = summary.written_rows;
|
|
369
|
+
attributes["clickhouse.summary.written_bytes"] = summary.written_bytes;
|
|
370
|
+
attributes["clickhouse.summary.result_rows"] = summary.result_rows;
|
|
371
|
+
attributes["clickhouse.summary.result_bytes"] = summary.result_bytes;
|
|
372
|
+
attributes["clickhouse.summary.elapsed_ns"] = summary.elapsed_ns;
|
|
373
|
+
}
|
|
374
|
+
span.setAttributes(attributes);
|
|
375
|
+
}
|
|
188
376
|
function formatQuery(query, format) {
|
|
189
377
|
query = query.trim();
|
|
190
378
|
query = removeTrailingSemi(query);
|
|
191
|
-
return query +
|
|
379
|
+
return query + " \nFORMAT " + format;
|
|
192
380
|
}
|
|
193
381
|
function removeTrailingSemi(query) {
|
|
194
382
|
let lastNonSemiIdx = query.length;
|
|
195
383
|
for (let i = lastNonSemiIdx; i > 0; i--) {
|
|
196
|
-
if (query[i - 1] !==
|
|
384
|
+
if (query[i - 1] !== ";") {
|
|
197
385
|
lastNonSemiIdx = i;
|
|
198
386
|
break;
|
|
199
387
|
}
|
|
@@ -206,19 +394,19 @@ function removeTrailingSemi(query) {
|
|
|
206
394
|
function isInsertColumnsExcept(obj) {
|
|
207
395
|
return (obj !== undefined &&
|
|
208
396
|
obj !== null &&
|
|
209
|
-
typeof obj ===
|
|
397
|
+
typeof obj === "object" &&
|
|
210
398
|
// Avoiding ESLint no-prototype-builtins error
|
|
211
|
-
Object.prototype.hasOwnProperty.call(obj,
|
|
399
|
+
Object.prototype.hasOwnProperty.call(obj, "except"));
|
|
212
400
|
}
|
|
213
401
|
function getInsertQuery(params, format) {
|
|
214
|
-
let columnsPart =
|
|
402
|
+
let columnsPart = "";
|
|
215
403
|
if (params.columns !== undefined) {
|
|
216
404
|
if (Array.isArray(params.columns) && params.columns.length > 0) {
|
|
217
|
-
columnsPart = ` (${params.columns.join(
|
|
405
|
+
columnsPart = ` (${params.columns.join(", ")})`;
|
|
218
406
|
}
|
|
219
407
|
else if (isInsertColumnsExcept(params.columns) &&
|
|
220
408
|
params.columns.except.length > 0) {
|
|
221
|
-
columnsPart = ` (* EXCEPT (${params.columns.except.join(
|
|
409
|
+
columnsPart = ` (* EXCEPT (${params.columns.except.join(", ")}))`;
|
|
222
410
|
}
|
|
223
411
|
}
|
|
224
412
|
return `INSERT INTO ${params.table.trim()}${columnsPart} FORMAT ${format}`;
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|