diff --git a/.ci/docker-compose-file/docker-compose.yaml b/.ci/docker-compose-file/docker-compose.yaml index 2d1c553e9..48d900400 100644 --- a/.ci/docker-compose-file/docker-compose.yaml +++ b/.ci/docker-compose-file/docker-compose.yaml @@ -16,6 +16,9 @@ services: GITHUB_REF: ${GITHUB_REF} networks: - emqx_bridge + ports: + - 28083:18083 + - 2883:1883 volumes: - ../..:/emqx - /tmp/emqx-ci/emqx-shared-secret:/var/lib/secret diff --git a/Makefile b/Makefile index 6fac2d622..13e3a6d43 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,7 @@ export EMQX_DEFAULT_RUNNER = debian:11-slim export OTP_VSN ?= $(shell $(CURDIR)/scripts/get-otp-vsn.sh) export ELIXIR_VSN ?= $(shell $(CURDIR)/scripts/get-elixir-vsn.sh) export EMQX_DASHBOARD_VERSION ?= v1.2.0 -export EMQX_EE_DASHBOARD_VERSION ?= e1.0.5-beta.3 +export EMQX_EE_DASHBOARD_VERSION ?= e1.0.5 export EMQX_REL_FORM ?= tgz export QUICER_DOWNLOAD_FROM_RELEASE = 1 ifeq ($(OS),Windows_NT) diff --git a/apps/emqx_connector/src/emqx_connector.app.src b/apps/emqx_connector/src/emqx_connector.app.src index 4f7ff0f25..08f97c243 100644 --- a/apps/emqx_connector/src/emqx_connector.app.src +++ b/apps/emqx_connector/src/emqx_connector.app.src @@ -1,7 +1,7 @@ %% -*- mode: erlang -*- {application, emqx_connector, [ {description, "EMQX Data Integration Connectors"}, - {vsn, "0.1.17"}, + {vsn, "0.1.18"}, {registered, []}, {mod, {emqx_connector_app, []}}, {applications, [ diff --git a/apps/emqx_connector/src/emqx_connector_redis.erl b/apps/emqx_connector/src/emqx_connector_redis.erl index 29f7c0a38..c70e766af 100644 --- a/apps/emqx_connector/src/emqx_connector_redis.erl +++ b/apps/emqx_connector/src/emqx_connector_redis.erl @@ -285,7 +285,6 @@ redis_fields() -> {database, #{ type => integer(), default => 0, - required => true, desc => ?DESC("database") }}, {auto_reconnect, fun emqx_connector_schema_lib:auto_reconnect/1} diff --git a/apps/emqx_rule_engine/src/emqx_rule_engine.erl b/apps/emqx_rule_engine/src/emqx_rule_engine.erl index d494a4740..44b49a75b 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_engine.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_engine.erl @@ -319,14 +319,8 @@ get_basic_usage_info() -> ReferencedBridges = lists:foldl( fun(#{actions := Actions, from := Froms}, Acc) -> - BridgeIDs0 = - [ - BridgeID - || From <- Froms, - {ok, BridgeID} <- - [emqx_bridge_resource:bridge_hookpoint_to_bridge_id(From)] - ], - BridgeIDs1 = lists:filter(fun is_binary/1, Actions), + BridgeIDs0 = get_referenced_hookpoints(Froms), + BridgeIDs1 = get_egress_bridges(Actions), tally_referenced_bridges(BridgeIDs0 ++ BridgeIDs1, Acc) end, #{}, @@ -490,10 +484,8 @@ forwards_to_bridge(Actions, BridgeId) -> lists:any(fun(A) -> A =:= BridgeId end, Actions). references_ingress_bridge(Froms, BridgeId) -> - lists:any( - fun(ReferenceBridgeId) -> - BridgeId =:= ReferenceBridgeId - end, + lists:member( + BridgeId, [ RefBridgeId || From <- Froms, @@ -501,3 +493,14 @@ references_ingress_bridge(Froms, BridgeId) -> [emqx_bridge_resource:bridge_hookpoint_to_bridge_id(From)] ] ). + +get_referenced_hookpoints(Froms) -> + [ + BridgeID + || From <- Froms, + {ok, BridgeID} <- + [emqx_bridge_resource:bridge_hookpoint_to_bridge_id(From)] + ]. + +get_egress_bridges(Actions) -> + lists:filter(fun is_binary/1, Actions). diff --git a/changes/ee/fix-10289.en.md b/changes/ee/fix-10289.en.md new file mode 100644 index 000000000..65eed7b5d --- /dev/null +++ b/changes/ee/fix-10289.en.md @@ -0,0 +1 @@ +Clickhouse has got a fix that makes the error message better when users click the test button in the settings dialog. diff --git a/changes/ee/fix-10289.zh.md b/changes/ee/fix-10289.zh.md new file mode 100644 index 000000000..d47278c16 --- /dev/null +++ b/changes/ee/fix-10289.zh.md @@ -0,0 +1 @@ +Clickhouse 已经修复了一个问题,当用户在设置对话框中点击测试按钮时,错误信息会更清晰。 diff --git a/lib-ee/emqx_ee_bridge/i18n/emqx_ee_bridge_kafka.conf b/lib-ee/emqx_ee_bridge/i18n/emqx_ee_bridge_kafka.conf index 787a39fdb..df32c1cae 100644 --- a/lib-ee/emqx_ee_bridge/i18n/emqx_ee_bridge_kafka.conf +++ b/lib-ee/emqx_ee_bridge/i18n/emqx_ee_bridge_kafka.conf @@ -216,6 +216,7 @@ emqx_ee_bridge_kafka { zh: "Socket 收包缓存大小" } } + # hidden socket_nodelay { desc { en: "When set to 'true', TCP buffer is sent as soon as possible. " @@ -571,26 +572,27 @@ emqx_ee_bridge_kafka { zh: "指定从哪个 Kafka 主题消费消息。" } label { - en: "Kafka topic" - zh: "Kafka 主题 " + en: "Kafka Topic" + zh: "Kafka 主题" } } consumer_max_batch_bytes { desc { - en: "Maximum bytes to fetch in a batch of messages." + en: "Set how many bytes to pull from Kafka in each fetch request. " "Please note that if the configured value is smaller than the message size in Kafka, it may negatively impact the fetch performance." - zh: "在一批消息中要取的最大字节数。" - "如果该配置小于 Kafka 中消息到大小,则可能会影响消费性能。" + zh: "设置每次从 Kafka 拉取数据的字节数。" + "如该配置小于 Kafka 消息的大小,可能会影响消费性能。" } label { - en: "Max Bytes" - zh: "最大字节数" + en: "Fetch Bytes" + zh: "拉取字节数" } } + # hidden consumer_max_rejoin_attempts { desc { en: "Maximum number of times allowed for a member to re-join the group. If the consumer group can not reach balance after this configured number of attempts, the consumer group member will restart after a delay." - zh: "允许一个成员重新加入小组的最大次数。如果超过改配置次数后仍不能成功加入消费组,则会在延迟一段时间后再重试。" + zh: "消费组成员允许重新加入小组的最大次数。如超过该配置次数后仍未能成功加入消费组,则会在等待一段时间后重试。" } label { en: "Max Rejoin Attempts" @@ -599,10 +601,9 @@ emqx_ee_bridge_kafka { } consumer_offset_reset_policy { desc { - en: "Defines from which offset a consumer should start fetching when there" - " is no commit history or when the commit history becomes invalid." - zh: "当没有主题分区没有偏移量的历史记录,或则历史记录失效后," - "消费者应该使用哪个偏移量重新开始消费" + en: "Defines from which offset a consumer should start fetching when there " + "is no commit history or when the commit history becomes invalid." + zh: "如不存在偏移量历史记录或历史记录失效,消费者应使用哪个偏移量开始消费。" } label { en: "Offset Reset Policy" @@ -616,13 +617,13 @@ emqx_ee_bridge_kafka { } label { en: "Offset Commit Interval" - zh: "偏移承诺间隔" + zh: "偏移提交间隔" } } consumer_topic_mapping { desc { - en: "Defines the mapping between Kafka topics and MQTT topics. Must contain at least one item." - zh: "指定 Kafka 主题和 MQTT 主题之间的映射。 必须至少包含一个项目。" + en: "Defines the mapping between Kafka topics and MQTT topics. Must contain at least one item." + zh: "指定 Kafka 主题和 MQTT 主题之间的映射关系。 应至少包含一项。" } label { en: "Topic Mapping" @@ -632,14 +633,14 @@ emqx_ee_bridge_kafka { consumer_key_encoding_mode { desc { en: "Defines how the key from the Kafka message is" - " dealt with before being forwarded via MQTT.\n" + " encoded before being forwarded via MQTT.\n" "none Uses the key from the Kafka message unchanged." - " Note: in this case, then the key must be a valid UTF-8 string.\n" + " Note: in this case, the key must be a valid UTF-8 string.\n" "base64 Uses base-64 encoding on the received key." - zh: "定义了在通过MQTT转发之前如何处理Kafka消息的 Key。" - "none 使用Kafka消息中的 Key 原始值,不进行编码。" - " 注意:在这种情况下,Key 必须是一个有效的UTF-8字符串。\n" - "base64 对收到的密钥或值使用base-64编码。" + zh: "通过 MQTT 转发之前,如何处理 Kafka 消息的 Key。" + "none 使用 Kafka 消息中的 Key 原始值,不进行编码。" + " 注意:在这种情况下,Key 必须是一个有效的 UTF-8 字符串。\n" + "base64 对收到的密钥或值使用 base-64 编码。" } label { en: "Key Encoding Mode" @@ -649,14 +650,14 @@ emqx_ee_bridge_kafka { consumer_value_encoding_mode { desc { en: "Defines how the value from the Kafka message is" - " dealt with before being forwarded via MQTT.\n" + " encoded before being forwarded via MQTT.\n" "none Uses the value from the Kafka message unchanged." - " Note: in this case, then the value must be a valid UTF-8 string.\n" + " Note: in this case, the value must be a valid UTF-8 string.\n" "base64 Uses base-64 encoding on the received value." - zh: "定义了在通过MQTT转发之前如何处理Kafka消息的 Value。" - "none 使用Kafka消息中的 Value 原始值,不进行编码。" - " 注意:在这种情况下,Value 必须是一个有效的UTF-8字符串。\n" - "base64 对收到的 Value 使用base-64编码。" + zh: "通过 MQTT 转发之前,如何处理 Kafka 消息的 Value。" + "none 使用 Kafka 消息中的 Value 原始值,不进行编码。" + " 注意:在这种情况下,Value 必须是一个有效的 UTF-8 字符串。\n" + "base64 对收到的 Value 使用 base-64 编码。" } label { en: "Value Encoding Mode" diff --git a/lib-ee/emqx_ee_bridge/src/emqx_ee_bridge_kafka.erl b/lib-ee/emqx_ee_bridge/src/emqx_ee_bridge_kafka.erl index fd7b3563a..e11ef1c93 100644 --- a/lib-ee/emqx_ee_bridge/src/emqx_ee_bridge_kafka.erl +++ b/lib-ee/emqx_ee_bridge/src/emqx_ee_bridge_kafka.erl @@ -221,17 +221,21 @@ fields(socket_opts) -> {sndbuf, mk( emqx_schema:bytesize(), - #{default => <<"1024KB">>, desc => ?DESC(socket_send_buffer)} + #{default => <<"1MB">>, desc => ?DESC(socket_send_buffer)} )}, {recbuf, mk( emqx_schema:bytesize(), - #{default => <<"1024KB">>, desc => ?DESC(socket_receive_buffer)} + #{default => <<"1MB">>, desc => ?DESC(socket_receive_buffer)} )}, {nodelay, mk( boolean(), - #{default => true, desc => ?DESC(socket_nodelay)} + #{ + default => true, + hidden => true, + desc => ?DESC(socket_nodelay) + } )} ]; fields(producer_opts) -> diff --git a/lib-ee/emqx_ee_connector/src/emqx_ee_connector_tdengine.erl b/lib-ee/emqx_ee_connector/src/emqx_ee_connector_tdengine.erl index 7ab0c5078..746ab5485 100644 --- a/lib-ee/emqx_ee_connector/src/emqx_ee_connector_tdengine.erl +++ b/lib-ee/emqx_ee_connector/src/emqx_ee_connector_tdengine.erl @@ -41,14 +41,16 @@ roots() -> fields(config) -> [ {server, server()} - | add_default_username(emqx_connector_schema_lib:relational_db_fields()) + | adjust_fields(emqx_connector_schema_lib:relational_db_fields()) ]. -add_default_username(Fields) -> +adjust_fields(Fields) -> lists:map( fun ({username, OrigUsernameFn}) -> {username, add_default_fn(OrigUsernameFn, <<"root">>)}; + ({password, OrigPasswordFn}) -> + {password, make_required_fn(OrigPasswordFn)}; (Field) -> Field end, @@ -61,6 +63,12 @@ add_default_fn(OrigFn, Default) -> (Field) -> OrigFn(Field) end. +make_required_fn(OrigFn) -> + fun + (required) -> true; + (Field) -> OrigFn(Field) + end. + server() -> Meta = #{desc => ?DESC("server")}, emqx_schema:servers_sc(Meta, ?TD_HOST_OPTIONS).