Bonjour,
Tout d'abord, voici mon objectif : Visualiser les données du Endpoint "metrics" d'une application SpringBoot.
On m'a demandé de réaliser cet objectif avec la suite ELK.
J'ai essayé de mettre en place cette solution avec Logstash et MetricBeat mais tout les deux m'indiquent le même message d'erreur lors de l'insertion des données dans ElasticSearch et je n'arrive pas à trouver de solution.
Voici ma configuration ;
SpringBoot : 1.4.3.RELEASE (ajout de la librairie Jolokia)
ELK : 5.5.0 + installation du plugin input-jmx pour logstash
Tout les éléments sont installés sur mon poste de travail Windows 8
Suite à la configuration pour le JMX dans logstash j'ai une exception RMI. Je me dis c'est pas grave, je vais essayer avec l'input Http_pool. Avec cette deuxième méthode, logstash arrive à communiquer avec mon application mais lors de l'insertion des données dans ElasticSearch j'ai une exception de mapping :
java.lang.IllegalArgumentException: Can't merge a non object mapping [value.clas
ses] with an object mapping [value.classes]
Voici mon fichier de config logstash :
input {
http_poller {
urls => {
"Data" =>
"http://localhost:XXXX/XXXXX/monitoring/jolokia/read/org.springframework.boot:name=metricsEndpoint,type=Endpoint/Data"
"OperatingSystem" => "http://localhost:XXXX/XXXXXX/monitoring/jolokia/read/java.lang:type=OperatingSystem"
}
request_timeout => 60
schedule => { every => "10s"}
codec => "json"
}
}
output {
elasticsearch { hosts => ["localhost:9200"] }
stdout { codec => rubydebug }
}
Apparemment le template utilisé par le module n'arrive pas à effectuer le mapping avec mes données.
Du coup, j'essaie l'outil MetricBeat qui a un plugin Jolokia. Le logiciel arrive à appeler mon application mais lors de l'insertion des données dans ElasticSearch j'ai la même erreur qu'avec logstash. Je tourne en rond, si le template n'arrive pas à lire mes données, je vais créer le mien. Suite à pas mal de recherche j'en suis arrivée à ce stade.
Mon fichier de configuration pour MetricBeat :
#========================== Modules configuration ============================
metricbeat.modules:
- module: jolokia
metricsets: ["jmx"]
enabled: true
period: 10s
hosts: ["localhost:XXXX"]
namespace: "test"
path: "XXXX/monitoring/jolokia/read"
jmx.mappings:
- mbean: 'org.springframework.boot:name=metricsEndpoint,type=Endpoint'
attributes:
- attr: Data
field: data
field_type: java.Object
# jmx.application:
# jmx.instance:
output.elasticsearch:
# Array of hosts to connect to.
hosts: ["localhost:9200"]
# index name for the application
index: "metric-springboot-test"
# template to use
template.name: "metric_springboot"
template.path: "metricbeat.template-metrics.json"
template.versions.2x.enabled: false
template.versions.6x.enabled: false
Mon fichier contenant mon template "metricbeat.template-metrics.json" :
{
"template": "metric-springboot-*",
"mappings": {
"_default_": {
"dynamic_templates": [
{
"data_value": {
"path_match": "jolokia.*.data.*",
"mapping": {
"type": "float",
"index": false
}
}
}
],
"properties": {
"@timestamp": {
"type": "date"
},
"beat": {
"properties": {
"hostname": {
"ignore_above": 1024,
"type": "keyword"
},
"name": {
"ignore_above": 1024,
"type": "keyword"
},
"version": {
"ignore_above": 1024,
"type": "keyword"
}
}
},
"metricset": {
"properties": {
"host": {
"ignore_above": 1024,
"type": "keyword"
},
"module": {
"ignore_above": 1024,
"type": "keyword"
},
"name": {
"ignore_above": 1024,
"type": "keyword"
},
"namespace": {
"ignore_above": 1024,
"type": "keyword"
},
"rtt": {
"type": "long"
}
}
},
"type": {
"ignore_above": 1024,
"type": "keyword"
}
}
}
}
}
Les données reçues (dans data je peux avoir plus de lignes suivant les metrics de l'instant T):
{
"@timestamp": "2017-07-17T10:09:50.248Z",
"beat": {
"hostname": "XXXX",
"name": "XXXX",
"version": "5.5.0"
},
"jolokia": {
"test": {
"data": {
"classes": 9203.000000,
"classes.loaded": 9203.000000,
"classes.unloaded": 0.000000,
"counter.status.200.jolokia.star-star": 1.000000,
"gauge.response.jolokia.star-star": 173.000000,
"gc.copy.count": 108.000000,
"gc.copy.time": 344.000000,
"gc.marksweepcompact.count": 3.000000,
"gc.marksweepcompact.time": 122.000000,
"heap": 253440.000000,
"heap.committed": 48804.000000,
"heap.init": 16384.000000,
"heap.used": 34625.000000,
"instance.uptime": 2826140.000000,
"mem": 81738.000000,
"mem.free": 14178.000000,
"nonheap": 0.000000,
"nonheap.committed": 34144.000000,
"nonheap.init": 160.000000,
"nonheap.used": 32934.000000,
"processors": 4.000000,
"systemload.average": -1.000000,
"threads": 21.000000,
"threads.daemon": 12.000000,
"threads.peak": 21.000000,
"threads.totalStarted": 25.000000,
"uptime": 2836409.000000
}
}
},
"metricset": {
"host": "localhost:XXXX",
"module": "jolokia",
"name": "jmx",
"namespace": "test",
"rtt": 83257
},
"type": "metricsets"
}
Maintenant, j'ai le message d'erreur :
org.elasticsearch.index.mapper.MapperParsingException: failed to parse
at org.elasticsearch.index.mapper.DocumentParser.wrapInMapperParsingExce
ption(DocumentParser.java:176) ~[elasticsearch-5.5.0.jar:5.5.0]
...
Caused by: java.lang.ClassCastException: org.elasticsearch.index.mapper.NumberFi
eldMapper cannot be cast to org.elasticsearch.index.mapper.ObjectMapper
Je découvre tout ces outils et j'ai certainement pas du comprendre l'un des principes fondamentaux.
Pourriez vous m'aider à configurer correctement l'une des solutions ?
Je vous remercie par avance de votre aide.