diff --git a/docs/sources/features/datasources/loki.md b/docs/sources/features/datasources/loki.md index b2c8a759ed3..00d6aa2aefb 100755 --- a/docs/sources/features/datasources/loki.md +++ b/docs/sources/features/datasources/loki.md @@ -59,7 +59,7 @@ The new field with the link shown in log details: ## Querying Logs -Querying and displaying log data from Loki is available via [Explore]({{< relref "../explore" >}}), and with the [logs panel]({{< relref "../../panels/visualizations/logs-panel.md" >}}) in dashboards. Select the Loki data source, and then enter a log query to display your logs. +Querying and displaying log data from Loki is available via [Explore]({{< relref "../explore" >}}), and with the [logs panel]({{< relref "../../panels/visualizations/logs-panel.md" >}}) in dashboards. Select the Loki data source, and then enter a [LogQL](https://github.com/grafana/loki/blob/master/docs/logql.md) query to display your logs. ### Log Queries diff --git a/public/app/plugins/datasource/loki/datasource.test.ts b/public/app/plugins/datasource/loki/datasource.test.ts index c01ffac02c2..442232888bd 100644 --- a/public/app/plugins/datasource/loki/datasource.test.ts +++ b/public/app/plugins/datasource/loki/datasource.test.ts @@ -189,6 +189,33 @@ describe('LokiDatasource', () => { expect(dataFrame.meta?.limit).toBe(20); expect(dataFrame.meta?.searchWords).toEqual(['foo']); }); + + test('should return custom error message when Loki returns escaping error', async () => { + const customData = { ...(instanceSettings.jsonData || {}), maxLines: 20 }; + const customSettings = { ...instanceSettings, jsonData: customData }; + const ds = new LokiDatasource(customSettings, templateSrvMock); + + datasourceRequestMock.mockImplementation( + jest.fn().mockReturnValueOnce( + Promise.reject({ + data: 'parse error at line 1, col 6: invalid char escape', + status: 400, + statusText: 'Bad Request', + }) + ) + ); + const options = getQueryOptions({ + targets: [{ expr: '{job="gra\\fana"}', refId: 'B' }], + }); + + try { + await ds.query(options).toPromise(); + } catch (err) { + expect(err.message).toBe( + 'Error: parse error at line 1, col 6: invalid char escape. Make sure that all special characters are escaped with \\. For more information on escaping of special characters visit LogQL documentation at https://github.com/grafana/loki/blob/master/docs/logql.md.' + ); + } + }); }); describe('When interpolating variables', () => { diff --git a/public/app/plugins/datasource/loki/datasource.ts b/public/app/plugins/datasource/loki/datasource.ts index dd006d448e1..283bfb07ac0 100644 --- a/public/app/plugins/datasource/loki/datasource.ts +++ b/public/app/plugins/datasource/loki/datasource.ts @@ -537,7 +537,11 @@ export class LokiDatasource extends DataSourceApi { if (err.data) { if (typeof err.data === 'string') { - error.message = err.data; + if (err.data.includes('escape') && target.expr.includes('\\')) { + error.message = `Error: ${err.data}. Make sure that all special characters are escaped with \\. For more information on escaping of special characters visit LogQL documentation at https://github.com/grafana/loki/blob/master/docs/logql.md.`; + } else { + error.message = err.data; + } } else if (err.data.error) { error.message = safeStringifyValue(err.data.error); }