blob: f601f5fef52d12d7337011cbafb07c0cf6a8077c [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Component, OnInit, Input, OnChanges, SimpleChanges, ViewChild, EventEmitter, Output} from '@angular/core';
import {SensorParserConfig} from '../../model/sensor-parser-config';
import {ParseMessageRequest} from '../../model/parse-message-request';
import {SensorParserConfigService} from '../../service/sensor-parser-config.service';
import {AutocompleteOption} from '../../model/autocomplete-option';
import {GrokValidationService} from '../../service/grok-validation.service';
import {SampleDataComponent} from '../../shared/sample-data/sample-data.component';
import {MetronAlerts} from '../../shared/metron-alerts';
@Component({
selector: 'metron-config-sensor-grok',
templateUrl: './sensor-grok.component.html',
styleUrls: ['./sensor-grok.component.scss']
})
export class SensorGrokComponent implements OnInit, OnChanges {
@Input() showGrok; boolean;
@Input() sensorParserConfig: SensorParserConfig;
@Input() grokStatement: string;
@Input() patternLabel: string;
@Output() hideGrok = new EventEmitter<void>();
@Output() onSaveGrokStatement = new EventEmitter<string>();
@Output() onSavePatternLabel = new EventEmitter<string>();
@ViewChild(SampleDataComponent) sampleData: SampleDataComponent;
newGrokStatement = '';
newPatternLabel = '';
availablePatternLabels = [];
parsedMessage: any = {};
parsedMessageKeys: string[] = [];
grokFunctionList: AutocompleteOption[] = [];
parseMessageRequest: ParseMessageRequest = new ParseMessageRequest();
constructor(private sensorParserConfigService: SensorParserConfigService, private grokValidationService: GrokValidationService,
private metronAlerts: MetronAlerts) {
this.parseMessageRequest.sampleData = '';
}
ngOnInit() {
this.getGrokFunctions();
}
ngOnChanges(changes: SimpleChanges) {
if (changes['showGrok'] && changes['showGrok'].currentValue) {
this.newPatternLabel = this.patternLabel;
if (this.grokStatement) {
this.newGrokStatement = this.grokStatement;
} else {
this.newGrokStatement = this.newPatternLabel + ' ';
}
this.getAvailablePatternLabels();
this.sampleData.getNextSample();
}
}
onSampleDataChanged(sampleData: string) {
if (sampleData) {
this.parseMessageRequest.sampleData = sampleData;
this.onTestGrokStatement();
}
}
onTestGrokStatement() {
this.parsedMessage = {};
if (this.newGrokStatement.indexOf('%{') === -1) {
return;
}
this.parseMessageRequest.sensorParserConfig = JSON.parse(JSON.stringify(this.sensorParserConfig));
this.parseMessageRequest.grokStatement = this.newGrokStatement;
this.parseMessageRequest.sensorParserConfig.parserConfig['patternLabel'] = this.newPatternLabel;
this.parseMessageRequest.sensorParserConfig.parserConfig['grokPath'] = './' + this.parseMessageRequest.sensorParserConfig.sensorTopic;
this.sensorParserConfigService.parseMessage(this.parseMessageRequest).subscribe(
result => {
this.parsedMessage = result;
this.setParsedMessageKeys();
}, error => {
this.metronAlerts.showErrorMessage(error.message);
this.setParsedMessageKeys();
});
}
private getGrokFunctions() {
this.grokValidationService.list().subscribe(result => {
Object.keys(result).forEach(name => {
let autocompleteOption: AutocompleteOption = new AutocompleteOption();
autocompleteOption.name = name;
this.grokFunctionList.push(autocompleteOption);
});
});
}
private setParsedMessageKeys() {
try {
this.parsedMessageKeys = Object.keys(this.parsedMessage).sort();
} catch (e) {
this.parsedMessageKeys = [];
}
}
onSaveGrok(): void {
this.onSaveGrokStatement.emit(this.newGrokStatement);
this.onSavePatternLabel.emit(this.newPatternLabel);
this.hideGrok.emit();
}
onCancelGrok(): void {
this.hideGrok.emit();
}
getAvailablePatternLabels() {
this.availablePatternLabels = [];
let statements = this.newGrokStatement.split('\n');
for (let statement of statements) {
if (statement) {
let patternLabel = statement.split(' ')[0];
this.availablePatternLabels.push(patternLabel);
}
}
}
isTestDisabled() {
return this.parseMessageRequest.sampleData.length === 0 || this.newGrokStatement.length === 0;
}
isSaveDisabled() {
return this.newGrokStatement.length === 0 || this.availablePatternLabels.indexOf(this.newPatternLabel) === -1;
}
}