rsyslog plugin for tdengine 编写本插件的目的是将nginx产生的巨量http请求日志写入时序数据库TDengine 当然,本插件也支持将所有传给rsyslog的消息写入TDengine
- 下载rsyslog源码,本人采用的是8.24 https://github.com/rsyslog/rsyslog http://www.rsyslog.com
- 将本项目omtaos目录下载放到rsyslog源码的plugins目录下
- 修改源码最外层的Makefile.am文件,增加omtaos配置 可以搜索参照mysql位置写入
if ENABLE_TAOS
SUBDIRS += plugins/omtaos
endif
THIS_IS_TEMPORARILY_DISABLED = \
--enable-distcheck-workaround \
--enable-testbench \
--enable-imdiag \
--enable-testbench \
--enable-imfile \
--enable-snmp \
--enable-libdbi \
--enable-mysql \
--enable-taos \
--enable-relp \
- 修改源码的configure.ac文件,同样可以参照mysql位置填写
# TDengine(taos) support
AC_ARG_ENABLE(taos,
[AS_HELP_STRING([--enable-taos],[Enable TDengine(taos) database support @<:@default=no@:>@])],
[case "${enableval}" in
yes) enable_taos="yes" ;;
no) enable_taos="no" ;;
*) AC_MSG_ERROR(bad value ${enableval} for --enable-taos) ;;
esac],
[enable_taos=no]
)
AM_CONDITIONAL(ENABLE_TAOS, test x$enable_taos = xyes)
AC_CONFIG_FILES([Makefile \
runtime/Makefile \
compat/Makefile \
grammar/Makefile \
tools/Makefile \
plugins/omtesting/Makefile \
plugins/omgssapi/Makefile \
plugins/ommysql/Makefile \
plugins/omtaos/Makefile \
echo "---{ database support }---"
echo " MySql support enabled: $enable_mysql"
echo " TDengine support enabled: $enable_taos"
echo " libdbi support enabled: $enable_libdbi"
echo " PostgreSQL support enabled: $enable_pgsql"
echo " mongodb support enabled: $enable_ommongodb"
echo " hiredis support enabled: $enable_omhiredis"
- 安装编译环境
yum install git valgrind autoconf automake flex bison python-docutils python-sphinx json-c-devel libuuid-devel libgcrypt-devel zlib-devel openssl-devel libcurl-devel gnutls-devel mysql-devel postgresql-devel libdbi-dbd-mysql libdbi-devel net-snmp-devel libestr-devel.x86_64 autoconf automake libtool -y
再安装 pkg-config-0.29.tar.gz
-
重新生成configure文件 使用autogen.sh重新生成configure文件
-
configure
./configure --prefix=/usr/local/rsyslog-824 --enable-imptcp --enable-omuxsock --enable-omstdout --enable-taos
make install -j 4
- 在消息模板里,消息数据和SQL的分隔符为 :: 4个字符 (随意规定的,不喜欢可以自己修改源码)
- 每一个消息值都需要用"" 双引号括起来,类似json格式,然后采用两个星号获取消息值,例如
*2*
获取第二个消息值 - 需要传入http的time_local字段,然后代码自动在时间后面添加6位数字,将时间扩充为微妙级别,防止时间戳重复数据被TDengine丢弃
关键字为time_local_to_ts_n,最后n代码time_local所在消息值位置,例如
*time_local_to_ts_10*
表示第10个消息值为time_local - 其他syslog配置请查看rsyslog文档https://www.rsyslog.com/doc/v8-stable/index.html TDengine相关请查看TDengine文档https://www.taosdata.com/cn/documentation/
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
module(load="imudp")
input(type="imudp" port="1524" ruleset="TDengine")
#$ModLoad omtaos
module(load="omtaos")
# msg *:*: sql
# msg "aaaa":"bbbbb","cccc""dddd"
# *1* = msg[1]=aaaa *3* = msg[3]="cccc"
template(name="tpl_http" type="string" option.sql="on" string="\"mc\":\"%hostname:1:2%\",\"proxy\":\"%hostname:4:10%\",%msg%*:*:insert into http_test_'*2*'_'*4*' using http tags('*2*','*4*') values('*time_local_to_ts_10*','*6*','*8*')")
ruleset(name="TDengine"){
if ( $programname == 'nginx' ) then {
action(type="omtaos" server="yz-td01" serverport="6030"
db="http_log" uid="root" pwd="taosdata" template="tpl_http"
queue.filename="taos_q_http"
queue.spoolDirectory="/data/taos/syslog"
queue.size="5000000"
queue.type="linkedList"
queue.maxdiskspace="20g"
queue.maxfilesize="100m"
queue.workerthreads="100"
)
}
}
在4核8线程+8G环境下压测,入库速率为4万QPS左右 目前在生产环境1万QPS入库速率下基本正常 本代码为单条消息insert入库,还想再提升性能,可以修改为批量入库
rsyslog-824.0.tar.gz是用如下命令编译的
./configure --prefix=/usr/local/rsyslog-824 --enable-imptcp --enable-mysql --enable-omuxsock --enable-omstdout --enable-taos