mirror of
https://github.com/grafana/grafana.git
synced 2025-02-16 18:34:52 -06:00
* bring in source from database
* bring in transformations from database
* add regex transformations to scopevar
* Consolidate types, add better example, cleanup
* Add var only if match
* Change ScopedVar to not require text, do not leak transformation-made variables between links
* Add mappings and start implementing logfmt
* Add mappings and start implementing logfmt
* Remove mappings, turn off global regex
* Add example yaml and omit transformations if empty
* Fix the yaml
* Add logfmt transformation
* Cleanup transformations and yaml
* add transformation field to FE types and use it, safeStringify logfmt values
* Add tests, only safe stringify if non-string, fix bug with safe stringify where it would return empty string with false value
* Add test for transformation field
* Do not add null transformations object
* Add provisioning (to be removed) and show log lines with links
* Only display links if change to query was made
* Break out transformation logic, add tests to backend code
* Fix lint errors I understand 😅
* Fix the backend lint error
* Remove unnecessary code and mark new Transformations object as internal
* Add support for named capture groups
* Remove type assertion
* Remove variable name from transformation
* Add test for overriding regexes
* Add back variable name field, but change to mapValue
* fix go api test
* Change transformation types to enum, add better provisioning checks for bad type name and format
* Change transformation types to enum, add better provisioning checks for bad type name and format
* Check for expression with regex transformations
* Remove isInterpolated variable, add option to always use format function
* Add template variable check to links
* Use new functions
* Filter log line at render, remove extra createSpanLink imports
* Add scrollable to long log messages
* Remove test that is no longer accurate
* Remove test correlation
* Add tests, fix duplicate key issue
* WIP: show log line links key/value pairs
* Some not great style changes
* Change LogDetailsRow for better multi value formatting
* Cleanup
* Add additional information around variable regex, implement PR feedback
* Display name with fieldPath if applicable
* Add variables with fieldPaths to test
* Count empty string as undefined variable
* Add better commented version of function, fix tests by removing new variable
* Modify when links show
* Remove sample yaml
* If a link has no variables, set value to field name, and some formatting issues
* Add comments and change variable names to be more clear, add back logic where needed, add test coverage for new scenario
* Fix formatting of replaceInVariableRegex comment
* Remove changes from Grafana-data, move logic into explore
* Rename function and property to match similar format
* Move types to type files and consolidate definitions, rename functions, change field definitions to accept arrays of keys/values, move function to parser, hide actions on multi key/value rows
* Add tests to logParser’s new function
79 lines
2.4 KiB
TypeScript
79 lines
2.4 KiB
TypeScript
import { ScopedVars, TimeRange, TypedVariableModel } from '@grafana/data';
|
|
import { TemplateSrv } from '@grafana/runtime';
|
|
|
|
import { variableRegex } from '../variables/utils';
|
|
|
|
/**
|
|
* Mock for TemplateSrv where you can just supply map of key and values and it will do the interpolation based on that.
|
|
* For simple tests whether you your data source for example calls correct replacing code.
|
|
*
|
|
* This is implementing TemplateSrv interface but that is not enough in most cases. Datasources require some additional
|
|
* methods and usually require TemplateSrv class directly instead of just the interface which probably should be fixed
|
|
* later on.
|
|
*/
|
|
export class TemplateSrvMock implements TemplateSrv {
|
|
private regex = variableRegex;
|
|
constructor(private variables: Record<string, string>) {}
|
|
|
|
getVariables(): TypedVariableModel[] {
|
|
return Object.keys(this.variables).map((key) => {
|
|
return {
|
|
type: 'custom',
|
|
name: key,
|
|
label: key,
|
|
};
|
|
// TODO: we remove this type assertion in a later PR
|
|
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
}) as TypedVariableModel[];
|
|
}
|
|
|
|
replace(target?: string, scopedVars?: ScopedVars, format?: string | Function): string {
|
|
if (!target) {
|
|
return target ?? '';
|
|
}
|
|
|
|
this.regex.lastIndex = 0;
|
|
|
|
return target.replace(this.regex, (match, var1, var2, fmt2, var3, fieldPath, fmt3) => {
|
|
const variableName = var1 || var2 || var3;
|
|
return this.variables[variableName];
|
|
});
|
|
}
|
|
|
|
getAllVariablesInTarget(target: string, scopedVars: ScopedVars): Record<string, string> {
|
|
const regexp = new RegExp(this.regex);
|
|
const values: Record<string, string> = {};
|
|
|
|
target.replace(regexp, (match, var1, var2, fmt2, var3, fieldPath) => {
|
|
const variableName = var1 || var2 || var3;
|
|
values[variableName] = this.variables[variableName];
|
|
|
|
// Don't care about the result anyway
|
|
return '';
|
|
});
|
|
|
|
return values;
|
|
}
|
|
|
|
getVariableName(expression: string) {
|
|
this.regex.lastIndex = 0;
|
|
const match = this.regex.exec(expression);
|
|
if (!match) {
|
|
return null;
|
|
}
|
|
return match.slice(1).find((match) => match !== undefined);
|
|
}
|
|
|
|
containsTemplate(target: string | undefined): boolean {
|
|
if (!target) {
|
|
return false;
|
|
}
|
|
|
|
this.regex.lastIndex = 0;
|
|
const match = this.regex.exec(target);
|
|
return match !== null;
|
|
}
|
|
|
|
updateTimeRange(timeRange: TimeRange) {}
|
|
}
|