fix: 支持 L1 Kafka 集群域名解析

This commit is contained in:
root
2026-07-18 08:51:06 +02:00
parent f1597e2b6b
commit c4d8b4a67b
4 changed files with 149 additions and 11 deletions
+4 -2
View File
@@ -827,8 +827,9 @@ test("Kafka Trace render returns a typed partial result when the captured end of
filterRejectedCount: 0,
completionReason: "timeout",
reachedEndOffsets: false,
endOffsetsAvailable: true,
endOffsets: [{ partition: 0, startOffset: "0", endOffset: "2" }],
endOffsetsAvailable: false,
endOffsetsError: { code: "ENOTFOUND", message: "broker metadata hostname unresolved", valuesRedacted: true },
endOffsets: [],
completion: { reason: "timeout", complete: false, barrierReached: false, retentionStartVerified: true },
lastScannedOffsets: [{ partition: 0, offset: "0" }]
};
@@ -836,6 +837,7 @@ test("Kafka Trace render returns a typed partial result when the captured end of
});
assert.equal(result.exitCode, 2);
assert.equal(result.payload.input.endOffsetsError.code, "ENOTFOUND");
assert.equal(result.payload.ok, false);
assert.equal(result.payload.status, "partial");
assert.equal(result.payload.error.code, "source_scan_incomplete");
+14 -4
View File
@@ -12,6 +12,7 @@ import {
DEFAULT_AGENTRUN_EVENT_TOPIC,
DEFAULT_HWLAB_DEBUG_EVENT_TOPIC,
DEFAULT_HWLAB_EVENT_TOPIC,
kafkaSocketFactory,
projectAgentRunKafkaEventToHwlabEvent,
projectAgentRunKafkaMessageToHwlabDebugEvent,
queryKafkaEventStream
@@ -427,6 +428,7 @@ export async function renderHwlabKafkaTrace(parsed: ParsedArgs, dependencies: Re
completionReason: readResult.completionReason ?? null,
reachedEndOffsets: readResult.reachedEndOffsets ?? false,
endOffsetsAvailable: readResult.endOffsetsAvailable ?? false,
endOffsetsError: readResult.endOffsetsError ?? null,
endOffsets: readResult.endOffsets ?? [],
lastScannedOffsets: readResult.lastScannedOffsets ?? [],
sourceFile: readResult.sourceFile ?? null,
@@ -598,6 +600,7 @@ export async function renderHwlabKafkaTrace(parsed: ParsedArgs, dependencies: Re
completionReason: readResult.completionReason ?? (sourceMode === "jsonl" ? "file-end" : null),
reachedEndOffsets: readResult.reachedEndOffsets ?? (sourceMode === "jsonl"),
endOffsetsAvailable: readResult.endOffsetsAvailable ?? false,
endOffsetsError: readResult.endOffsetsError ?? null,
endOffsets: readResult.endOffsets ?? [],
lastScannedOffsets: readResult.lastScannedOffsets ?? [],
sourceFile: readResult.sourceFile ?? null,
@@ -1661,7 +1664,7 @@ function kafkaHelp() {
async function defaultKafkaReader(input: Record<string, any>) {
return withBunKafkaTimerClamp(() => queryKafkaEventStream({
...input,
kafkaFactory(config: { brokers: string[]; clientId: string }) { return boundedKafka(config); }
kafkaFactory(config: { brokers: string[]; clientId: string; dnsServers?: string[]; dnsSearchDomains?: string[] }) { return boundedKafka(config); }
}));
}
@@ -1685,17 +1688,24 @@ async function withBunKafkaTimerClamp<T>(task: () => Promise<T>) {
async function defaultProducerFactory({ env, clientId }: { env: EnvLike; clientId: string }) {
const brokers = csv(env.HWLAB_KAFKA_BOOTSTRAP_SERVERS);
if (brokers.length === 0) throw cliError("kafka_brokers_missing", "HWLAB_KAFKA_BOOTSTRAP_SERVERS is required for Kafka publish", { field: "HWLAB_KAFKA_BOOTSTRAP_SERVERS" });
return boundedKafka({ clientId, brokers }).producer({ allowAutoTopicCreation: false });
return boundedKafka({
clientId,
brokers,
dnsServers: csv(env.HWLAB_KAFKA_DNS_SERVERS),
dnsSearchDomains: csv(env.HWLAB_KAFKA_DNS_SEARCH_DOMAINS)
}).producer({ allowAutoTopicCreation: false });
}
function boundedKafka({ clientId, brokers }: { clientId: string; brokers: string[] }) {
function boundedKafka({ clientId, brokers, dnsServers = [], dnsSearchDomains = [] }: { clientId: string; brokers: string[]; dnsServers?: string[]; dnsSearchDomains?: string[] }) {
const socketFactory = kafkaSocketFactory(dnsServers, dnsSearchDomains);
return new Kafka({
clientId,
brokers,
logLevel: logLevel.NOTHING,
connectionTimeout: 5000,
requestTimeout: 10000,
retry: { retries: 1, maxRetryTime: 10000 }
retry: { retries: 1, maxRetryTime: 10000 },
...(socketFactory ? { socketFactory } : {})
});
}