热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

GrafanaTable插件源码阅读(进阶)前端视角

GrafanaTable插件源码阅读(进阶)-前端视角,Go语言社区,Golang程序员人脉社
前言

之前已经带大家阅读了 Grafana 入门、安装和命令 (mac) 和 Grafana 插件开发入门 - 前端视角(React)两片文章~

相信大家对于Grafana插件已经有了一个初步的认识,下一步,我们来进阶版,看下 table插件 的书写

 

 

Table源文件分析

源文件位置:https://github.com/grafana/grafana/tree/master/public/app/plugins/panel,主要分析的就是table 和 table2 文件

Table 和 Table2 的区别

Table 是Angular写的,Table2是react写的。

由于我日常用React比较多,所以选了table2

 

Table2 源码分析

文件目录分析

 

TablePanel.tsx (展示内容)

1. 主要使用了 @grafana/ui 中的 PanelProps, ThemeContext,Table

2. const { data, options } = this.props;  看到这句话,打印了一下,发现数据来源是 this.props.data.series[0]

// Libraries import React, { Component } from 'react'; // Types import { PanelProps, ThemeContext } from '@grafana/ui'; import { Options } from './types'; import Table from '@grafana/ui/src/components/Table/Table'; interface Props extends PanelProps {} export class TablePanel extends Component { constructor(props: Props) { super(props); } render() { const { data, options } = this.props; if (data.series.length <1) { return

No Table Data...
; } return ( {theme => } ); } }

 

TablePanelEditor.tsx (可编辑区域)

1.this.props.onOptionsChange 是内部定义的函数

2. showHeader, fixedHeader, rotate, fixedColumns 四个参数也是默认的传值

//// Libraries import _ from 'lodash'; import React, { PureComponent } from 'react'; // Types import { PanelEditorProps, Switch, FormField } from '@grafana/ui'; export class TablePanelEditor extends PureComponent { OnToggleShowHeader= () => { this.props.onOptionsChange({ ...this.props.options, showHeader: !this.props.options.showHeader }); }; OnToggleFixedHeader= () => { this.props.onOptionsChange({ ...this.props.options, fixedHeader: !this.props.options.fixedHeader }); }; OnToggleRotate= () => { this.props.onOptionsChange({ ...this.props.options, rotate: !this.props.options.rotate }); }; OnFixedColumnsChange= ({ target }: any) => { this.props.onOptionsChange({ ...this.props.options, fixedColumns: target.value }); }; render() { const { showHeader, fixedHeader, rotate, fixedColumns } = this.props.options; return (

Header
Display
); } }

types.ts(传入参数定义 + 默认值)

1.传入参数类型定义【估计是typescript的原因】

2.初始化时候的默认值设置

import { ColumnStyle } from '@grafana/ui/src/components/Table/TableCellBuilder'; export interface Options { showHeader: boolean; fixedHeader: boolean; fixedColumns: number; rotate: boolean; styles: ColumnStyle[]; } export const defaults: OptiOns= { showHeader: true, fixedHeader: true, fixedColumns: 0, rotate: false, styles: [ { type: 'date', pattern: 'Time', alias: 'Time', dateFormat: 'YYYY-MM-DD HH:mm:ss', }, { unit: 'short', type: 'number', alias: '', decimals: 2, colors: ['rgba(245, 54, 54, 0.9)', 'rgba(237, 129, 40, 0.89)', 'rgba(50, 172, 45, 0.97)'], pattern: '/.*/', thresholds: [], }, ], };

module.tsx (入口文件)

1.设置相关区域 - 目测是固定的格式

  A. setDefaults(默认值)

  B. setEditor (编辑器页面)

import { PanelPlugin } from '@grafana/ui'; import { TablePanelEditor } from './TablePanelEditor'; import { TablePanel } from './TablePanel'; import { Options, defaults } from './types'; export const plugin = new PanelPlugin (TablePanel).setDefaults(defaults).setEditor(TablePanelEditor);     我的修改

我需要的是类似于log的效果,左边是时间,右边是具体的日志,主要修改的内容是TablePanel.tsx,注释了TablePanelEditor.tsx的展示

 

修改后的样子展示

忽略我狂野的打码

 

TablePanel.tsx - 修改版

1. 主要修改了一下表格的返回顺序

// Libraries import React, { Component } from 'react'; // Types import { PanelProps, ThemeContext, Table } from '@grafana/ui'; import { Options } from './types'; import moment from 'moment'; import './index.css'; interface Props extends PanelProps {} export class TablePanel extends Component { constructor(props: Props) { super(props); } render() { const { data, options } = this.props; if (data.series.length <1) { return

No Table Data...
; } // 数据处理,把日期放在第一个 // 如果你们没有日期展示顺序问题的话,忽略 const rows = []; for (let i = 0; i { !!rows.length > 0 && rows.map((row, row_index, row_array) => { return
{ !!fields.length > 0 && fields.map((column, column_index, column_array) => { return
{ column.type === "time" && { moment(row[column_index]).format("YYYY-MM-DD HH:mm:ss") } } { column.type !== "time" && { row[column_index] } }
}, this) }
}, this) } ); } }

 

TablePanelEditor.tsx

注释相关无用内容,毕竟其实日志无需编辑

//// Libraries import React, { PureComponent } from 'react'; // Types import { PanelEditorProps, Switch, FormField } from '@grafana/ui'; import { Options } from './types'; export class TablePanelEditor extends PureComponent > { render() { return (

); } }

 

小插曲

本来以为开开心心的做完了,结果,因为线上版本是6.1.3的缘故不兼容。

我内心充满了拒绝。。只能呢硬着头皮看 table 插件的内容,table插件是Angular写的,如果大家对语法不熟悉的话,可以看下相关语法。

 

 

 

环境搭建+开发

我查了一下,相关几个demo支持的版本,最后选择clock-panel这个demo来进行操作

 

文件目录

和react或者angular文件不同的是,这个clock-panel 开放了webpack配置

 

plugin.json

当我看到,dependencies 依赖的 grafanaVersion 是 5.x.x ,我觉得就可以试一下了

{ "type": "panel", "name": "logs", "id": "grafana-logs-panel", "info": { "description": "Clock panel for grafana", "author": { "name": "Grafana Labs", "url": "https://grafana.com" }, "keywords": ["logs", "panel"], "logos": { "small": "img/logo.svg", "large": "img/logo.svg" }, "links": [ { "name": "Project site", "url": "https://github.com/grafana/clock-panel" }, { "name": "MIT License", "url": "https://github.com/grafana/clock-panel/blob/master/LICENSE" }], "version": "1.0.3", "updated": "2019-05-24" }, "dependencies": { "grafanaVersion": "5.x.x", "plugins": [] } }

 

修改后的文件目录

只留下了我用的文件

 

log_ctrl.ts(了解一下处理逻辑)

1. 事件监听函数 this.events.on('data-received', this.onDataReceived.bind(this)); 来更新一下,注入 data 的值

    事件监听函数参考(6.3.4做了一些封装):https://github.com/grafana/grafana/blob/master/packages/grafana-ui/src/types/events.ts

import { MetricsPanelCtrl } from 'grafana/app/plugins/sdk'; import moment from 'moment-timezone'; import './external/moment-duration-format'; import _ from 'lodash'; import './css/clock-panel.css'; export class LogCtrl extends MetricsPanelCtrl { static templateUrl = 'partials/module.html'; /** @ngInject */ constructor($scope, $injector) { super($scope, $injector); _.defaultsDeep(this.panel, this.panelDefaults); this.events.on('data-received', this.onDataReceived.bind(this)); this.events.on('data-snapshot-load', this.onDataReceived.bind(this)); this.events.on('panel-initialized', this.render.bind(this)); this.events.on('component-did-mount', this.render.bind(this)); this.events.on('render', this.render.bind(this)); } render() { console.log("this.data ,", this.data); } onDataReceived(dataList: any) { console.log("dataList, ",dataList); this.dataRaw = dataList; // let data = dataList[0].datapoints ; this.data = dataList[0].datapoints ; // this.data = []; // // 数据处理 for (let i = 0; i

module.html

两列展示,列1和列0换了下顺序

{{col[1]}}
{{col[0]}}

 

 

 

 

打包

执行打包命令,直接用 dist 目录的文件就OK啦~

npm run build

 

 

结束语

啦啦啦~~~ 终于结束啦~~~

我自己觉得Grafana的源码没有很难阅读,大家都可以去读一下~

插件也没有很难写~内置函数比较多,找不到的话全局查找一下就可以啦~


推荐阅读
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 开源Keras Faster RCNN模型介绍及代码结构解析
    本文介绍了开源Keras Faster RCNN模型的环境需求和代码结构,包括FasterRCNN源码解析、RPN与classifier定义、data_generators.py文件的功能以及损失计算。同时提供了该模型的开源地址和安装所需的库。 ... [详细]
  • Python已成为全球最受欢迎的编程语言之一,然而Python程序的安全运行存在一定的风险。本文介绍了Python程序安全运行需要满足的三个条件,即系统路径上的每个条目都处于安全的位置、"主脚本"所在的目录始终位于系统路径中、若python命令使用-c和-m选项,调用程序的目录也必须是安全的。同时,文章还提出了一些预防措施,如避免将下载文件夹作为当前工作目录、使用pip所在路径而不是直接使用python命令等。对于初学Python的读者来说,这些内容将有所帮助。 ... [详细]
  • Python15行代码实现免费发送手机短信,推送消息「建议收藏」
    Python15行代码实现免费发 ... [详细]
  • Flutter 布局(四) Baseline、FractionallySizedBox、IntrinsicHeight、IntrinsicWidth详解
    本文主要介绍Flutter布局中的Baseline、FractionallySizedBox、IntrinsicHeight、IntrinsicWidth四种控件,详细介绍了其布局 ... [详细]
  • https:github.comdarcyclarkeFront-end-Developer-Interview-QuestionstreemasterChinese#refere ... [详细]
  • 1.修改babelrc文件{presets:[es2015,react,stage-1],plugins:[transform-decorators-lega ... [详细]
author-avatar
玲子0909_366
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有