将来自分离数据库的信息合并到Logstash中的单个文档中

时间:2019-09-25 16:00:16

标签: logstash logstash-jdbc

我想合并来自不同数据库中两个不同表的信息。 在数据库db_a的表t_a中,我具有有关用户的信息,例如用户名,名称,电话号码等。 在数据库db_b的表t_b中,我具有有关用户的特定于系统的信息。例如,对于该系统,用户X的类型为Y.表t_b在表t_a上具有指示用户ID的字段,这就是我可以链接两个表的方式。 我想按Elastic中的用户名对用户进行分组,并且在每个文档中,将有一系列用户,这些用户针对具有该用户名的每个现有用户具有特定的用户信息。 例如

{
  "_index" : "users",
  ...
 "source" : {
     "user_id" : "sysadmin",
     "username" : "sysadmin"
     "users": {
               {
                        "name" : null, \\ From t_a
                        "email" : "fabio.lp@abcd.com", \\ From t_a
                        "tenantid" : "e118af1f-6674-4348-bb12-xxxxxxxx27a6", \\ From t_a
                        "user_type" : 1050 \\ From t_b
               },
               {
                        "name" : "Administrator", \\ From t_a
                        "email" : "joao.lapa@abcd.com", \\ From t_a
                        "tenantid" : "e118af1f-6674-4348-bb12-9032bd2xxxxx", \\ From t_a
                        "user_type" : 1050 \\ From t_b
               }
      }
  }
}

这是我目前正在尝试做的事情。不幸的是无法正常工作:

input {
  jdbc {
    jdbc_connection_string => "jdbc:sqlserver://db_a;databaseName=t_a;user=xx;password=xxx;"
    jdbc_driver_class => "com.microsoft.sqlserver.jdbc.SQLServerDriver"
    jdbc_user => "xx"
    jdbc_password => "xxx"

    statement => "SELECT * FROM Users order by username"
  }
}

filter {
  jdbc_streaming {
        jdbc_connection_string => "jdbc:sqlserver://db_b;databaseName=t_b;user=bbb;password=aaa;"
        jdbc_driver_class => "com.microsoft.sqlserver.jdbc.SQLServerDriver"
        jdbc_user => "aaa"
        jdbc_password => "bbb"
        statement => "select ExternalID, UserTypeID from [User] where ExternalID = :userid"
        parameters => { "userid" => "id" }
        target => "extra"
        add_field => {
            "userType" => "%{[extra][0][UserTypeID]}"
        }
        remove_field => ["extra"]
    }

  aggregate {
    task_id => "%{username}"
    code => "
         map['username'] = event.get('username')
         map['users'] ||= [ ]
         map['users'] << {'name' => event.get('name'), 
                        'email' => event.get('email'),
                        'tenantid' => event.get('tenantid')}
         event.cancel()
       "
    push_previous_map_as_event => true
    timeout_task_id_field => "user_id"
    timeout => 3600
    inactivity_timeout => 300
    timeout_tags => ['_aggregatetimeout']
    }
}

output {
  elasticsearch {
    hosts => ["localhost:9200"]
    index => "users"
    }
}

我试图解释我所能做到的最好= / 我想知道这是否可行,如何实现。

0 个答案:

没有答案