Debezium 的容器镜像结构得到了巨大的改进,最近,使得扩展其行为变得非常简单。
这是一个小型教程,展示了如何例如添加 Sentry,“一个开源错误跟踪 [软件],帮助开发人员实时监控和修复崩溃”。这里我们将使用它来收集和报告 Kafka Connect 及其连接器的任何异常。请注意,这仅适用于 Debezium 0.9+。
我们需要一些东西来使 Sentry 工作,我们将添加所有这些,然后有一个 Dockerfile 来正确地将它们组合在一起
-
配置 Log4j
-
sentry.io 的 SSL 证书,因为它默认不在 JVM 受信任链中
-
sentry和sentry-log4j库
Log4j 配置
让我们创建文件 config/log4j.properties 在本地项目中,它是 Debezium 镜像中附带文件的副本,然后添加 Sentry。请注意,我们将 Sentry 添加到了 log4j.rootLogger 中,并创建了 log4j.appender.Sentry 部分,其余部分与原始配置相同。
kafka.logs.dir=logs
log4j.rootLogger=INFO, stdout, appender, Sentry
# Disable excessive reflection warnings - KAFKA-5229
log4j.logger.org.reflections=ERROR
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.threshold=INFO
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ISO8601} %-5p %X{dbz.connectorType}|%X{dbz.connectorName}|%X{dbz.connectorContext} %m [%c]%n
log4j.appender.appender=org.apache.log4j.DailyRollingFileAppender
log4j.appender.appender.DatePattern='.'yyyy-MM-dd-HH
log4j.appender.appender.File=${kafka.logs.dir}/connect-service.log
log4j.appender.appender.layout=org.apache.log4j.PatternLayout
log4j.appender.appender.layout.ConversionPattern=%d{ISO8601} %-5p %X{dbz.connectorType}|%X{dbz.connectorName}|%X{dbz.connectorContext} %m [%c]%n
log4j.appender.Sentry=io.sentry.log4j.SentryAppender
log4j.appender.Sentry.threshold=WARN Sentry.io SSL 证书
从 sentry.io 下载 getsentry.pem 文件,并将其放在项目目录下的 ssl/ 文件夹中。
Dockerfile
现在我们可以将所有内容整合到我们的 Debezium 镜像中。
-
让我们先创建一个包含 Sentry 证书的 JKS 文件;这使用了 Docker 的多阶段构建过程,其中我们生成了一个
certificates.jks文件,稍后我们将将其复制到我们的 Kafka Connect with Debezium 阶段。 -
将
log4j.properties复制到$KAFKA_HOME/config/log4j.properties -
从多阶段构建中复制 JKS 文件
-
设置 Sentry 版本和 m5sums 的 ENV 变量
-
下载 Sentry 依赖项,您看到的脚本
docker-maven-download是我们默认包含在镜像中的一个辅助工具。在这种情况下,我们使用它从 Maven Central 下载一个 JAR 文件并将其放入 Kafka libs 目录。我们通过设置 ENV 变量MAVEN_DEP_DESTINATION=$KAFKA_HOME/libs来实现这一点。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
FROM fabric8/java-centos-openjdk8-jdk:1.6 as ssl-jks
ARG JKS_STOREPASS="any random password, you can also set it outside via the arguments from docker build"
USER root:root
COPY /ssl /ssl
RUN chown -R jboss:jboss /ssl
USER jboss:jboss
WORKDIR /ssl
RUN keytool -import -noprompt -alias getsentry \
-storepass "${JKS_STOREPASS}" \
-keystore certificates.jks \
-trustcacerts -file "/ssl/getsentry.pem"
FROM debezium/connect:0.10 AS kafka-connect
EXPOSE 8083
COPY config/log4j.properties "$KAFKA_HOME/config/log4j.properties"
COPY --from=ssl-jks --chown=kafka:kafka /ssl/certificates.jks /ssl/
ENV SENTRY_VERSION=1.7.23 \
MAVEN_DEP_DESTINATION=$KAFKA_HOME/libs
RUN docker-maven-download \
central io/sentry sentry "$SENTRY_VERSION" 4bf1d6538c9c0ebc22526e2094b9bbde && \
docker-maven-download \
central io/sentry sentry-log4j "$SENTRY_VERSION" 74af872827bd7e1470fd966449637a77
构建和运行
现在我们可以简单地构建镜像。
$ docker build -t debezium/connect-sentry:1 --build-arg=JKS_STOREPASS="123456789" . 运行时,我们必须通过设置 KAFKA_OPTS: -Djavax.net.ssl.trustStore=/ssl/certificates.jks -Djavax.net.ssl.trustStorePassword=<YOUR TRUSTSTORE PASSWORD> 来配置 Kafka Connect 应用程序加载 JKS 文件。
Sentry 可以 通过多种方式配置,我喜欢通过环境变量进行配置,最少需要设置的是 Sentry DSN(这对于指向您的项目是必需的)以及实际运行的环境名称(例如:production,staging)。
在这种情况下,我们可以配置以下变量:SENTRY_DSN=<在 SENTRY 的仪表盘中获取 DSN>,SENTRY_ENVIRONMENT=dev。
如果您想了解更多关于使用 Debezium 容器镜像的信息,请 查看我们的教程。
就是这样,这是一个使用 Sentry 作为示例来扩展我们 Docker 设置的基本方法;其他修改也应该像这个一样简单。例如,Kafka producer 的 RecordTooLarge 异常在这个设置中会是什么样子,请参见下图。
结论
得益于最近对 Debezium 容器镜像的重构,用自定义扩展来修改它们变得非常容易。下载外部依赖项并将其添加到镜像中已成为一项微不足道的工作,我们很乐意听取您对此的反馈!
如果您对重构本身感到好奇,可以在 pull request debezium/container-images#131 中找到详细信息。
关于 Debezium
Debezium 是一个开源的分布式平台,可以将现有数据库转变为事件流,使应用程序能够几乎即时地看到并响应数据库中已提交的每个行级更改。Debezium 构建在 Kafka 之上,并提供了 Kafka Connect 兼容的连接器,用于监控特定的数据库管理系统。Debezium 将数据更改的历史记录在 Kafka 日志中,这样您的应用程序可以随时停止和重新启动,并可以轻松地消费在未运行时错过的所有事件,确保所有事件都被正确且完整地处理。Debezium 在 Apache 许可证 2.0 下是 开源 的。