Grafana 日志插件不显示日志面板

问题描述

我正在尝试创建一个支持日志面板的 Grafana 插件。我正在关注directions from their website

不幸的是,它似乎不起作用。我已将 "logs": true 添加plugin.json 并返回 time 类型的字段,称为 "time"string 类型的字段称为 "level",以及一个名为 string"content" 类型字段,以及它们的示例。我返回的内容与示例中显示内容基本相同。

export class DataSource extends DataSourceApi<MyQuery,MyDataSourceOptions> {
  constructor(instanceSettings: DataSourceInstanceSettings<MyDataSourceOptions>) {
    super(instanceSettings);
  }

  async query(options: DataQueryRequest<MyQuery>): Promise<DataQueryResponse> {
    // Return a constant for each query.
    const data = options.targets.map(target => {
      const query = defaults(target,defaultQuery);
      const frame = new MutableDataFrame({
        refId: query.refId,fields: [
          { name: 'time',type: FieldType.time },{ name: 'level',type: FieldType.string },{ name: 'content',],});
      frame.add({ time: 1615422190000,level: 'warn',content: 'hi' });
      frame.add({ time: 1615422191000,level: 'info',content: 'bye' });
      return frame;
    });

    return { data };
  }

  async testDatasource() {
    // Implement a health check for your data source.
    return {
      status: 'success',message: 'Success',};
  }
}

然而在 Grafana(运行最新的稳定版本,7.4.3)中,当我加载我的插件时,如果我选择了显示数据但不正确的日志面板,我将无法在浏览器和仪表板查询界面中获取日志面板:

broken grafana logs panel

我还需要做些什么才能使日志面板正常工作吗?说明声称我只需要返回一个 time 类型的字段和一个 string 类型的字段,其中 "logs": true 设置在 plugin.json 中,但这不起作用。

到目前为止我能找到的唯一真正的提示this other SO question about the MSSQL plugin,这表明 something about this function in that plugin 可能会显示数据需要如何格式化,但我在阅读源代码时不清楚这可能是什么以及它与我现在所做的有何不同。

ETA:看起来 this question 询问了类似的问题,但答案并没有说明问题是什么,因为在他们的情况下,他们似乎返回了完全错误类型的结果。

解决方法

我想出了一部分答案。有必要在 MutableDataFrame 中包含以下内容:

meta: {
  preferredVisualisationType: 'logs',},

让它在探索中“激活”。但是,我认为这不是全部答案,因为该视图在 Dashboard 面板中仍如问题中所述,并且在 Explore 视图中仍然有效,但默认情况下不会拉出任何字段进行显示;必须通过打开日志行并单击眼睛图标使字段可见来手动打开它们。

ETA:好的,关于为什么视图显示损坏的其余答案是因为日志可视化如何决定显示哪些数据。它是 in the docs 但可能没有像它应该的那样清楚地被叫出来。它说:

如果一个数据框有多个文本字段,那么 Grafana 会假定数据框中的第一个字段是实际的日志行。任何后续文本字段都被视为检测到的字段。

所以数据的格式需要一定的方式,特别是第一个字符串字段需要是“消息”才能显示。它看起来像上面那样,因为我将 level 放在 content 之前。扭转这些使其按预期工作。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...