Parse integer and show in timeline in Kibana - elasticsearch

Here is the Kibana UI and I want to parse some Integer in the message. The number in the end of message is the process time for one method and I what to visualize the average process time by hour in Kibana. Is that possible?
I tried some conf in logstash:
filter{
json{
source => "message"
}
grok {
match => {
"message" => "^Finish validate %{NUMBER:cto_validate_time}$"
}
}
grok {
match => {
"message" => "^Finish customize %{NUMBER:cto_customize_time}$"
}
}
}
It works. But when I create the timechart I can not get the new field.

Since you don't care about performance issues, you may create a scripted field named process_time in your index pattern with the following painless code. What it does is simply take the last numerical value from your message field.
def m = /.*\s(\d+)$/.matcher(doc['message.keyword'].value);
if ( m.matches() ) {
return m.group(1)
} else {
return 0
}
Then you can build a chart to show the average process time by hour. Go to the Visualize tab and create a new vertical bar chart. On the Y-Axis you'll create an Average aggregation on the process_time field and on the X-Axis you'll use a Date histogram aggregation on your timestamp field. A sample is shown below:
Note: You also need to add the following line in your elasticsearch.yml file and restart ES:
script.painless.regex.enabled: true
UPDATE
If you want to do it via Logstash you can add the following grok filter
filter{
grok {
match => {
"message" => "^Finish customize in controller %{NUMBER:cto_customize_time}$"
}
}
mutate {
convert => { "cto_customize_time" => "integer" }
}
}

Related

Extract a value from #Message as float in logsearch and in Kibana calculate the sum from that extracted value

I have a value in my #message part that I need to extract out and then provide the sum of that value for that day. I have written below in my filters-default.conf file
if "NETAMT" in [#message] {
grok {
match => { "#message" => "<NETAMT>(?<NETAMT>.*?)<\/NETAMT>" }
}
mutate {
convert => [ "NETAMT", "float" ]
}
}
The field starts appearing in the Kibana UI [![NETAMT Field][1]][1][1]: https://i.stack.imgur.com/r3uHH.jpg
Now when I am trying to sum it using STATS panel, it always gives 0.
[![Panel Setting][1]][1][1]: https://i.stack.imgur.com/RWNQv.jpg
[![Stats Data][1]][1][1]: https://i.stack.imgur.com/QTthu.jpg
Can anyone help here, please?
This got resolved after refreshing the index through kibana so that the new field becomes indexable and searchable.

Can we extract numeric values from string through script in kibana?

I need to extract numeric values from string and store in new field..Can we do this through scripted field?
Ex: 1 hello 3 test
I need to extract 1 and 3.
You can do this through logstash if you are using elasticsearch.
Run a logstash process with a config like
input {
elasticsearch {
hosts => "your_host"
index => "your_index"
query => "{ "query": { "match_all": {} } }"
}
}
filter {
grok {
match => { "your_string_field" => "%{NUMBER:num1} %{GREEDYDATA:middle_stuff} %{NUMBER:num2} %{GREEDYDATA:other_stuff}" }
}
mutate {
remove_field => ["middle_stuff", "other_stuff"]
}
}
output{
elasticsearch {
host => "yourhost"
index => "your index"
document_id => %{id}
}
}
This would essentially overwrite each document in your index with two more fields, num1 and num2 that correspond to the numbers that you are looking for. This is just a quick and dirty approach that would take up more memory, but would allow you to do all of the break up at one time instead of at visualization time.
I am sure there is a way to do this with scripting, look into groovy regex matching where you return a specific group.
Also no guarantee my config representation is correct as I don't have time to test it at the moment.
Have a good day!

Logstash: error for querying elasticsearch

Hello everyone,
Through logstash, I want to query elasticsearch in order to get fields from previous events and do some computation with fields of my current event and add new fields. Here is what I did:
input file:
{"device":"device1","count":5}
{"device":"device2","count":11}
{"device":"device1","count":8}
{"device":"device3","count":100}
{"device":"device3","count":95}
{"device":"device3","count":155}
{"device":"device2","count":15}
{"device":"device1","count":55}
My expected output:
{"device":"device1","count":5,"previousCount=0","delta":0}
{"device":"device2","count":11,"previousCount=0","delta":0}
{"device":"device1","count":8,"previousCount=5","delta":3}
{"device":"device3","count":100,"previousCount=0","delta":0}
{"device":"device3","count":95,"previousCount=100","delta":-5}
{"device":"device3","count":155,"previousCount=95","delta":60}
{"device":"device2","count":15,"previousCount=11","delta":4}
{"device":"device1","count":55,"previousCount=8","delta":47}
Logstash filter part:
filter {
elasticsearch {
hosts => ["localhost:9200/device"]
query => 'device:"%{[device]}"'
sort => "#timestamp:desc"
fields => ['count','previousCount']
}
if [previousCount]{
ruby {
code => "event[delta] = event[count] - event[previousCount]"
}
}
else{
mutate {
add_field => { "previousCount" => "0" }
add_field => { "delta" => "0" }
}
}
}
My problem:
For every line of my input file I got the following error : Failed to query elasticsearch for previous event ..
It seems that every line completely treated is not put in elasticsearch before logstash starts to treat the next line.
I don't know if my conclusion is correct and, if yes, why it happens.
So, do you know how I could solve this problem please ?!
Thank you for your attention and your help.
S

How to find documents which are causing mapping conflict in Elasticsearch

I have following Logstash filter:
...
if [type] == "binarysize" {
if ([file] =~ /svn/) {
drop {} }
grok {
match => {
"file" => "\A/home/data/binaries_size_stats/%{WORD:branch}/%{WORD:binary}/%{WORD:architecture}/%{WORD}"
}
}
grok {
match => {
"message" => "\A%{INT:commit_number},%{INT:binary_size},%{TIMESTAMP_ISO8601:date_and_time_of_commit}"
}
}
date {
match => ["date_and_time_of_commit", "ISO8601"]
#timezone => "CET"
}
}
...
I started it, pushed some data into Elasticsearch, did some plots in Kibana and left everything working nicely for the weekend.
When I returned, my plots are not updated with new data and I receive constant "14 Courier Fetch: 15 of 2465 shards failed." message no matter how much I reload page in browser.
After reloading field list I found that I have one conflict in "binary_size" field. I was plotting data based on this field, so my guess is that something weird happened over weekend with new documents pushed to Elasticsearch by Logstash.
My question is: "How can I find those documents with conflicting fields?". Or what should I do alternatively to be able to plot fresh data again.

Logstash float field does not been indexed

The following is the configuration of logstash. When I input log into logstash, it works well as expected. All the field can be accepted by elasticsearch and the value and type of all fields is correct. However, when I view the log in kinana, it says that the cost field is not indexed so that it can't been visualized. While all the string fields are indexed. I want to visualize my float field. Anyone know what's the problem?
input {
syslog {
facility_labels=>["local0"]
port=>515
}
stdin {}
}
filter{
grok {
overwrite => ["host", "message"]
match => { "message" => " %{BASE10NUM:cost} %{GREEDYDATA:message}" }
}
mutate {
convert => { "cost" => "float" }
}
}
output {
stdout{
codec=>rubydebug
}
elasticsearch{ }
}
Kibana doesn't autoreload a new field from Elastic Search. You need to reload it manually.
So you go in the Settings tab, select you index and reload the fields

Resources