diff --git a/public/app/features/plugins/built_in_plugins.ts b/public/app/features/plugins/built_in_plugins.ts index a0cedb3ebfd..c4621fda289 100644 --- a/public/app/features/plugins/built_in_plugins.ts +++ b/public/app/features/plugins/built_in_plugins.ts @@ -4,7 +4,7 @@ import * as elasticsearchPlugin from 'app/plugins/datasource/elasticsearch/modul import * as opentsdbPlugin from 'app/plugins/datasource/opentsdb/module'; import * as grafanaPlugin from 'app/plugins/datasource/grafana/module'; import * as influxdbPlugin from 'app/plugins/datasource/influxdb/module'; -import * as loggingPlugin from 'app/plugins/datasource/logging/module'; +import * as lokiPlugin from 'app/plugins/datasource/loki/module'; import * as mixedPlugin from 'app/plugins/datasource/mixed/module'; import * as mysqlPlugin from 'app/plugins/datasource/mysql/module'; import * as postgresPlugin from 'app/plugins/datasource/postgres/module'; @@ -33,7 +33,7 @@ const builtInPlugins = { 'app/plugins/datasource/opentsdb/module': opentsdbPlugin, 'app/plugins/datasource/grafana/module': grafanaPlugin, 'app/plugins/datasource/influxdb/module': influxdbPlugin, - 'app/plugins/datasource/logging/module': loggingPlugin, + 'app/plugins/datasource/loki/module': lokiPlugin, 'app/plugins/datasource/mixed/module': mixedPlugin, 'app/plugins/datasource/mysql/module': mysqlPlugin, 'app/plugins/datasource/postgres/module': postgresPlugin, diff --git a/public/app/plugins/datasource/logging/README.md b/public/app/plugins/datasource/logging/README.md deleted file mode 100644 index 33372605973..00000000000 --- a/public/app/plugins/datasource/logging/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Grafana Logging Datasource - Native Plugin - -This is a **built in** datasource that allows you to connect to Grafana's logging service. \ No newline at end of file diff --git a/public/app/plugins/datasource/logging/module.ts b/public/app/plugins/datasource/logging/module.ts deleted file mode 100644 index da00edbf40f..00000000000 --- a/public/app/plugins/datasource/logging/module.ts +++ /dev/null @@ -1,15 +0,0 @@ -import Datasource from './datasource'; - -import LoggingStartPage from './components/LoggingStartPage'; -import LoggingQueryField from './components/LoggingQueryField'; - -export class LoggingConfigCtrl { - static templateUrl = 'partials/config.html'; -} - -export { - Datasource, - LoggingConfigCtrl as ConfigCtrl, - LoggingQueryField as ExploreQueryField, - LoggingStartPage as ExploreStartPage, -}; diff --git a/public/app/plugins/datasource/loki/README.md b/public/app/plugins/datasource/loki/README.md new file mode 100644 index 00000000000..222b7e432eb --- /dev/null +++ b/public/app/plugins/datasource/loki/README.md @@ -0,0 +1,3 @@ +# Loki Datasource - Native Plugin + +This is a **built in** datasource that allows you to connect to the Loki logging service. diff --git a/public/app/plugins/datasource/logging/components/LoggingCheatSheet.tsx b/public/app/plugins/datasource/loki/components/LokiCheatSheet.tsx similarity index 96% rename from public/app/plugins/datasource/logging/components/LoggingCheatSheet.tsx rename to public/app/plugins/datasource/loki/components/LokiCheatSheet.tsx index 4dbf8d1ab89..01c6519916d 100644 --- a/public/app/plugins/datasource/logging/components/LoggingCheatSheet.tsx +++ b/public/app/plugins/datasource/loki/components/LokiCheatSheet.tsx @@ -15,7 +15,7 @@ const CHEAT_SHEET_ITEMS = [ export default (props: any) => (
-

Logging Cheat Sheet

+

Loki Cheat Sheet

{CHEAT_SHEET_ITEMS.map(item => (
{item.title}
diff --git a/public/app/plugins/datasource/logging/components/LoggingQueryField.tsx b/public/app/plugins/datasource/loki/components/LokiQueryField.tsx similarity index 94% rename from public/app/plugins/datasource/logging/components/LoggingQueryField.tsx rename to public/app/plugins/datasource/loki/components/LokiQueryField.tsx index 5667bd9a20d..005706bb8d1 100644 --- a/public/app/plugins/datasource/logging/components/LoggingQueryField.tsx +++ b/public/app/plugins/datasource/loki/components/LokiQueryField.tsx @@ -49,7 +49,7 @@ interface CascaderOption { disabled?: boolean; } -interface LoggingQueryFieldProps { +interface LokiQueryFieldProps { datasource: any; error?: string | JSX.Element; hint?: any; @@ -60,16 +60,16 @@ interface LoggingQueryFieldProps { onQueryChange?: (value: DataQuery, override?: boolean) => void; } -interface LoggingQueryFieldState { +interface LokiQueryFieldState { logLabelOptions: any[]; syntaxLoaded: boolean; } -class LoggingQueryField extends React.PureComponent { +class LokiQueryField extends React.PureComponent { plugins: any[]; languageProvider: any; - constructor(props: LoggingQueryFieldProps, context) { + constructor(props: LokiQueryFieldProps, context) { super(props, context); if (props.datasource.languageProvider) { @@ -208,8 +208,8 @@ class LoggingQueryField extends React.PureComponent {error ?
{error}
: null} @@ -229,4 +229,4 @@ class LoggingQueryField extends React.PureComponent void; } -export default class LoggingStartPage extends PureComponent { +export default class LokiStartPage extends PureComponent { render() { return (
- +
); } diff --git a/public/app/plugins/datasource/loki/datasource.test.ts b/public/app/plugins/datasource/loki/datasource.test.ts new file mode 100644 index 00000000000..ddb4d6ed549 --- /dev/null +++ b/public/app/plugins/datasource/loki/datasource.test.ts @@ -0,0 +1,98 @@ +import LokiDatasource from './datasource'; + +describe('LokiDatasource', () => { + const instanceSettings = { + url: 'myloggingurl', + }; + + describe('when performing testDataSource', () => { + let ds; + let result; + + describe('and call succeeds', () => { + beforeEach(async () => { + const backendSrv = { + async datasourceRequest() { + return Promise.resolve({ + status: 200, + data: { + values: ['avalue'], + }, + }); + }, + }; + ds = new LokiDatasource(instanceSettings, backendSrv, {}); + result = await ds.testDatasource(); + }); + + it('should return successfully', () => { + expect(result.status).toBe('success'); + }); + }); + + describe('and call fails with 401 error', () => { + beforeEach(async () => { + const backendSrv = { + async datasourceRequest() { + return Promise.reject({ + statusText: 'Unauthorized', + status: 401, + data: { + message: 'Unauthorized', + }, + }); + }, + }; + ds = new LokiDatasource(instanceSettings, backendSrv, {}); + result = await ds.testDatasource(); + }); + + it('should return error status and a detailed error message', () => { + expect(result.status).toEqual('error'); + expect(result.message).toBe('Loki: Unauthorized. 401. Unauthorized'); + }); + }); + + describe('and call fails with 404 error', () => { + beforeEach(async () => { + const backendSrv = { + async datasourceRequest() { + return Promise.reject({ + statusText: 'Not found', + status: 404, + data: '404 page not found', + }); + }, + }; + ds = new LokiDatasource(instanceSettings, backendSrv, {}); + result = await ds.testDatasource(); + }); + + it('should return error status and a detailed error message', () => { + expect(result.status).toEqual('error'); + expect(result.message).toBe('Loki: Not found. 404. 404 page not found'); + }); + }); + + describe('and call fails with 502 error', () => { + beforeEach(async () => { + const backendSrv = { + async datasourceRequest() { + return Promise.reject({ + statusText: 'Bad Gateway', + status: 502, + data: '', + }); + }, + }; + ds = new LokiDatasource(instanceSettings, backendSrv, {}); + result = await ds.testDatasource(); + }); + + it('should return error status and a detailed error message', () => { + expect(result.status).toEqual('error'); + expect(result.message).toBe('Loki: Bad Gateway. 502'); + }); + }); + }); +}); diff --git a/public/app/plugins/datasource/logging/datasource.ts b/public/app/plugins/datasource/loki/datasource.ts similarity index 88% rename from public/app/plugins/datasource/logging/datasource.ts rename to public/app/plugins/datasource/loki/datasource.ts index fca49a2f253..ebe1e226a75 100644 --- a/public/app/plugins/datasource/logging/datasource.ts +++ b/public/app/plugins/datasource/loki/datasource.ts @@ -27,7 +27,7 @@ function serializeParams(data: any) { .join('&'); } -export default class LoggingDatasource { +export default class LokiDatasource { languageProvider: LanguageProvider; /** @ngInject */ @@ -94,7 +94,7 @@ export default class LoggingDatasource { } metadataRequest(url) { - // HACK to get label values for {job=|}, will be replaced when implementing LoggingQueryField + // HACK to get label values for {job=|}, will be replaced when implementing LokiQueryField const apiUrl = url.replace('v1', 'prom'); return this._request(apiUrl, { silent: true }).then(res => { const data = { data: { data: res.data.values || [] } }; @@ -136,11 +136,27 @@ export default class LoggingDatasource { } return { status: 'error', - message: 'Data source connected, but no labels received. Verify that logging is configured properly.', + message: 'Data source connected, but no labels received. Verify that Loki is configured properly.', }; }) .catch(err => { - return { status: 'error', message: err.message }; + let message = 'Loki: '; + if (err.statusText) { + message += err.statusText; + } else { + message += 'Cannot connect to Loki'; + } + + if (err.status) { + message += `. ${err.status}`; + } + + if (err.data && err.data.message) { + message += `. ${err.data.message}`; + } else if (err.data) { + message += `. ${err.data}`; + } + return { status: 'error', message: message }; }); } } diff --git a/public/app/plugins/datasource/logging/img/grafana_icon.svg b/public/app/plugins/datasource/loki/img/grafana_icon.svg similarity index 100% rename from public/app/plugins/datasource/logging/img/grafana_icon.svg rename to public/app/plugins/datasource/loki/img/grafana_icon.svg diff --git a/public/app/plugins/datasource/loki/img/loki_icon.svg b/public/app/plugins/datasource/loki/img/loki_icon.svg new file mode 100644 index 00000000000..50199611c06 --- /dev/null +++ b/public/app/plugins/datasource/loki/img/loki_icon.svg @@ -0,0 +1,216 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/app/plugins/datasource/logging/language_provider.test.ts b/public/app/plugins/datasource/loki/language_provider.test.ts similarity index 100% rename from public/app/plugins/datasource/logging/language_provider.test.ts rename to public/app/plugins/datasource/loki/language_provider.test.ts diff --git a/public/app/plugins/datasource/logging/language_provider.ts b/public/app/plugins/datasource/loki/language_provider.ts similarity index 99% rename from public/app/plugins/datasource/logging/language_provider.ts rename to public/app/plugins/datasource/loki/language_provider.ts index a992084159a..dd3b4885ea5 100644 --- a/public/app/plugins/datasource/logging/language_provider.ts +++ b/public/app/plugins/datasource/loki/language_provider.ts @@ -36,7 +36,7 @@ export function addHistoryMetadata(item: CompletionItem, history: HistoryItem[]) }; } -export default class LoggingLanguageProvider extends LanguageProvider { +export default class LokiLanguageProvider extends LanguageProvider { labelKeys?: { [index: string]: string[] }; // metric -> [labelKey,...] labelValues?: { [index: string]: { [index: string]: string[] } }; // metric -> labelKey -> [labelValue,...] logLabelOptions: any[]; diff --git a/public/app/plugins/datasource/loki/module.ts b/public/app/plugins/datasource/loki/module.ts new file mode 100644 index 00000000000..41847855c2f --- /dev/null +++ b/public/app/plugins/datasource/loki/module.ts @@ -0,0 +1,15 @@ +import Datasource from './datasource'; + +import LokiStartPage from './components/LokiStartPage'; +import LokiQueryField from './components/LokiQueryField'; + +export class LokiConfigCtrl { + static templateUrl = 'partials/config.html'; +} + +export { + Datasource, + LokiConfigCtrl as ConfigCtrl, + LokiQueryField as ExploreQueryField, + LokiStartPage as ExploreStartPage, +}; diff --git a/public/app/plugins/datasource/logging/partials/config.html b/public/app/plugins/datasource/loki/partials/config.html similarity index 100% rename from public/app/plugins/datasource/logging/partials/config.html rename to public/app/plugins/datasource/loki/partials/config.html diff --git a/public/app/plugins/datasource/logging/plugin.json b/public/app/plugins/datasource/loki/plugin.json similarity index 54% rename from public/app/plugins/datasource/logging/plugin.json rename to public/app/plugins/datasource/loki/plugin.json index 9aa844f21cb..86b26a6a589 100644 --- a/public/app/plugins/datasource/logging/plugin.json +++ b/public/app/plugins/datasource/loki/plugin.json @@ -1,28 +1,28 @@ { "type": "datasource", - "name": "Grafana Logging", - "id": "logging", + "name": "Loki", + "id": "loki", "metrics": false, "alerting": false, "annotations": false, "logs": true, "explore": true, "info": { - "description": "Grafana Logging Data Source for Grafana", + "description": "Loki Logging Data Source for Grafana", "author": { "name": "Grafana Project", "url": "https://grafana.com" }, "logos": { - "small": "img/grafana_icon.svg", - "large": "img/grafana_icon.svg" + "small": "img/loki_icon.svg", + "large": "img/loki_icon.svg" }, "links": [ { - "name": "Grafana Logging", - "url": "https://grafana.com/" + "name": "Loki", + "url": "https://github.com/grafana/loki" } ], "version": "5.3.0" } -} \ No newline at end of file +} diff --git a/public/app/plugins/datasource/logging/query_utils.test.ts b/public/app/plugins/datasource/loki/query_utils.test.ts similarity index 100% rename from public/app/plugins/datasource/logging/query_utils.test.ts rename to public/app/plugins/datasource/loki/query_utils.test.ts diff --git a/public/app/plugins/datasource/logging/query_utils.ts b/public/app/plugins/datasource/loki/query_utils.ts similarity index 100% rename from public/app/plugins/datasource/logging/query_utils.ts rename to public/app/plugins/datasource/loki/query_utils.ts diff --git a/public/app/plugins/datasource/logging/result_transformer.test.ts b/public/app/plugins/datasource/loki/result_transformer.test.ts similarity index 100% rename from public/app/plugins/datasource/logging/result_transformer.test.ts rename to public/app/plugins/datasource/loki/result_transformer.test.ts diff --git a/public/app/plugins/datasource/logging/result_transformer.ts b/public/app/plugins/datasource/loki/result_transformer.ts similarity index 100% rename from public/app/plugins/datasource/logging/result_transformer.ts rename to public/app/plugins/datasource/loki/result_transformer.ts diff --git a/public/app/plugins/datasource/logging/syntax.ts b/public/app/plugins/datasource/loki/syntax.ts similarity index 100% rename from public/app/plugins/datasource/logging/syntax.ts rename to public/app/plugins/datasource/loki/syntax.ts