Insertion de données dans ElasticSearch

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.

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.