feat(syslog-serve): 优化微步5秒窗口与5万条日志采集
- 将 API 拉取任务的 lookbackSeconds 通用默认值调整为 0 - 微步任务采用5秒时间窗口、50000条单窗口上限和64MiB响应保护 - 将微步适配器及管理接口的 pageSize 上限放宽至50000 - 将 API 调度扫描默认周期调整为1000毫秒 - 兼容新旧调度扫描环境变量名称 - 更新达梦数据库 PAGE_SIZE 约束及 LOOKBACK_SECONDS 默认值 - 补充 v6 数据库预检、升级和验证脚本 - 更新微步任务模板、现场操作说明和启动版本标识 - 增加配置边界及启动参数自动化测试 验证: - JDK 8 Maven测试通过:167个,失败0,错误0,跳过2 - git diff --check通过
This commit is contained in:
+2
-1
@@ -12,7 +12,7 @@ import org.springframework.stereotype.Component;
|
|||||||
public class SyslogBuildStartupLogger {
|
public class SyslogBuildStartupLogger {
|
||||||
|
|
||||||
// 确认 JAR 包含设备级采集模式、API 拉取、探针归属过滤、微步全量查询及诊断接口。
|
// 确认 JAR 包含设备级采集模式、API 拉取、探针归属过滤、微步全量查询及诊断接口。
|
||||||
static final String CODE_REVISION = "WEIBU_DIAGNOSTIC_V20260917_66";
|
static final String CODE_REVISION = "WEIBU_5S_50000_SCAN1S_V20260917_70";
|
||||||
private final Environment environment;
|
private final Environment environment;
|
||||||
|
|
||||||
public SyslogBuildStartupLogger(Environment environment) {
|
public SyslogBuildStartupLogger(Environment environment) {
|
||||||
@@ -32,6 +32,7 @@ public class SyslogBuildStartupLogger {
|
|||||||
+ ", contextPath=" + value("server.servlet.context-path", "/syslogserve")
|
+ ", contextPath=" + value("server.servlet.context-path", "/syslogserve")
|
||||||
+ ", syslogEnabled=" + value("syslog.server.enabled", "true")
|
+ ", syslogEnabled=" + value("syslog.server.enabled", "true")
|
||||||
+ ", apiPullEnabled=" + value("device.api.enabled", "true")
|
+ ", apiPullEnabled=" + value("device.api.enabled", "true")
|
||||||
|
+ ", apiSchedulerScanIntervalMs=" + value("device.api.scheduler.scan-interval-ms", "1000")
|
||||||
+ ", apiTlsVerifyEnabled=" + value("device.api.tls-verify-enabled", "false")
|
+ ", apiTlsVerifyEnabled=" + value("device.api.tls-verify-enabled", "false")
|
||||||
+ ", apiHostAllowlistEnabled=" + value("device.api.host-allowlist-enabled", "false")
|
+ ", apiHostAllowlistEnabled=" + value("device.api.host-allowlist-enabled", "false")
|
||||||
+ ", walEnabled=" + value("syslog.wal.enabled", "true")
|
+ ", walEnabled=" + value("syslog.wal.enabled", "true")
|
||||||
|
|||||||
+1
-1
@@ -19,7 +19,7 @@ public class ApiPullProperties {
|
|||||||
@Value("${device.api.scheduler.instance-id:${HOSTNAME:local}-${random.uuid}}")
|
@Value("${device.api.scheduler.instance-id:${HOSTNAME:local}-${random.uuid}}")
|
||||||
private String instanceId;
|
private String instanceId;
|
||||||
|
|
||||||
@Value("${device.api.scheduler.scan-interval-ms:5000}")
|
@Value("${device.api.scheduler.scan-interval-ms:1000}")
|
||||||
private long scanIntervalMs;
|
private long scanIntervalMs;
|
||||||
|
|
||||||
@Value("${device.api.scheduler.lease-seconds:120}")
|
@Value("${device.api.scheduler.lease-seconds:120}")
|
||||||
|
|||||||
+1
-1
@@ -79,7 +79,7 @@ public class ApiPullScheduler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** 扫描到期任务;总开关关闭时不查询数据库,也不创建任何设备请求。 */
|
/** 扫描到期任务;总开关关闭时不查询数据库,也不创建任何设备请求。 */
|
||||||
@Scheduled(fixedDelayString = "${device.api.scheduler.scan-interval-ms:5000}")
|
@Scheduled(fixedDelayString = "${device.api.scheduler.scan-interval-ms:1000}")
|
||||||
public void scan() {
|
public void scan() {
|
||||||
if (!properties.isEnabled()) return;
|
if (!properties.isEnabled()) return;
|
||||||
for (DeviceCollectApiConfig c
|
for (DeviceCollectApiConfig c
|
||||||
|
|||||||
+6
-4
@@ -65,9 +65,9 @@ import org.springframework.stereotype.Component;
|
|||||||
* Runner 先读取响应 {@code total},当窗口内总数超过 {@code pageSize} 时只丢弃探测响应并继续缩小
|
* Runner 先读取响应 {@code total},当窗口内总数超过 {@code pageSize} 时只丢弃探测响应并继续缩小
|
||||||
* 时间窗口,直到单次响应能够完整返回。最小一秒窗口仍超限时失败且不推进 checkpoint。
|
* 时间窗口,直到单次响应能够完整返回。最小一秒窗口仍超限时失败且不推进 checkpoint。
|
||||||
*
|
*
|
||||||
* <p>externalEventId 使用厂商日志 {@code id},事件时间使用 {@code time}。事件 ID 只由任务命名空间
|
* <p>externalEventId 使用厂商日志 {@code id},事件时间使用 {@code time}。通用配置默认
|
||||||
* 和厂商稳定 ID 生成,lookback 重叠查询不会制造新事件版本。适配器不把 API JSON 伪装成 Syslog,
|
* {@code lookbackSeconds=0};确有迟到补偿需求的任务可以显式配置正数。适配器不把 API JSON
|
||||||
* 业务字段标准化由下游针对 API 的泛化规则完成。
|
* 伪装成 Syslog,业务字段标准化由下游针对 API 的泛化规则完成。
|
||||||
*/
|
*/
|
||||||
@Component
|
@Component
|
||||||
public class WeibuApiAdapter implements ApiPullAdapter {
|
public class WeibuApiAdapter implements ApiPullAdapter {
|
||||||
@@ -163,7 +163,9 @@ public class WeibuApiAdapter implements ApiPullAdapter {
|
|||||||
public void validateConfig(DeviceCollectApiConfig c) {
|
public void validateConfig(DeviceCollectApiConfig c) {
|
||||||
if (c == null || !TYPE.equals(c.getAdapterType())) fail("CONFIG_SCHEMA_ERROR");
|
if (c == null || !TYPE.equals(c.getAdapterType())) fail("CONFIG_SCHEMA_ERROR");
|
||||||
if (!LOG.equals(c.getStreamKey())) fail("STREAM_NOT_SUPPORTED");
|
if (!LOG.equals(c.getStreamKey())) fail("STREAM_NOT_SUPPORTED");
|
||||||
range(c.getPageSize(), 1, 1000);
|
// 现场微步 searchBySql 的 size 参数支持到 50000。接口没有可靠分页游标,
|
||||||
|
// 因此 pageSize 表示单个时间窗口允许完整取回的硬上限。
|
||||||
|
range(c.getPageSize(), 1, 50000);
|
||||||
if (c.getMaxPagesPerRun() == null || c.getMaxPagesPerRun() != 1)
|
if (c.getMaxPagesPerRun() == null || c.getMaxPagesPerRun() != 1)
|
||||||
fail("CONFIG_SCHEMA_ERROR");
|
fail("CONFIG_SCHEMA_ERROR");
|
||||||
range(c.getPollIntervalSeconds(), 1, 86400);
|
range(c.getPollIntervalSeconds(), 1, 86400);
|
||||||
|
|||||||
+3
-3
@@ -51,7 +51,7 @@ public final class ApiPullDtos {
|
|||||||
private Integer pollIntervalSeconds = 10;
|
private Integer pollIntervalSeconds = 10;
|
||||||
|
|
||||||
@Min(1)
|
@Min(1)
|
||||||
@Max(10000)
|
@Max(50000)
|
||||||
private Integer pageSize = 100;
|
private Integer pageSize = 100;
|
||||||
|
|
||||||
@Min(1)
|
@Min(1)
|
||||||
@@ -80,7 +80,7 @@ public final class ApiPullDtos {
|
|||||||
|
|
||||||
@Min(0)
|
@Min(0)
|
||||||
@Max(1209600)
|
@Max(1209600)
|
||||||
private Integer lookbackSeconds = 300;
|
private Integer lookbackSeconds = 0;
|
||||||
|
|
||||||
@Min(1024)
|
@Min(1024)
|
||||||
@Max(268435456)
|
@Max(268435456)
|
||||||
@@ -113,7 +113,7 @@ public final class ApiPullDtos {
|
|||||||
private Integer pollIntervalSeconds;
|
private Integer pollIntervalSeconds;
|
||||||
|
|
||||||
@Min(1)
|
@Min(1)
|
||||||
@Max(10000)
|
@Max(50000)
|
||||||
private Integer pageSize;
|
private Integer pageSize;
|
||||||
|
|
||||||
@Min(1)
|
@Min(1)
|
||||||
|
|||||||
@@ -131,7 +131,8 @@ mybatis.configuration.map-underscore-to-camel-case=true
|
|||||||
device.api.enabled=${DEVICE_API_ENABLED:true}
|
device.api.enabled=${DEVICE_API_ENABLED:true}
|
||||||
# 设备 AppKey/AppSecret 由 device_collect_api_credential 表管理,配置文件不再保存厂商凭据。
|
# 设备 AppKey/AppSecret 由 device_collect_api_credential 表管理,配置文件不再保存厂商凭据。
|
||||||
device.api.scheduler.instance-id=${DEVICE_API_INSTANCE_ID:${HOSTNAME:local}}
|
device.api.scheduler.instance-id=${DEVICE_API_INSTANCE_ID:${HOSTNAME:local}}
|
||||||
device.api.scheduler.scan-interval-ms=${DEVICE_API_SCAN_INTERVAL_MS:1000}
|
# 新名称与 Spring 属性一致;继续兼容旧环境变量 DEVICE_API_SCAN_INTERVAL_MS。
|
||||||
|
device.api.scheduler.scan-interval-ms=${DEVICE_API_SCHEDULER_SCAN_INTERVAL_MS:${DEVICE_API_SCAN_INTERVAL_MS:1000}}
|
||||||
device.api.scheduler.lease-seconds=${DEVICE_API_LEASE_SECONDS:120}
|
device.api.scheduler.lease-seconds=${DEVICE_API_LEASE_SECONDS:120}
|
||||||
# 同一任务页内严格串行;不同设备可并发。同一设备主机默认仅一个在途请求。
|
# 同一任务页内严格串行;不同设备可并发。同一设备主机默认仅一个在途请求。
|
||||||
device.api.scheduler.global-concurrency=${DEVICE_API_GLOBAL_CONCURRENCY:4}
|
device.api.scheduler.global-concurrency=${DEVICE_API_GLOBAL_CONCURRENCY:4}
|
||||||
|
|||||||
+3
@@ -16,6 +16,7 @@ class SyslogBuildStartupLoggerTest {
|
|||||||
void logsCodeRevisionAndEffectiveOverrides() {
|
void logsCodeRevisionAndEffectiveOverrides() {
|
||||||
MockEnvironment environment = new MockEnvironment()
|
MockEnvironment environment = new MockEnvironment()
|
||||||
.withProperty("device.api.enabled", "false")
|
.withProperty("device.api.enabled", "false")
|
||||||
|
.withProperty("device.api.scheduler.scan-interval-ms", "1000")
|
||||||
.withProperty("device.api.tls-verify-enabled", "true")
|
.withProperty("device.api.tls-verify-enabled", "true")
|
||||||
.withProperty("app.service.device_collect_id", "40")
|
.withProperty("app.service.device_collect_id", "40")
|
||||||
.withProperty("spring.kafka.producer.topic", "prod-syslog");
|
.withProperty("spring.kafka.producer.topic", "prod-syslog");
|
||||||
@@ -34,6 +35,7 @@ class SyslogBuildStartupLoggerTest {
|
|||||||
assertTrue(message.contains("application=syslog-serve"));
|
assertTrue(message.contains("application=syslog-serve"));
|
||||||
assertTrue(message.contains("profiles=prod"));
|
assertTrue(message.contains("profiles=prod"));
|
||||||
assertTrue(message.contains("apiPullEnabled=false"));
|
assertTrue(message.contains("apiPullEnabled=false"));
|
||||||
|
assertTrue(message.contains("apiSchedulerScanIntervalMs=1000"));
|
||||||
assertTrue(message.contains("apiTlsVerifyEnabled=true"));
|
assertTrue(message.contains("apiTlsVerifyEnabled=true"));
|
||||||
assertTrue(message.contains("deviceCollectId=40"));
|
assertTrue(message.contains("deviceCollectId=40"));
|
||||||
assertTrue(message.contains("kafkaTopic=prod-syslog"));
|
assertTrue(message.contains("kafkaTopic=prod-syslog"));
|
||||||
@@ -51,6 +53,7 @@ class SyslogBuildStartupLoggerTest {
|
|||||||
assertFalse(summary.contains("codeRevision=fake"));
|
assertFalse(summary.contains("codeRevision=fake"));
|
||||||
assertTrue(summary.contains("syslogEnabled=true"));
|
assertTrue(summary.contains("syslogEnabled=true"));
|
||||||
assertTrue(summary.contains("apiPullEnabled=true"));
|
assertTrue(summary.contains("apiPullEnabled=true"));
|
||||||
|
assertTrue(summary.contains("apiSchedulerScanIntervalMs=1000"));
|
||||||
assertTrue(summary.contains("apiTlsVerifyEnabled=false"));
|
assertTrue(summary.contains("apiTlsVerifyEnabled=false"));
|
||||||
assertTrue(summary.contains("walEnabled=true"));
|
assertTrue(summary.contains("walEnabled=true"));
|
||||||
}
|
}
|
||||||
|
|||||||
+13
@@ -8,6 +8,7 @@ import com.haobang.apipull.api.ApiPullDtos.ApiPullTaskResponse;
|
|||||||
import com.haobang.apipull.api.ApiPullDtos.CreateApiPullTaskRequest;
|
import com.haobang.apipull.api.ApiPullDtos.CreateApiPullTaskRequest;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
import javax.validation.constraints.Max;
|
||||||
import org.apache.ibatis.builder.xml.XMLMapperBuilder;
|
import org.apache.ibatis.builder.xml.XMLMapperBuilder;
|
||||||
import org.apache.ibatis.session.Configuration;
|
import org.apache.ibatis.session.Configuration;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
@@ -37,6 +38,18 @@ class ApiPullContractTest {
|
|||||||
.readValue(body, CreateApiPullTaskRequest.class));
|
.readValue(body, CreateApiPullTaskRequest.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void newApiPullTaskDefaultsLookbackToZero() {
|
||||||
|
assertEquals(0, new CreateApiPullTaskRequest().getLookbackSeconds());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void managementDtoAllowsWeibuFiftyThousandRecordWindow() throws Exception {
|
||||||
|
Max max = CreateApiPullTaskRequest.class.getDeclaredField("pageSize").getAnnotation(Max.class);
|
||||||
|
assertNotNull(max);
|
||||||
|
assertEquals(50000L, max.value());
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void mybatisMapperXmlIsSyntacticallyValidAndBindsEveryStatement() throws Exception {
|
void mybatisMapperXmlIsSyntacticallyValidAndBindsEveryStatement() throws Exception {
|
||||||
Configuration configuration = new Configuration();
|
Configuration configuration = new Configuration();
|
||||||
|
|||||||
+11
-1
@@ -251,6 +251,16 @@ class WeibuApiAdapterTest {
|
|||||||
assertThrows(AdapterException.class, () -> unpaged.pull(0L)).getCode());
|
assertThrows(AdapterException.class, () -> unpaged.pull(0L)).getCode());
|
||||||
verifyNoInteractions(unpaged.http);
|
verifyNoInteractions(unpaged.http);
|
||||||
|
|
||||||
|
Fixture capacity = new Fixture();
|
||||||
|
capacity.config.setPageSize(50000);
|
||||||
|
capacity.adapter.validateConfig(capacity.config);
|
||||||
|
capacity.config.setPageSize(50001);
|
||||||
|
assertEquals(
|
||||||
|
"CONFIG_SCHEMA_ERROR",
|
||||||
|
assertThrows(AdapterException.class, () -> capacity.adapter.validateConfig(capacity.config))
|
||||||
|
.getCode());
|
||||||
|
verifyNoInteractions(capacity.http);
|
||||||
|
|
||||||
Fixture incident = new Fixture();
|
Fixture incident = new Fixture();
|
||||||
incident.config.setStreamKey("WEIBU_INCIDENT");
|
incident.config.setStreamKey("WEIBU_INCIDENT");
|
||||||
assertEquals(
|
assertEquals(
|
||||||
@@ -297,7 +307,7 @@ class WeibuApiAdapterTest {
|
|||||||
c.setRequestTimeoutMs(3000);
|
c.setRequestTimeoutMs(3000);
|
||||||
c.setWindowSizeSeconds(3600);
|
c.setWindowSizeSeconds(3600);
|
||||||
c.setSafetyDelaySeconds(120);
|
c.setSafetyDelaySeconds(120);
|
||||||
c.setLookbackSeconds(300);
|
c.setLookbackSeconds(0);
|
||||||
c.setMaxResponseBytes(1024 * 1024L);
|
c.setMaxResponseBytes(1024 * 1024L);
|
||||||
c.setExtraConfigJson("{}");
|
c.setExtraConfigJson("{}");
|
||||||
return c;
|
return c;
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ DEVICE_API_ENABLED=false
|
|||||||
# 只允许经过批准的设备域名或 IP,多个值使用英文逗号分隔。
|
# 只允许经过批准的设备域名或 IP,多个值使用英文逗号分隔。
|
||||||
DEVICE_API_ALLOWED_HOSTS=<ndr.example.com>
|
DEVICE_API_ALLOWED_HOSTS=<ndr.example.com>
|
||||||
DEVICE_API_INSTANCE_ID=<当前实例稳定标识>
|
DEVICE_API_INSTANCE_ID=<当前实例稳定标识>
|
||||||
DEVICE_API_SCAN_INTERVAL_MS=5000
|
DEVICE_API_SCHEDULER_SCAN_INTERVAL_MS=1000
|
||||||
DEVICE_API_LEASE_SECONDS=120
|
DEVICE_API_LEASE_SECONDS=120
|
||||||
DEVICE_API_GLOBAL_CONCURRENCY=4
|
DEVICE_API_GLOBAL_CONCURRENCY=4
|
||||||
DEVICE_API_PER_HOST_CONCURRENCY=1
|
DEVICE_API_PER_HOST_CONCURRENCY=1
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ CREATE TABLE device_collect_api_config (
|
|||||||
request_timeout_ms INTEGER DEFAULT 30000 NOT NULL,
|
request_timeout_ms INTEGER DEFAULT 30000 NOT NULL,
|
||||||
window_size_seconds INTEGER DEFAULT 60 NOT NULL,
|
window_size_seconds INTEGER DEFAULT 60 NOT NULL,
|
||||||
safety_delay_seconds INTEGER DEFAULT 120 NOT NULL,
|
safety_delay_seconds INTEGER DEFAULT 120 NOT NULL,
|
||||||
lookback_seconds INTEGER DEFAULT 300 NOT NULL,
|
lookback_seconds INTEGER DEFAULT 0 NOT NULL,
|
||||||
max_response_bytes BIGINT DEFAULT 16777216 NOT NULL,
|
max_response_bytes BIGINT DEFAULT 16777216 NOT NULL,
|
||||||
initial_start_time TIMESTAMP NOT NULL,
|
initial_start_time TIMESTAMP NOT NULL,
|
||||||
extra_config_json CLOB NOT NULL,
|
extra_config_json CLOB NOT NULL,
|
||||||
@@ -66,7 +66,7 @@ CREATE TABLE device_collect_api_config (
|
|||||||
CONSTRAINT ck_dc_api_cfg_enabled CHECK(enabled IN (0,1)),
|
CONSTRAINT ck_dc_api_cfg_enabled CHECK(enabled IN (0,1)),
|
||||||
CONSTRAINT ck_dc_api_cfg_adapter_ver CHECK(adapter_version>=1),
|
CONSTRAINT ck_dc_api_cfg_adapter_ver CHECK(adapter_version>=1),
|
||||||
CONSTRAINT ck_dc_api_cfg_poll CHECK(poll_interval_seconds BETWEEN 1 AND 86400),
|
CONSTRAINT ck_dc_api_cfg_poll CHECK(poll_interval_seconds BETWEEN 1 AND 86400),
|
||||||
CONSTRAINT ck_dc_api_cfg_page CHECK(page_size BETWEEN 1 AND 10000),
|
CONSTRAINT ck_dc_api_cfg_page CHECK(page_size BETWEEN 1 AND 50000),
|
||||||
CONSTRAINT ck_dc_api_cfg_pages CHECK(max_pages_per_run BETWEEN 1 AND 100000),
|
CONSTRAINT ck_dc_api_cfg_pages CHECK(max_pages_per_run BETWEEN 1 AND 100000),
|
||||||
CONSTRAINT ck_dc_api_cfg_conn_to CHECK(connect_timeout_ms BETWEEN 100 AND 120000),
|
CONSTRAINT ck_dc_api_cfg_conn_to CHECK(connect_timeout_ms BETWEEN 100 AND 120000),
|
||||||
CONSTRAINT ck_dc_api_cfg_req_to CHECK(request_timeout_ms BETWEEN 100 AND 600000),
|
CONSTRAINT ck_dc_api_cfg_req_to CHECK(request_timeout_ms BETWEEN 100 AND 600000),
|
||||||
|
|||||||
@@ -32,6 +32,11 @@ database/03-device-collection-mode-verify.sql
|
|||||||
|
|
||||||
默认 `BOTH` 用于兼容现有设备;升级 SQL 不硬编码任何设备 ID。
|
默认 `BOTH` 用于兼容现有设备;升级 SQL 不硬编码任何设备 ID。
|
||||||
|
|
||||||
|
API 拉取任务的通用 `LOOKBACK_SECONDS` 默认值同时由 `300` 调整为 `0`。升级只修改数据库列默认值,
|
||||||
|
不会批量更新已有任务;确实需要迟到补偿的任务继续保留或显式配置正数。
|
||||||
|
数据库 `PAGE_SIZE` 检查约束上限由 `10000` 放宽为 `50000`,用于微步 5 秒窗口;其他适配器仍执行
|
||||||
|
各自更严格的 Java 配置校验。已有任务值不会被升级脚本修改。
|
||||||
|
|
||||||
## API 拉取任务的探针归属
|
## API 拉取任务的探针归属
|
||||||
|
|
||||||
新版调度器只扫描满足以下条件的设备任务:
|
新版调度器只扫描满足以下条件的设备任务:
|
||||||
@@ -45,8 +50,9 @@ DEVICE_DEVICE.DEVICE_COLLECT_ID = 当前节点 APP_SERVICE_DEVICE_COLLECT_ID
|
|||||||
`DEVICE_API_ENABLED=true`,再由数据库租约保证同一任务只有一个实例执行。混合版本升级期间,
|
`DEVICE_API_ENABLED=true`,再由数据库租约保证同一任务只有一个实例执行。混合版本升级期间,
|
||||||
旧节点仍建议保持 `DEVICE_API_ENABLED=false`。
|
旧节点仍建议保持 `DEVICE_API_ENABLED=false`。
|
||||||
|
|
||||||
本次 v6 强制数据库结构变更只有 `DEVICE_DEVICE.COLLECTION_MODE`。微步 API 复用现有
|
本次 v6 新增字段只有 `DEVICE_DEVICE.COLLECTION_MODE`;另外将既有
|
||||||
`DEVICE_COLLECT_API_*` 基础表,不在本次升级中新增或修改这些表。新版微步适配器只支持
|
`DEVICE_COLLECT_API_CONFIG.LOOKBACK_SECONDS` 的列默认值调整为 `0`,不新增 API 拉取表、不修改已有任务值。
|
||||||
|
微步 API 复用现有 `DEVICE_COLLECT_API_*` 基础表。新版微步适配器只支持
|
||||||
`WEIBU_LOG`(`/api/v1/log/searchBySql`);开发阶段的 `WEIBU_INCIDENT` 从未作为现场版本发布,因此不需要现场数据迁移脚本。
|
`WEIBU_LOG`(`/api/v1/log/searchBySql`);开发阶段的 `WEIBU_INCIDENT` 从未作为现场版本发布,因此不需要现场数据迁移脚本。
|
||||||
|
|
||||||
## 现场设置示例
|
## 现场设置示例
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ API 相关升级只看本页。示例设备:`deviceId=40`、`IP=10.56.171.164`
|
|||||||
```text
|
```text
|
||||||
SYSLOG_SERVER_ENABLED=true
|
SYSLOG_SERVER_ENABLED=true
|
||||||
DEVICE_API_ENABLED=true
|
DEVICE_API_ENABLED=true
|
||||||
|
DEVICE_API_SCHEDULER_SCAN_INTERVAL_MS=1000
|
||||||
DEVICE_API_TLS_VERIFY_ENABLED=false
|
DEVICE_API_TLS_VERIFY_ENABLED=false
|
||||||
DEVICE_API_HOST_ALLOWLIST_ENABLED=false
|
DEVICE_API_HOST_ALLOWLIST_ENABLED=false
|
||||||
```
|
```
|
||||||
@@ -25,7 +26,8 @@ API 相关升级只看本页。示例设备:`deviceId=40`、`IP=10.56.171.164`
|
|||||||
docker logs syslog-serve-dm 2>&1 | grep '\[SYSLOG_BUILD_READY\]' | tail -n 1
|
docker logs syslog-serve-dm 2>&1 | grep '\[SYSLOG_BUILD_READY\]' | tail -n 1
|
||||||
```
|
```
|
||||||
|
|
||||||
必须看到 `codeRevision=WEIBU_DIAGNOSTIC_V20260917_66`、`apiPullEnabled=true`,并确认
|
必须看到 `codeRevision=WEIBU_5S_50000_SCAN1S_V20260917_70`、`apiPullEnabled=true`、
|
||||||
|
`apiSchedulerScanIntervalMs=1000`,并确认
|
||||||
`deviceCollectId` 与设备 40 的 `DEVICE_DEVICE.DEVICE_COLLECT_ID` 一致。内网默认
|
`deviceCollectId` 与设备 40 的 `DEVICE_DEVICE.DEVICE_COLLECT_ID` 一致。内网默认
|
||||||
`apiTlsVerifyEnabled=false`。
|
`apiTlsVerifyEnabled=false`。
|
||||||
|
|
||||||
@@ -59,6 +61,11 @@ cat /tmp/weibu-40-task.json
|
|||||||
```
|
```
|
||||||
|
|
||||||
必须确认 `deviceId=40`、`baseUrl=https://10.56.171.164`,且 `initialStartTime` 已经是真实时间,不再包含 `__INITIAL_START_TIME__`。
|
必须确认 `deviceId=40`、`baseUrl=https://10.56.171.164`,且 `initialStartTime` 已经是真实时间,不再包含 `__INITIAL_START_TIME__`。
|
||||||
|
同时确认本次常规任务使用默认的 `lookbackSeconds=0`。只有现场确有迟到日志补偿需求并完成容量评估后,
|
||||||
|
才显式配置正数;微步接口没有已确认的分页游标,正数回看可能增加单个时间窗口的数据量。
|
||||||
|
还必须确认 `windowSizeSeconds=5`、`pageSize=50000`、`maxPagesPerRun=1`、
|
||||||
|
`pollIntervalSeconds=1` 和 `maxResponseBytes=67108864`。条数上限与响应字节上限同时生效;响应超过
|
||||||
|
64 MiB 时任务失败且不推进 checkpoint,不会截断后伪装成功。
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker exec -i syslog-serve-dm curl -fsS -X POST \
|
docker exec -i syslog-serve-dm curl -fsS -X POST \
|
||||||
@@ -107,16 +114,16 @@ GET 必须返回 `collectionMode=API_ONLY`。此后 `10.56.171.164` 的 TCP/UDP
|
|||||||
诊断接口复用任务中的设备地址、凭据、TLS 和超时配置,只把请求 JSON 原样发送给微步。
|
诊断接口复用任务中的设备地址、凭据、TLS 和超时配置,只把请求 JSON 原样发送给微步。
|
||||||
它不会写入 WAL/Kafka,不会推进 checkpoint,也不会在响应中返回 API Key、Secret 或签名 URL。
|
它不会写入 WAL/Kafka,不会推进 checkpoint,也不会在响应中返回 API Key、Secret 或签名 URL。
|
||||||
|
|
||||||
查询最近 10 分钟,单次最多请求 1000 条:
|
查询最近 5 秒,单次最多请求 50000 条:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
TIME_TO=$(date +%s)
|
TIME_TO=$(date +%s)
|
||||||
TIME_FROM=$((TIME_TO - 600))
|
TIME_FROM=$((TIME_TO - 5))
|
||||||
|
|
||||||
docker exec syslog-serve-dm curl -fsS -X POST \
|
docker exec syslog-serve-dm curl -fsS -X POST \
|
||||||
'http://127.0.0.1:8189/syslogserve/api/api-pull-tasks/21/diagnostics/weibu-query' \
|
'http://127.0.0.1:8189/syslogserve/api/api-pull-tasks/21/diagnostics/weibu-query' \
|
||||||
-H 'Content-Type: application/json' \
|
-H 'Content-Type: application/json' \
|
||||||
-d "{\"time_from\":${TIME_FROM},\"time_to\":${TIME_TO},\"sql\":\"\",\"assets_group\":[],\"columns\":[],\"size\":1000}"
|
-d "{\"time_from\":${TIME_FROM},\"time_to\":${TIME_TO},\"sql\":\"\",\"assets_group\":[],\"columns\":[],\"size\":50000}"
|
||||||
```
|
```
|
||||||
|
|
||||||
请求体不会限制微步字段,因此可以试验现场版本的页码和页大小字段。例如:
|
请求体不会限制微步字段,因此可以试验现场版本的页码和页大小字段。例如:
|
||||||
|
|||||||
@@ -5,16 +5,16 @@
|
|||||||
"streamKey": "WEIBU_LOG",
|
"streamKey": "WEIBU_LOG",
|
||||||
"baseUrl": "https://10.56.171.164",
|
"baseUrl": "https://10.56.171.164",
|
||||||
"credentialRef": "weibu-40",
|
"credentialRef": "weibu-40",
|
||||||
"pollIntervalSeconds": 30,
|
"pollIntervalSeconds": 1,
|
||||||
"pageSize": 1000,
|
"pageSize": 50000,
|
||||||
"maxPagesPerRun": 1,
|
"maxPagesPerRun": 1,
|
||||||
"schedulerPriority": 0,
|
"schedulerPriority": 0,
|
||||||
"connectTimeoutMs": 5000,
|
"connectTimeoutMs": 5000,
|
||||||
"requestTimeoutMs": 30000,
|
"requestTimeoutMs": 30000,
|
||||||
"windowSizeSeconds": 300,
|
"windowSizeSeconds": 5,
|
||||||
"safetyDelaySeconds": 120,
|
"safetyDelaySeconds": 120,
|
||||||
"lookbackSeconds": 300,
|
"lookbackSeconds": 0,
|
||||||
"maxResponseBytes": 16777216,
|
"maxResponseBytes": 67108864,
|
||||||
"initialStartTime": "__INITIAL_START_TIME__",
|
"initialStartTime": "__INITIAL_START_TIME__",
|
||||||
"extraConfig": {}
|
"extraConfig": {}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,3 +31,21 @@ WHERE CONSTRAINT_NAME = 'CK_DEVICE_COLLECTION_MODE';
|
|||||||
|
|
||||||
-- 5. 执行 DDL 前必须完成 DEVICE_DEVICE 可恢复备份,并确认没有未结束的长事务或表锁。
|
-- 5. 执行 DDL 前必须完成 DEVICE_DEVICE 可恢复备份,并确认没有未结束的长事务或表锁。
|
||||||
-- 数据库脚本不得写死现场 device_id;具体设备模式在新版 JAR 启动后通过管理 API 设置。
|
-- 数据库脚本不得写死现场 device_id;具体设备模式在新版 JAR 启动后通过管理 API 设置。
|
||||||
|
|
||||||
|
-- 6. API 拉取配置表及 LOOKBACK_SECONDS 必须存在。记录当前默认值;旧版通常为 300,新版目标为 0。
|
||||||
|
-- 这里只修改后续新记录的默认值,不覆盖已有任务显式配置。
|
||||||
|
SELECT TABLE_NAME
|
||||||
|
FROM USER_TABLES
|
||||||
|
WHERE TABLE_NAME = 'DEVICE_COLLECT_API_CONFIG';
|
||||||
|
|
||||||
|
SELECT COLUMN_NAME, DATA_TYPE, NULLABLE, DATA_DEFAULT
|
||||||
|
FROM USER_TAB_COLUMNS
|
||||||
|
WHERE TABLE_NAME = 'DEVICE_COLLECT_API_CONFIG'
|
||||||
|
AND COLUMN_NAME = 'LOOKBACK_SECONDS';
|
||||||
|
|
||||||
|
-- 7. 记录 API 拉取单窗口条数约束。旧版应存在 CK_DC_API_CFG_PAGE,范围上限通常为 10000;
|
||||||
|
-- 新版需要放宽为 50000,供微步 5 秒窗口使用。
|
||||||
|
SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE, STATUS, SEARCH_CONDITION
|
||||||
|
FROM USER_CONSTRAINTS
|
||||||
|
WHERE TABLE_NAME = 'DEVICE_COLLECT_API_CONFIG'
|
||||||
|
AND CONSTRAINT_NAME = 'CK_DC_API_CFG_PAGE';
|
||||||
|
|||||||
@@ -23,3 +23,24 @@ COMMENT ON COLUMN DEVICE_DEVICE.COLLECTION_MODE IS
|
|||||||
'设备级采集模式:SYSLOG_ONLY、API_ONLY、BOTH;默认 BOTH';
|
'设备级采集模式:SYSLOG_ONLY、API_ONLY、BOTH;默认 BOTH';
|
||||||
|
|
||||||
COMMIT;
|
COMMIT;
|
||||||
|
|
||||||
|
-- API 拉取任务的通用回看默认值改为 0。只改变后续 INSERT 未指定该字段时的默认值;
|
||||||
|
-- 不 UPDATE 已有任务,已有 NDR/全悉等显式 lookback 配置保持不变。
|
||||||
|
ALTER TABLE DEVICE_COLLECT_API_CONFIG
|
||||||
|
MODIFY LOOKBACK_SECONDS INTEGER DEFAULT 0 NOT NULL;
|
||||||
|
|
||||||
|
COMMENT ON COLUMN DEVICE_COLLECT_API_CONFIG.LOOKBACK_SECONDS IS
|
||||||
|
'迟到数据回看秒数;默认0,仅在适配器和现场容量允许时由任务显式设置';
|
||||||
|
|
||||||
|
COMMIT;
|
||||||
|
|
||||||
|
-- 微步 5 秒窗口允许单次完整返回最多 50000 条。这里只放宽通用数据库约束;
|
||||||
|
-- NDR、全悉等适配器仍由各自 Java Schema 保持更小的 pageSize 上限。
|
||||||
|
ALTER TABLE DEVICE_COLLECT_API_CONFIG
|
||||||
|
DROP CONSTRAINT CK_DC_API_CFG_PAGE;
|
||||||
|
|
||||||
|
ALTER TABLE DEVICE_COLLECT_API_CONFIG
|
||||||
|
ADD CONSTRAINT CK_DC_API_CFG_PAGE
|
||||||
|
CHECK (PAGE_SIZE BETWEEN 1 AND 50000);
|
||||||
|
|
||||||
|
COMMIT;
|
||||||
|
|||||||
@@ -26,3 +26,21 @@ GROUP BY COLLECTION_MODE
|
|||||||
ORDER BY COLLECTION_MODE;
|
ORDER BY COLLECTION_MODE;
|
||||||
|
|
||||||
-- 验证脚本不创建测试设备,也不绑定任何现场 device_id。
|
-- 验证脚本不创建测试设备,也不绑定任何现场 device_id。
|
||||||
|
|
||||||
|
-- 5. 预期 1 行:LOOKBACK_SECONDS、NULLABLE=N、DATA_DEFAULT 为 0。
|
||||||
|
SELECT COLUMN_NAME, DATA_TYPE, NULLABLE, DATA_DEFAULT
|
||||||
|
FROM USER_TAB_COLUMNS
|
||||||
|
WHERE TABLE_NAME = 'DEVICE_COLLECT_API_CONFIG'
|
||||||
|
AND COLUMN_NAME = 'LOOKBACK_SECONDS';
|
||||||
|
|
||||||
|
-- 6. 仅统计已有任务分布,不要求全部为 0;升级脚本不会覆盖已有任务的显式配置。
|
||||||
|
SELECT LOOKBACK_SECONDS, COUNT(*) AS TASK_TOTAL
|
||||||
|
FROM DEVICE_COLLECT_API_CONFIG
|
||||||
|
GROUP BY LOOKBACK_SECONDS
|
||||||
|
ORDER BY LOOKBACK_SECONDS;
|
||||||
|
|
||||||
|
-- 7. 预期 1 行且 SEARCH_CONDITION 包含 PAGE_SIZE BETWEEN 1 AND 50000。
|
||||||
|
SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE, STATUS, SEARCH_CONDITION
|
||||||
|
FROM USER_CONSTRAINTS
|
||||||
|
WHERE TABLE_NAME = 'DEVICE_COLLECT_API_CONFIG'
|
||||||
|
AND CONSTRAINT_NAME = 'CK_DC_API_CFG_PAGE';
|
||||||
|
|||||||
Reference in New Issue
Block a user