美文网首页大数据玩转大数据大数据&云计算
用几行脚本解决了困扰了客户一周的需求

用几行脚本解决了困扰了客户一周的需求

作者: bellengao | 来源:发表于2022-08-08 16:58 被阅读0次

背景

近日云上Elasticsearch的客户,提过来了一个需求,期望把上游业务的日志中的一些无用字段从ES中删除掉,这些字段的名称是固定位数的随机字符串,期望能够通过一些过滤规则删除掉这些字段。

实现方案

日志内容的示例如下:

 {
    "req":{
        "headers":{
            "host":"x.x.x.x",
            "connection":"keep-alive",
            "x-forwarded-for":"x.x.x.x",
            "x-forwarded-proto":"http",
            "x-forwarded-host":"x.com",
            "x-forwarded-port":"0000",
            "x-forwarded-path":"x",
            "x-forwarded-prefix":"y",
            "et55ouqyzettcs070zr6fq74yknotwz":"abc",
            "uuid":"xxxxx",
            "vn4qhj6ienxegvhxyf56u8wq4w6icc9":"abc"
        }
    }
}
        

客户的需求是要删除上述示例中字段名为一串随机字符串的字段,示例中有两个,实际会有更多,并且不同类型的文档,字段名还不一样。

为了实现客户的需求,首先想到的就是是使用ES的Remove Ingest Processor去删除字段,但是发现Remove Ingest Processor中的field字段不支持正则表达式,只好作罢。

通过跟客户沟通,了解到要保留的字段是确定的,因此想到可以使用Set Ingest Processor通过复制原Object字段中需要保留的字段内容到一个新的Object类型的字段中,之后再删除原Object字段。

{
    "processors":[
        {
            "set":{
                "field":"req.newHeaders.host",
                "copy_from":"req.headers.host"
            }
        },
        {
            "set":{
                "field":"req.newHeaders.connection",
                "copy_from":"req.headers.connection"
            }
        },
        {
            "remove":{
                "field":"req.headers"
            }
        },
        {
            "set":{
                "field":"req.headers",
                "copy_from":"req.newHeaders"
            }
        },
        {
            "remove":{
                "field":"req.newHeaders"
            }
        }
    ]
}

实际应用中,客户表示要保留的字段有几十个,把所有要保留的字段都set一遍会比较麻烦,后面有新增的字段,还需要再次修改ingest pipeline,期望能够比较简单易用的方式解决这个问题。

另外客户表示,要删除的字段不会太多,并且字段名称都是由31个随机字符串组成,且值都为"abc",看能不能根据这个条件删除掉不需要的字段。

在寻找解决方案的过程中,发现Logstash有类似的filter: Prune Filter Plugin, 可以直接根据字段值删除字段或者根据字段名的正则表达式删除字段:

filter {
      prune {
        blacklist_values => [ "abc"]
      }
    }
filter {
      prune {
        blacklist_names => [ "^([a-z]|[0-9]){31}$"]
      }
    }

然而客户因为没有用到Logstash,不希望单单为了去除一些无用的字段而新增一个组件,因此只能从ES的ingest pipeline入手解决。

既然ES的Remove Processor不支持通过正则表达式删除字段,也不支持通过字段的值来删除字段,那就只能使用Script Processor,通过脚本来删除了:

"processors": [
      {
        "script": {
          "description": "Remove useless fields from 'req.headers' field",
          "lang": "painless",
          "source": """
            Map map = (HashMap)ctx['req']['headers'];
            Map headersMap = new HashMap();
            for (entry in map.entrySet()){
              if (entry.getValue()!= params.value){
                headersMap.put(entry.getKey(), entry.getValue());
              }
            }
            ctx['req']['headers'] = headersMap
          """,
          "params": {
            "value": "abc"
          }
        }
      }
    ]

使用Painless脚本,把每个文档中的req.headers字段解析成map,然后遍历,使用一个新的map保存值不是"abc"的字段,然后再赋值给req.headers。经过验证,实际是可行的。

通过使用上述Script Processor, 最终实现了使用较少的配置,实现了通过字段的值来删除字段的功能,满足了客户的需求。

相关文章

  • 用几行脚本解决了困扰了客户一周的需求

    背景 近日云上Elasticsearch的客户,提过来了一个需求,期望把上游业务的日志中的一些无用字段从ES中删除...

  • 2020.11.30日精进

    今天体验,关注客户需求,解决客户问题,今天解决了传祺客户一个多月的困扰,怠速发动机抖动,正确的处理问题,因产品问题...

  • 119.简单的快乐

    今天解决了一个困扰我一周的问题,想着明天就能把程序发给客户了,心情无比舒畅。虽然明天会有新的事情,也会遇到新的...

  • 2020-11-22

    今日体验,客户的需求是方向,解决客户的问题是价值。 核心,了解,满足。 用,用心去做,去服务。

  • jsp自定义标签库

    自定义标签 引入:向浏览器输出当前客户的ip地址(不能使用脚本),原先的jsp脚本已经无法满足我们的需求了,这时候...

  • shell中通过字符串执行函数

    需求描述: shell脚本中定义了很多功能函数,我要通过执行脚本传入参数执行函数,参数为函数名字, 解决方法 执行结果

  • 高级英才父母实践打卡第112天

    2018年11月27日 星期二 小雨 1.困扰我一周的问题今天解决了!关于妹妹不愿刷牙的事情,今天哥哥帮我解决了,...

  • 解决客户关键需求

    之前听过李叫兽的课,其分析很有理论结合实际的逻辑形式,分析起来也挺有感觉。 客户营销关注公式及因素: 1、消费者需...

  • 创业者的:痛点原则、专注原则、掌控原则、变革原则、底线原则

    【痛点原则】 • 洞察需求: 洞察自己和客户的需求,这个需求到底在不在? • 破解痛点: 当你解决了一个痛点,又创...

  • 2018-09-19

    1、首先呢用真诚和爱去打动客户, 2、赞美客户 3、了解客户的需求 4、解决担忧表示理解 5、给他讲不练瑜伽时会带...

网友评论

    本文标题:用几行脚本解决了困扰了客户一周的需求

    本文链接:https://www.haomeiwen.com/subject/ksgwwrtx.html