导入JMeter测试报告到ELK 6.7.1时出现mapper_parsing_exception报错
问题根因
你遇到的类型解析错误核心原因是Logstash默认不会跳过CSV文件的表头行,直接将表头作为普通数据行解析写入Elasticsearch,99% Line这类表头字符串无法匹配你预先定义的long/double数值类型,所以抛出解析失败错误。报错字段随机是因为Logstash重启后若没有配置读取位置记录,会从头读取文件,每次触发错误的第一个不匹配字段不同,就会出现字段随机变化的现象。
解决步骤
- 第一步:调整Logstash的csv过滤器配置,开启表头跳过和自动识别字段名能力
示例配置如下:filter { csv { separator => "," # 自动读取第一行表头作为字段名 autodetect_column_names => true # 跳过表头行,不做为数据解析 skip_header => true } } - 第二步:处理特殊字段的格式转换
你的测试数据中Error %字段自带百分号,直接写入会无法匹配double类型,需要在过滤器中增加符号删除和类型转换逻辑,补充配置如下:filter { # 承接上面的csv配置 mutate { # 删除Error %字段的百分号 gsub => [ "Error %", "%", "" ] # 主动转换所有数值字段的类型,避免ES自动推断或类型不匹配 convert => { "90% Line" => "integer" "95% Line" => "integer" "99% Line" => "integer" "Average" => "integer" "SampleSize" => "integer" "Min" => "integer" "Max" => "integer" "Median" => "integer" "Throughput" => "float" "Received KB/sec" => "float" "Std Deviation" => "float" "Error %" => "float" } } } - 第三步:配置文件读取位置记录,避免重启重复读取
调整Logstash的file输入插件配置,增加sincedb记录,防止每次重启都从头读取已处理的文件:input { file { path => "/你的csv文件路径/*.csv" start_position => "beginning" # 配置sincedb存储路径,记录文件读取偏移量 sincedb_path => "/你的logstash配置路径/sincedb_jmeter" } } - 第四步:验证解析逻辑
可以先将Elasticsearch输出替换为控制台输出,确认解析后的字段值符合预期后再写入ES:output { stdout { codec => rubydebug } # 验证无误后再开启ES输出 # elasticsearch { # hosts => ["你的ES地址:9200"] # index => "jmeter-report" # document_type => "doc" # } }
内容的提问来源于stack exchange,提问作者Rémy.W
相关产品推荐
相关产品推荐

