├── .github └── workflows │ └── action.yml ├── .gitignore ├── .husky └── .gitignore ├── .licenserc.yaml ├── .prettierignore ├── .prettierrc.json ├── LICENSE ├── README.md ├── comb_feats.js ├── favicon.svg ├── index.html ├── package-lock.json ├── package.json ├── plugins ├── PlusPlaceholder.tsx ├── md.ts ├── plusResolve.ts ├── svg.ts └── vite-plugin-prefix.ts ├── postcss.config.js ├── public ├── bound │ └── README.md ├── docs │ ├── alert-event-relabel │ │ ├── zh_CN.md │ │ ├── zh_HK.md │ │ └── zh_US.md │ ├── categraf │ │ ├── en_US.md │ │ ├── image01.png │ │ ├── ru_RU.md │ │ ├── zh_CN.md │ │ └── zh_HK.md │ ├── elasticsearch-template-variables │ │ ├── en_US.md │ │ ├── zh_CN.md │ │ └── zh_HK.md │ ├── notification-channel │ │ ├── flashduty-request │ │ │ ├── en_US.md │ │ │ ├── ja_JP.md │ │ │ ├── zh_CN.md │ │ │ └── zh_HK.md │ │ ├── http-request │ │ │ ├── en_US.md │ │ │ ├── ja_JP.md │ │ │ ├── zh_CN.md │ │ │ └── zh_HK.md │ │ ├── script-request │ │ │ ├── en_US.md │ │ │ ├── ja_JP.md │ │ │ ├── zh_CN.md │ │ │ └── zh_HK.md │ │ └── smtp-request │ │ │ ├── en_US.md │ │ │ ├── ja_JP.md │ │ │ ├── zh_CN.md │ │ │ └── zh_HK.md │ └── notification-template │ │ ├── en_US.md │ │ ├── ja_JP.md │ │ ├── zh_CN.md │ │ └── zh_HK.md ├── font │ ├── Monda-Regular.ttf │ ├── codicon.ttf │ └── iconfont.js ├── image │ ├── City.svg │ ├── avatar1.png │ ├── avatar2.png │ ├── avatar3.png │ ├── avatar4.png │ ├── avatar5.png │ ├── avatar6.png │ ├── avatar7.png │ ├── avatar8.png │ ├── customerServiceWX.png │ ├── dashboard │ │ ├── barGauge.svg │ │ ├── barchart.svg │ │ ├── gauge.svg │ │ ├── heatmap.svg │ │ ├── hexbin.svg │ │ ├── iframe.svg │ │ ├── pie.svg │ │ ├── row.svg │ │ ├── stat.svg │ │ ├── table.svg │ │ ├── text.svg │ │ └── timeseries.svg │ ├── default.png │ ├── favicon.ico │ ├── favicon.svg │ ├── login-dashboard.svg │ ├── login-left-top-corner.png │ ├── login-logo.png │ ├── login-right-bottom-corner.png │ ├── logo-dark.svg │ ├── logo-l.png │ ├── logo-l.svg │ ├── logo-light-l.png │ ├── logo-light.png │ ├── logo.png │ ├── logo.svg │ ├── logos │ │ ├── aliyun-sls.png │ │ ├── ck.png │ │ ├── cloudwatch.png │ │ ├── doris.png │ │ ├── elasticsearch.png │ │ ├── host.png │ │ ├── huawei-lts.png │ │ ├── influxdb.png │ │ ├── jaeger.png │ │ ├── loki.png │ │ ├── mysql.png │ │ ├── opensearch.png │ │ ├── oracle.png │ │ ├── pgsql.png │ │ ├── prometheus.png │ │ ├── redshift.png │ │ ├── sqlserver.png │ │ ├── tdengine.png │ │ ├── tencent-cls.png │ │ ├── victorialogs.png │ │ ├── volc-tls.png │ │ └── zabbix.png │ ├── map-mark-num-bg.png │ ├── no-idc.png │ ├── no-ping.png │ ├── notification │ │ ├── flashduty.png │ │ ├── http.png │ │ ├── script.png │ │ └── smtp.png │ ├── out-of-service.png │ ├── screens │ │ ├── skin01 │ │ │ ├── light_spot.png │ │ │ ├── screen_1.png │ │ │ ├── screen_2.png │ │ │ ├── screen_3.png │ │ │ └── stat_item_bg.png │ │ ├── skin02 │ │ │ ├── Rectangle.svg │ │ │ └── important_stat_bg.png │ │ ├── skin03 │ │ │ ├── Rectangle.svg │ │ │ └── important_stat_bg.png │ │ └── skin04 │ │ │ ├── critical.png │ │ │ ├── header_bg.png │ │ │ ├── info.png │ │ │ ├── title_img.png │ │ │ └── warning.png │ └── system-info.svg └── js │ ├── node-sql-parser@4.10.0_umd_mysql.umd.js │ └── placement.min.js ├── scripts ├── generate_all_locales.ts ├── generate_antd_dark_less.js ├── generate_antd_gold_less.js └── generate_each_locales.ts ├── src ├── App.less ├── App.tsx ├── assets │ └── n9e │ │ └── image │ │ └── system-info.svg ├── components │ ├── AdvancedWrap │ │ ├── index.tsx │ │ └── utils.ts │ ├── AuthorizationWrapper │ │ ├── index.tsx │ │ └── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ ├── BaseSearchInput │ │ └── index.tsx │ ├── BlankBusinessPlaceholder │ │ ├── index.less │ │ ├── index.tsx │ │ └── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ ├── BreadCrumb │ │ ├── index.less │ │ └── index.tsx │ ├── BusinessGroup │ │ ├── BusinessGroupSelect.tsx │ │ ├── BusinessGroupSelectWithAll.tsx │ │ ├── BusinessGroupSideBarWithAll.tsx │ │ ├── components │ │ │ ├── EditBusinessDrawer │ │ │ │ └── index.tsx │ │ │ └── Tree │ │ │ │ ├── constant.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── style.less │ │ │ │ └── types.ts │ │ ├── index.tsx │ │ ├── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ │ ├── services.ts │ │ ├── style.less │ │ └── utils.ts │ ├── Code │ │ ├── index.less │ │ └── index.tsx │ ├── CodeMirror │ │ └── index.tsx │ ├── Contacts │ │ ├── AddModal.tsx │ │ ├── EditModal.tsx │ │ ├── constants.ts │ │ ├── index.tsx │ │ ├── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ │ ├── services.ts │ │ └── types.ts │ ├── CronPattern │ │ ├── index.tsx │ │ └── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ ├── DarkModeSelect │ │ ├── index.tsx │ │ └── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ ├── DatasourceSelect │ │ ├── DatasourceCateSelect.tsx │ │ ├── DatasourceCateSelectV2.tsx │ │ ├── DatasourceSelect.tsx │ │ ├── DatasourceSelectV2 │ │ │ └── index.tsx │ │ ├── EmptyDatasourcePopover.tsx │ │ ├── ProdSelect.tsx │ │ ├── index.tsx │ │ ├── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ │ └── style.less │ ├── DeviceSelect │ │ ├── HostSelect │ │ │ ├── Preview.tsx │ │ │ ├── QueryRender.tsx │ │ │ ├── ValuesSelect.tsx │ │ │ └── index.tsx │ │ ├── NetworkDeviceSelect │ │ │ ├── Preview.tsx │ │ │ ├── QueryRender.tsx │ │ │ ├── ValuesSelect.tsx │ │ │ └── index.tsx │ │ └── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ ├── DocumentDrawer │ │ ├── Document.tsx │ │ ├── index.tsx │ │ └── style.less │ ├── ErrorComponent │ │ └── index.tsx │ ├── ErrorWithDetail │ │ ├── index.tsx │ │ └── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ ├── ExportImport │ │ ├── Export.tsx │ │ ├── Import.tsx │ │ └── index.tsx │ ├── Feedback │ │ ├── index.tsx │ │ ├── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ │ └── style.less │ ├── G2PieChart │ │ └── index.tsx │ ├── IconFont │ │ └── index.tsx │ ├── InputEnlarge │ │ └── index.tsx │ ├── InputGroupWithFormItem │ │ ├── index.tsx │ │ └── style.less │ ├── KQLInput │ │ ├── CMTheme.tsx │ │ ├── client │ │ │ ├── elasticsearch.ts │ │ │ └── index.ts │ │ ├── complete │ │ │ ├── hybrid.ts │ │ │ └── index.ts │ │ ├── grammar │ │ │ └── parser.js │ │ ├── index.tsx │ │ ├── kql.ts │ │ ├── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ │ ├── style.less │ │ └── utils.ts │ ├── KVTagSelect │ │ ├── KVTags │ │ │ ├── TagItem.tsx │ │ │ └── index.tsx │ │ ├── index.tsx │ │ └── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ ├── LogQL │ │ ├── CMTheme.tsx │ │ ├── client │ │ │ ├── aliyun-sls.ts │ │ │ ├── huawei-lts.ts │ │ │ ├── index.ts │ │ │ ├── tencent-cls.ts │ │ │ └── volc-tls.ts │ │ ├── complete │ │ │ ├── hybrid.ts │ │ │ └── index.ts │ │ ├── index.tsx │ │ ├── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ │ └── logql.ts │ ├── LogQLInput │ │ ├── CMTheme.tsx │ │ └── index.tsx │ ├── Markdown │ │ ├── MarkdownWithTooltip.tsx │ │ ├── index.less │ │ └── index.tsx │ ├── ModalHOC.tsx │ ├── OrganizeColumns │ │ ├── index.tsx │ │ └── utils.ts │ ├── PromGraphCpt │ │ ├── Graph.tsx │ │ ├── Table.tsx │ │ ├── components │ │ │ ├── GraphStandardOptions.tsx │ │ │ ├── MetricsExplorer.tsx │ │ │ └── QueryStatsView.tsx │ │ ├── index.tsx │ │ ├── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ │ ├── services.ts │ │ └── style.less │ ├── PromQLInput │ │ ├── BuiltinMetrics │ │ │ ├── Content.tsx │ │ │ ├── MetricsList.tsx │ │ │ ├── index.tsx │ │ │ └── style.less │ │ ├── CMTheme.tsx │ │ ├── PromQLInputWithBuilder.tsx │ │ ├── index.tsx │ │ ├── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ │ └── style.less │ ├── PromQueryBuilder │ │ ├── LabelFilters │ │ │ ├── LabelNameSelect.tsx │ │ │ ├── LabelValueSelect.tsx │ │ │ ├── index.tsx │ │ │ └── utils.ts │ │ ├── MetricSelect │ │ │ └── index.tsx │ │ ├── NOTICE.md │ │ ├── NestedQueryList │ │ │ ├── NestedQuery.tsx │ │ │ └── index.tsx │ │ ├── Operations │ │ │ ├── Operation.tsx │ │ │ ├── index.tsx │ │ │ └── utils │ │ │ │ ├── addOperationHandler.ts │ │ │ │ ├── createAggregationOperation.ts │ │ │ │ ├── createFunction.ts │ │ │ │ ├── createRangeFunction.ts │ │ │ │ ├── index.ts │ │ │ │ └── renderer.ts │ │ ├── PromQueryBuilderModal.tsx │ │ ├── RawQuery │ │ │ └── index.tsx │ │ ├── components │ │ │ └── FormItem.tsx │ │ ├── index.tsx │ │ ├── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ │ ├── style.less │ │ ├── types.ts │ │ └── utils │ │ │ ├── buildPromVisualQueryFromPromQL.ts │ │ │ └── index.ts │ ├── QueryName │ │ ├── index.tsx │ │ ├── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ │ └── utils.ts │ ├── RefreshIcon │ │ ├── index.less │ │ └── index.tsx │ ├── Resolution │ │ ├── index.less │ │ └── index.tsx │ ├── RouterPrompt │ │ └── index.tsx │ ├── ScrollArea │ │ └── index.tsx │ ├── SideMenu │ │ ├── DeprecatedIcon.tsx │ │ ├── Header.tsx │ │ ├── MenuList.tsx │ │ ├── QuickMenu.tsx │ │ ├── configs.tsx │ │ ├── icons │ │ │ ├── AlarmManagement.svg │ │ │ ├── AlarmSelfhealing.svg │ │ │ ├── Dashboard.svg │ │ │ ├── DialAnalysis-Hover.svg │ │ │ ├── DialAnalysis.svg │ │ │ ├── Embeds-Hover.svg │ │ │ ├── Embeds.svg │ │ │ ├── IndexManagement.svg │ │ │ ├── Infrastructure.svg │ │ │ ├── LinkAnalysis.svg │ │ │ ├── LogAnalysis.svg │ │ │ ├── Menu_Search.svg │ │ │ ├── PersonnelOrganization.svg │ │ │ ├── Pingmesh-Hover.svg │ │ │ ├── Pingmesh.svg │ │ │ └── SystemInformation.svg │ │ ├── index.tsx │ │ ├── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ │ ├── menu.less │ │ ├── menu.tsx │ │ ├── types.ts │ │ └── utils.ts │ ├── Tags │ │ └── index.tsx │ ├── TimeRangePicker │ │ ├── AutoRefresh │ │ │ ├── index.tsx │ │ │ └── style.less │ │ ├── RelativeTimeRangePicker │ │ │ ├── index.tsx │ │ │ └── utils.ts │ │ ├── TimeRangePicker.tsx │ │ ├── TimeRangePickerWithRefresh.tsx │ │ ├── TimeZonePicker │ │ │ └── index.tsx │ │ ├── config.ts │ │ ├── index.tsx │ │ ├── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ │ ├── style.less │ │ ├── types.ts │ │ └── utils.ts │ ├── UPlotChart │ │ ├── NOTICE.md │ │ ├── README.md │ │ ├── constant.ts │ │ ├── index.tsx │ │ ├── plugins │ │ │ └── tooltipPlugin.ts │ │ ├── style.less │ │ └── utils │ │ │ ├── axisBuilder.ts │ │ │ ├── cursorBuilder.ts │ │ │ ├── dataMatch.ts │ │ │ ├── optionsUpdateState.ts │ │ │ ├── paddingSide.ts │ │ │ ├── scalesBuilder.ts │ │ │ ├── seriesBuider.ts │ │ │ └── stack.ts │ ├── VirtualTable │ │ ├── index.tsx │ │ └── style.css │ ├── menu │ │ ├── SideMenu │ │ │ ├── DeprecatedIcon.tsx │ │ │ ├── Header.tsx │ │ │ ├── MenuList.tsx │ │ │ ├── QuickMenu.tsx │ │ │ ├── index.tsx │ │ │ ├── menu.less │ │ │ ├── types.ts │ │ │ └── utils.ts │ │ ├── configs.tsx │ │ ├── icons │ │ │ ├── AlarmManagement.svg │ │ │ ├── AlarmSelfhealing.svg │ │ │ ├── Dashboard.svg │ │ │ ├── DialAnalysis-Hover.svg │ │ │ ├── DialAnalysis.svg │ │ │ ├── Embeds-Hover.svg │ │ │ ├── Embeds.svg │ │ │ ├── IndexManagement.svg │ │ │ ├── Infrastructure.svg │ │ │ ├── LinkAnalysis.svg │ │ │ ├── LogAnalysis.svg │ │ │ ├── Menu_Search.svg │ │ │ ├── PersonnelOrganization.svg │ │ │ ├── Pingmesh-Hover.svg │ │ │ ├── Pingmesh.svg │ │ │ └── SystemInformation.svg │ │ ├── index.tsx │ │ ├── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ │ └── menu.less │ ├── pageLayout │ │ ├── HelpLink.tsx │ │ ├── PageLayoutWithTabs │ │ │ ├── TabMenu.less │ │ │ ├── TabMenu.tsx │ │ │ ├── index.tsx │ │ │ └── types.ts │ │ ├── SideMenuColorSetting │ │ │ ├── index.tsx │ │ │ └── types.ts │ │ ├── Version │ │ │ ├── index.tsx │ │ │ ├── locale │ │ │ │ ├── en_US.ts │ │ │ │ ├── index.ts │ │ │ │ ├── zh_CN.ts │ │ │ │ └── zh_HK.ts │ │ │ └── services.ts │ │ ├── icons │ │ │ ├── DocIcon.tsx │ │ │ └── LanguageIcon.tsx │ │ ├── index.less │ │ ├── index.tsx │ │ └── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ ├── useOnClickOutside.tsx │ └── usePagination.tsx ├── empty-module.js ├── global.d.ts ├── global.variable.less ├── i18n.ts ├── locales │ ├── common │ │ ├── en_US.ts │ │ ├── index.ts │ │ ├── ja_JP.ts │ │ ├── ru_RU.ts │ │ ├── zh_CN.ts │ │ └── zh_HK.ts │ ├── datasource │ │ ├── en_US.ts │ │ ├── index.ts │ │ ├── ja_JP.ts │ │ ├── ru_RU.ts │ │ ├── zh_CN.ts │ │ └── zh_HK.ts │ └── resources.ts ├── main.tsx ├── pages │ ├── account │ │ ├── Token │ │ │ ├── index.tsx │ │ │ └── services.ts │ │ ├── changePassword.tsx │ │ ├── info.tsx │ │ ├── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ │ ├── profile.less │ │ ├── profile.tsx │ │ └── secretKey.tsx │ ├── alertCurEvent │ │ ├── constants.ts │ │ ├── entry.tsx │ │ ├── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ │ ├── pages │ │ │ └── List │ │ │ │ ├── AggrRuleDropdown.tsx │ │ │ │ ├── AlertCard.tsx │ │ │ │ ├── AlertTable.tsx │ │ │ │ ├── DatasourceCheckbox.tsx │ │ │ │ ├── EventDetailDrawer.tsx │ │ │ │ └── index.tsx │ │ ├── services.ts │ │ ├── style.less │ │ ├── types.ts │ │ ├── utils │ │ │ ├── deleteAlertEventsModal.tsx │ │ │ ├── getFilter.ts │ │ │ ├── getProdOptions.ts │ │ │ └── getRequestParamsByFilter.ts │ │ └── variables.less │ ├── alertRules │ │ ├── Add.tsx │ │ ├── Edit.tsx │ │ ├── Form │ │ │ ├── Base.tsx │ │ │ ├── Effective │ │ │ │ └── index.tsx │ │ │ ├── EventSettings │ │ │ │ ├── Relabel │ │ │ │ │ ├── EventsModal.tsx │ │ │ │ │ ├── RelabelItem.tsx │ │ │ │ │ ├── TestModal.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── services.ts │ │ │ │ │ └── style.less │ │ │ │ └── index.tsx │ │ │ ├── Notify │ │ │ │ ├── NotificationRuleSelect.tsx │ │ │ │ ├── TaskTpls │ │ │ │ │ ├── TplSettings.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── VersionSwitch.tsx │ │ │ │ └── index.tsx │ │ │ ├── Rule │ │ │ │ ├── Rule │ │ │ │ │ ├── Host │ │ │ │ │ │ ├── Preview.tsx │ │ │ │ │ │ ├── ValuesSelect.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── style.less │ │ │ │ │ ├── Log │ │ │ │ │ │ ├── AdvancedSettings.tsx │ │ │ │ │ │ ├── Loki │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── utils.ts │ │ │ │ │ ├── Metric │ │ │ │ │ │ ├── Prometheus │ │ │ │ │ │ │ ├── GraphPreview.tsx │ │ │ │ │ │ │ ├── PrometheusV2.tsx │ │ │ │ │ │ │ ├── VariablesConfig │ │ │ │ │ │ │ │ ├── ChildVariablesConfigs │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ ├── EditModal.tsx │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ └── utils │ │ │ │ │ │ │ │ │ └── syncChildVariables.ts │ │ │ │ │ │ │ ├── components │ │ │ │ │ │ │ │ └── AdvancedSettings │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── style.less │ │ │ │ │ │ └── index.tsx │ │ │ │ │ └── index.tsx │ │ │ │ └── index.tsx │ │ │ ├── components │ │ │ │ ├── DatasourceSelectExtra │ │ │ │ │ └── index.tsx │ │ │ │ ├── DatasourceValueSelect │ │ │ │ │ ├── V2.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── services.ts │ │ │ │ │ └── style.less │ │ │ │ ├── Inhibit │ │ │ │ │ └── index.tsx │ │ │ │ ├── IntervalAndDuration │ │ │ │ │ └── index.tsx │ │ │ │ ├── ProdSelect.tsx │ │ │ │ ├── Severity │ │ │ │ │ └── index.tsx │ │ │ │ └── Triggers │ │ │ │ │ ├── AnomalyTrigger │ │ │ │ │ ├── AbnormalDetection │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── services.ts │ │ │ │ │ ├── Builder.tsx │ │ │ │ │ ├── Code.tsx │ │ │ │ │ ├── Joins │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── NodataTrigger.tsx │ │ │ │ │ ├── RecoverConfig │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── Trigger.tsx │ │ │ │ │ ├── Triggers.tsx │ │ │ │ │ └── index.tsx │ │ │ ├── constants.ts │ │ │ ├── index.tsx │ │ │ └── utils.ts │ │ ├── List │ │ │ ├── CloneToBgids │ │ │ │ └── index.tsx │ │ │ ├── CloneToHosts │ │ │ │ ├── ValuesSelect.tsx │ │ │ │ └── index.tsx │ │ │ ├── EditModal.tsx │ │ │ ├── EventsDrawer │ │ │ │ ├── index.tsx │ │ │ │ └── style.less │ │ │ ├── Export.tsx │ │ │ ├── Import │ │ │ │ ├── ImportBase.tsx │ │ │ │ ├── ImportBuiltinContent.tsx │ │ │ │ ├── ImportPrometheus.tsx │ │ │ │ └── index.tsx │ │ │ ├── MoreOperations.tsx │ │ │ ├── OrganizeColumns.tsx │ │ │ ├── constants.ts │ │ │ ├── index.tsx │ │ │ └── utils.ts │ │ ├── constants.ts │ │ ├── index.tsx │ │ ├── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ │ ├── services.ts │ │ ├── style.less │ │ ├── types.ts │ │ └── utils.ts │ ├── builtInComponents │ │ ├── AlertRules │ │ │ ├── Detail.tsx │ │ │ ├── Import.tsx │ │ │ ├── index.tsx │ │ │ ├── services.ts │ │ │ └── types.ts │ │ ├── CollectTpls │ │ │ ├── GroupSelectModal.tsx │ │ │ ├── index.tsx │ │ │ ├── services.ts │ │ │ └── types.ts │ │ ├── Dashboards │ │ │ ├── Detail.tsx │ │ │ ├── Import.tsx │ │ │ ├── index.tsx │ │ │ ├── services.ts │ │ │ └── types.ts │ │ ├── Instructions │ │ │ ├── index.tsx │ │ │ └── services.ts │ │ ├── List.tsx │ │ ├── Metrics │ │ │ ├── components │ │ │ │ └── FormModal │ │ │ │ │ └── index.tsx │ │ │ ├── constants.ts │ │ │ └── index.tsx │ │ ├── components │ │ │ ├── ComponentFormModal │ │ │ │ └── index.tsx │ │ │ ├── LogoPicker │ │ │ │ ├── index.tsx │ │ │ │ └── style.less │ │ │ └── PayloadFormModal │ │ │ │ └── index.tsx │ │ ├── constants.ts │ │ ├── entry.tsx │ │ ├── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ │ ├── services.ts │ │ ├── style.less │ │ ├── types.ts │ │ └── utils.ts │ ├── chart │ │ ├── index.less │ │ ├── index.tsx │ │ └── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ ├── contacts │ │ ├── constants.ts │ │ ├── entry.tsx │ │ ├── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ │ ├── pages │ │ │ ├── AddModal.tsx │ │ │ ├── EditModal.tsx │ │ │ └── List.tsx │ │ ├── services.ts │ │ └── types.ts │ ├── dashboard │ │ ├── CHANGELOG.md │ │ ├── Components │ │ │ ├── ColorPicker │ │ │ │ ├── index.tsx │ │ │ │ └── style.less │ │ │ ├── ColorRangeMenu │ │ │ │ ├── config.ts │ │ │ │ ├── index.tsx │ │ │ │ └── style.less │ │ │ ├── HideButton │ │ │ │ └── index.tsx │ │ │ ├── LegendInput.tsx │ │ │ ├── ModalHOC.tsx │ │ │ └── UnitPicker │ │ │ │ ├── CustomUnitPicker.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── locale │ │ │ │ ├── en_US.ts │ │ │ │ ├── index.ts │ │ │ │ ├── ja_JP.ts │ │ │ │ ├── zh_CN.ts │ │ │ │ └── zh_HK.ts │ │ │ │ └── utils.tsx │ │ ├── DashboardLinks │ │ │ ├── Edit.tsx │ │ │ ├── index.tsx │ │ │ └── style.less │ │ ├── Detail │ │ │ ├── Detail.tsx │ │ │ ├── Title.tsx │ │ │ ├── index.tsx │ │ │ ├── style.less │ │ │ └── utils │ │ │ │ ├── dashboardMigrator.ts │ │ │ │ └── index.ts │ │ ├── Editor │ │ │ ├── Components │ │ │ │ ├── AddQueryButtons │ │ │ │ │ └── index.tsx │ │ │ │ ├── Collapse │ │ │ │ │ ├── Panel.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.less │ │ │ │ ├── ExpressionPanel │ │ │ │ │ └── index.tsx │ │ │ │ └── Markdown │ │ │ │ │ ├── index.less │ │ │ │ │ └── index.tsx │ │ │ ├── Fields │ │ │ │ ├── Colors │ │ │ │ │ └── index.tsx │ │ │ │ ├── Legend │ │ │ │ │ └── index.tsx │ │ │ │ ├── Overrides │ │ │ │ │ └── index.tsx │ │ │ │ ├── StandardOptions │ │ │ │ │ └── index.tsx │ │ │ │ ├── Thresholds │ │ │ │ │ └── index.tsx │ │ │ │ ├── Tooltip │ │ │ │ │ └── index.tsx │ │ │ │ └── ValueMappings │ │ │ │ │ └── index.tsx │ │ │ ├── Form.tsx │ │ │ ├── Options │ │ │ │ ├── BarChart │ │ │ │ │ ├── GraphStyles.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── BarGauge │ │ │ │ │ ├── GraphStyles.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── Gauge │ │ │ │ │ ├── GraphStyles.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── Heatmap │ │ │ │ │ ├── GraphStyles.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── Hexbin │ │ │ │ │ ├── GraphStyles.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── Iframe │ │ │ │ │ ├── GraphStyles.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── Pie │ │ │ │ │ ├── GraphStyles.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── Stat │ │ │ │ │ ├── GraphStyles.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── Table │ │ │ │ │ ├── GraphStyles.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── Text │ │ │ │ │ ├── GraphStyles.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── Timeseries │ │ │ │ │ ├── GraphStyles.tsx │ │ │ │ │ ├── Overrides │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── ValueMappings │ │ │ │ │ │ └── index.tsx │ │ │ │ │ └── index.tsx │ │ │ │ └── index.tsx │ │ │ ├── QueryEditor │ │ │ │ ├── Elasticsearch │ │ │ │ │ ├── DateField.tsx │ │ │ │ │ ├── GroupBy │ │ │ │ │ │ ├── Filters.tsx │ │ │ │ │ │ ├── Histgram.tsx │ │ │ │ │ │ ├── Terms.tsx │ │ │ │ │ │ ├── configs.ts │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── IndexPatternSelect.tsx │ │ │ │ │ ├── IndexSelect.tsx │ │ │ │ │ ├── QueryPanel.tsx │ │ │ │ │ ├── Time │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── Values │ │ │ │ │ │ └── index.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── Prometheus.tsx │ │ │ │ ├── components │ │ │ │ │ ├── ClusterSelect │ │ │ │ │ │ └── index.tsx │ │ │ │ │ └── DatasourceSelect │ │ │ │ │ │ ├── DatasourceSelectExtra │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ └── index.tsx │ │ │ ├── TransformationsEditor │ │ │ │ └── OrganizeFields │ │ │ │ │ ├── OrganizeFields.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.less │ │ │ ├── config.tsx │ │ │ ├── index.tsx │ │ │ ├── style.less │ │ │ └── util.tsx │ │ ├── List │ │ │ ├── BatchClone.tsx │ │ │ ├── Export.tsx │ │ │ ├── FormModal.tsx │ │ │ ├── Header.tsx │ │ │ ├── Import │ │ │ │ ├── ImportBuiltinContent.tsx │ │ │ │ └── index.tsx │ │ │ ├── ImportGrafanaURLFormModal.tsx │ │ │ ├── PublicForm.tsx │ │ │ ├── constants.ts │ │ │ ├── index.tsx │ │ │ ├── style.less │ │ │ └── utils.ts │ │ ├── Panels │ │ │ ├── EditorModal.tsx │ │ │ ├── Row.tsx │ │ │ ├── index.tsx │ │ │ ├── style.less │ │ │ └── utils.ts │ │ ├── Renderer │ │ │ ├── Inspect │ │ │ │ ├── index.tsx │ │ │ │ └── style.less │ │ │ ├── Renderer │ │ │ │ ├── BarChart │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.less │ │ │ │ ├── BarGauge │ │ │ │ │ ├── BasicDisplayMode.tsx │ │ │ │ │ ├── LCDBars │ │ │ │ │ │ ├── LCDBar.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── style.less │ │ │ │ │ └── utils.ts │ │ │ │ ├── Gauge │ │ │ │ │ ├── Gauge.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── style.less │ │ │ │ │ ├── types.ts │ │ │ │ │ └── utils.ts │ │ │ │ ├── Heatmap │ │ │ │ │ ├── config.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.less │ │ │ │ ├── Hexbin │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── render.ts │ │ │ │ │ ├── style.less │ │ │ │ │ └── utils.ts │ │ │ │ ├── Iframe │ │ │ │ │ └── index.tsx │ │ │ │ ├── Main.tsx │ │ │ │ ├── Pie │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.less │ │ │ │ ├── Stat │ │ │ │ │ ├── StatItem.tsx │ │ │ │ │ ├── StatItemByColSpan.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── style.less │ │ │ │ │ └── utils.ts │ │ │ │ ├── Table │ │ │ │ │ ├── Cell.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── style.less │ │ │ │ │ └── utils.ts │ │ │ │ ├── Text │ │ │ │ │ └── index.tsx │ │ │ │ ├── TimeSeriesNG │ │ │ │ │ ├── Main.tsx │ │ │ │ │ ├── components │ │ │ │ │ │ ├── Annotation │ │ │ │ │ │ │ ├── AddButton.tsx │ │ │ │ │ │ │ ├── EditButton.tsx │ │ │ │ │ │ │ ├── FormModal.tsx │ │ │ │ │ │ │ ├── annotationsPlugin.tsx │ │ │ │ │ │ │ └── style.less │ │ │ │ │ │ ├── Legend │ │ │ │ │ │ │ ├── LegendList.tsx │ │ │ │ │ │ │ ├── LegendTable.tsx │ │ │ │ │ │ │ ├── Link.tsx │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── style.less │ │ │ │ │ │ ├── NameWithTooltip.tsx │ │ │ │ │ │ └── ResetZoomButton.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── style.less │ │ │ │ │ └── utils │ │ │ │ │ │ ├── drawThresholds.ts │ │ │ │ │ │ ├── getChartContainerSize.ts │ │ │ │ │ │ ├── getDataFrameAndBaseSeries.ts │ │ │ │ │ │ ├── getLegendData.ts │ │ │ │ │ │ ├── getScalesMinMax.ts │ │ │ │ │ │ ├── getStartAndEndByTargets.ts │ │ │ │ │ │ └── secondYAxisBuilder.ts │ │ │ │ ├── Timeseries │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.less │ │ │ │ ├── index.tsx │ │ │ │ └── style.less │ │ │ ├── components │ │ │ │ ├── CloneIcon.tsx │ │ │ │ └── PanelEmpty.tsx │ │ │ ├── config.ts │ │ │ ├── datasource │ │ │ │ ├── elasticsearch │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── processResponse.ts │ │ │ │ │ ├── queryBuilder.ts │ │ │ │ │ ├── types.ts │ │ │ │ │ └── utils.ts │ │ │ │ ├── prometheus.ts │ │ │ │ ├── useQuery.tsx │ │ │ │ └── utils │ │ │ │ │ └── index.tsx │ │ │ └── utils │ │ │ │ ├── ajustInitialValues.ts │ │ │ │ ├── byteConverter.ts │ │ │ │ ├── calculateField.ts │ │ │ │ ├── dateTimeFormatters.ts │ │ │ │ ├── formatToTable.ts │ │ │ │ ├── getCalculatedValuesBySeries.ts │ │ │ │ ├── getFirstUnusedLetter.ts │ │ │ │ ├── getOverridePropertiesByName.ts │ │ │ │ ├── getPanelCustomTimeDescribe.ts │ │ │ │ ├── getSerieName.ts │ │ │ │ ├── getTextWidth.ts │ │ │ │ ├── index.ts │ │ │ │ ├── localeCompare.ts │ │ │ │ ├── replaceExpressionBracket.ts │ │ │ │ ├── replaceExpressionDetail.ts │ │ │ │ ├── replaceFieldWithVariable.ts │ │ │ │ ├── squares.ts │ │ │ │ ├── symbolFormatters.ts │ │ │ │ ├── valueFormats.ts │ │ │ │ └── valueFormatter.ts │ │ ├── Share │ │ │ └── index.tsx │ │ ├── VariableConfig │ │ │ ├── DisplayItem.tsx │ │ │ ├── EditItem.tsx │ │ │ ├── EditItems.tsx │ │ │ ├── Querybuilder.tsx │ │ │ ├── constant.tsx │ │ │ ├── datasource.ts │ │ │ ├── datasource │ │ │ │ └── elasticsearch │ │ │ │ │ └── index.tsx │ │ │ ├── definition.ts │ │ │ ├── index.less │ │ │ ├── index.tsx │ │ │ └── utils.ts │ │ ├── config.tsx │ │ ├── globalState.ts │ │ ├── index.tsx │ │ ├── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ │ ├── types.ts │ │ ├── updateSchema.ts │ │ └── utils │ │ │ ├── getDefaultTargets.ts │ │ │ └── index.ts │ ├── datasource │ │ ├── Datasources │ │ │ ├── Detail.tsx │ │ │ ├── ElasticSearch │ │ │ │ ├── Detail.tsx │ │ │ │ └── Form.tsx │ │ │ ├── Form.tsx │ │ │ ├── Jaeger │ │ │ │ ├── Detail.tsx │ │ │ │ └── Form.tsx │ │ │ ├── Loki │ │ │ │ ├── Detail.tsx │ │ │ │ └── Form.tsx │ │ │ ├── Prometheus │ │ │ │ ├── Detail.tsx │ │ │ │ ├── Form.tsx │ │ │ │ └── prom_installation.md │ │ │ └── TDengine │ │ │ │ ├── Detail.tsx │ │ │ │ └── Form.tsx │ │ ├── Detail.tsx │ │ ├── Form.tsx │ │ ├── components │ │ │ ├── Rename.tsx │ │ │ ├── SourceCards │ │ │ │ ├── index.less │ │ │ │ └── index.tsx │ │ │ ├── TableSource │ │ │ │ └── index.tsx │ │ │ ├── items │ │ │ │ ├── Auth.tsx │ │ │ │ ├── BasicAuth.tsx │ │ │ │ ├── Cluster.tsx │ │ │ │ ├── Description.tsx │ │ │ │ ├── Footer.tsx │ │ │ │ ├── HTTP.tsx │ │ │ │ ├── Headers.tsx │ │ │ │ ├── Name.tsx │ │ │ │ └── SkipTLSVerify.tsx │ │ │ └── itemsNG │ │ │ │ ├── BasicAuth.tsx │ │ │ │ ├── Cluster.tsx │ │ │ │ └── Headers.tsx │ │ ├── config.tsx │ │ ├── index.less │ │ ├── index.tsx │ │ ├── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ │ └── services.ts │ ├── demo │ │ ├── data.js │ │ ├── index.tsx │ │ └── style.less │ ├── embeddedDashboards │ │ ├── FormModal.tsx │ │ ├── entry.tsx │ │ ├── index.tsx │ │ ├── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ │ ├── services.ts │ │ ├── style.less │ │ ├── types.ts │ │ └── utils.ts │ ├── embeddedProduct │ │ ├── components │ │ │ └── EmbeddedProductModal │ │ │ │ └── index.tsx │ │ ├── constants.ts │ │ ├── entry.tsx │ │ ├── eventBus.ts │ │ ├── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ │ ├── pages │ │ │ ├── Detail │ │ │ │ └── index.tsx │ │ │ └── List │ │ │ │ └── index.tsx │ │ ├── services.ts │ │ ├── types.ts │ │ └── utils.ts │ ├── event │ │ ├── Detail │ │ │ ├── Host.tsx │ │ │ ├── Loki.tsx │ │ │ └── Prometheus.tsx │ │ ├── DetailNG │ │ │ ├── Actions.tsx │ │ │ └── index.tsx │ │ ├── EventNotifyRecords │ │ │ ├── index.tsx │ │ │ └── services.ts │ │ ├── Graph.tsx │ │ ├── Table.tsx │ │ ├── TaskTpls │ │ │ └── index.tsx │ │ ├── card.tsx │ │ ├── cardLeft.tsx │ │ ├── constants.tsx │ │ ├── detail.less │ │ ├── detail.tsx │ │ ├── index.less │ │ ├── index.tsx │ │ ├── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ │ └── services.ts │ ├── eventPipeline │ │ ├── constants.ts │ │ ├── entry.tsx │ │ ├── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ │ ├── pages │ │ │ ├── Add.tsx │ │ │ ├── Edit.tsx │ │ │ ├── Form │ │ │ │ ├── Attributes │ │ │ │ │ ├── TagItem.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── Processor │ │ │ │ │ ├── Callback.tsx │ │ │ │ │ ├── EventDrop.tsx │ │ │ │ │ ├── Relabel.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── TestModal │ │ │ │ │ ├── EventsTable.tsx │ │ │ │ │ └── index.tsx │ │ │ │ └── index.tsx │ │ │ └── List.tsx │ │ ├── services.ts │ │ ├── types.ts │ │ └── utils │ │ │ └── normalizeValues.ts │ ├── explorer │ │ ├── Elasticsearch │ │ │ ├── FieldsSidebar │ │ │ │ ├── Field.tsx │ │ │ │ ├── FieldsList.tsx │ │ │ │ ├── index.tsx │ │ │ │ └── style.less │ │ │ ├── HighLightJSON.tsx │ │ │ ├── InputFilter.tsx │ │ │ ├── LogView.tsx │ │ │ ├── QueryBuilder.tsx │ │ │ ├── QueryBuilderWithIndexPatterns.tsx │ │ │ ├── Table.tsx │ │ │ ├── components │ │ │ │ └── IndexPatternSettingsBtn.tsx │ │ │ ├── flatten.ts │ │ │ ├── index.tsx │ │ │ ├── metricQuery.tsx │ │ │ ├── services.ts │ │ │ ├── style.less │ │ │ └── utils │ │ │ │ ├── calcInterval.ts │ │ │ │ ├── getColumnsFromFields.tsx │ │ │ │ ├── highlight │ │ │ │ ├── highlight_html.ts │ │ │ │ ├── highlight_request.ts │ │ │ │ ├── highlight_tags.ts │ │ │ │ ├── html_tags.ts │ │ │ │ └── index.ts │ │ │ │ └── index.tsx │ │ ├── Explorer.tsx │ │ ├── Log.tsx │ │ ├── Loki │ │ │ ├── component │ │ │ │ ├── context │ │ │ │ │ ├── index.less │ │ │ │ │ └── index.tsx │ │ │ │ ├── logRow │ │ │ │ │ ├── highlight.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── showTagIcon.tsx │ │ │ │ │ └── valueTagsCont.tsx │ │ │ │ └── operator │ │ │ │ │ ├── PrettifyJson.tsx │ │ │ │ │ ├── SelectSort.tsx │ │ │ │ │ ├── ShowTime.tsx │ │ │ │ │ └── WrapLines.tsx │ │ │ ├── index.tsx │ │ │ ├── services.ts │ │ │ ├── style.less │ │ │ └── util.ts │ │ ├── Metric.tsx │ │ ├── Prometheus │ │ │ ├── HistoricalRecords │ │ │ │ ├── index.tsx │ │ │ │ └── style.less │ │ │ └── index.tsx │ │ ├── components │ │ │ ├── Help │ │ │ │ └── index.tsx │ │ │ ├── Links.tsx │ │ │ ├── RenderValue │ │ │ │ ├── index.tsx │ │ │ │ └── useFieldConfig.tsx │ │ │ └── Share │ │ │ │ └── index.tsx │ │ ├── constants.ts │ │ ├── index.less │ │ ├── index.tsx │ │ ├── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ │ └── utils.ts │ ├── help │ │ ├── NotificationSettings │ │ │ ├── Channels │ │ │ │ ├── AddModal.tsx │ │ │ │ ├── EditModal.tsx │ │ │ │ └── index.tsx │ │ │ ├── Contacts │ │ │ │ ├── AddModal.tsx │ │ │ │ ├── EditModal.tsx │ │ │ │ └── index.tsx │ │ │ ├── SMTP │ │ │ │ └── index.tsx │ │ │ ├── Script.tsx │ │ │ ├── Webhooks.tsx │ │ │ ├── index.tsx │ │ │ ├── locale │ │ │ │ ├── en_US.ts │ │ │ │ ├── index.ts │ │ │ │ ├── ja_JP.ts │ │ │ │ ├── ru_RU.ts │ │ │ │ ├── zh_CN.ts │ │ │ │ └── zh_HK.ts │ │ │ ├── services.ts │ │ │ ├── style.less │ │ │ └── types.ts │ │ ├── NotificationTpls │ │ │ ├── Editor │ │ │ │ ├── HTML.tsx │ │ │ │ ├── Markdown.tsx │ │ │ │ └── components │ │ │ │ │ └── FieldWithEditor │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.less │ │ │ ├── FormModal.tsx │ │ │ ├── index.tsx │ │ │ ├── locale │ │ │ │ ├── en_US.ts │ │ │ │ ├── index.ts │ │ │ │ ├── ja_JP.ts │ │ │ │ ├── ru_RU.ts │ │ │ │ ├── zh_CN.ts │ │ │ │ └── zh_HK.ts │ │ │ ├── services.ts │ │ │ ├── style.less │ │ │ └── types.ts │ │ ├── SSOConfigs │ │ │ ├── index.tsx │ │ │ ├── locale │ │ │ │ ├── en_US.ts │ │ │ │ ├── index.ts │ │ │ │ ├── ja_JP.ts │ │ │ │ ├── ru_RU.ts │ │ │ │ ├── zh_CN.ts │ │ │ │ └── zh_HK.ts │ │ │ ├── services.ts │ │ │ └── types.ts │ │ ├── migrate │ │ │ ├── MigrationModal.tsx │ │ │ ├── index.tsx │ │ │ ├── locale │ │ │ │ ├── en_US.ts │ │ │ │ ├── index.ts │ │ │ │ ├── ja_JP.ts │ │ │ │ ├── ru_RU.ts │ │ │ │ ├── zh_CN.ts │ │ │ │ └── zh_HK.ts │ │ │ └── utils.ts │ │ ├── servers │ │ │ ├── index.tsx │ │ │ └── locale │ │ │ │ ├── en_US.ts │ │ │ │ ├── index.ts │ │ │ │ ├── ja_JP.ts │ │ │ │ ├── ru_RU.ts │ │ │ │ ├── zh_CN.ts │ │ │ │ └── zh_HK.ts │ │ └── version │ │ │ ├── index.tsx │ │ │ └── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ ├── historyEvents │ │ ├── exportEvents.ts │ │ ├── index.tsx │ │ ├── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ │ └── services.ts │ ├── log │ │ └── IndexPatterns │ │ │ ├── EditField.tsx │ │ │ ├── FormModal.tsx │ │ │ ├── index.tsx │ │ │ ├── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ │ │ ├── regExtractModal.tsx │ │ │ ├── services.ts │ │ │ └── types.ts │ ├── login │ │ ├── constants.ts │ │ ├── index.tsx │ │ ├── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ │ ├── login.less │ │ └── overview.tsx │ ├── loginCallback │ │ ├── Custom.tsx │ │ ├── cas.tsx │ │ ├── index.tsx │ │ └── oauth.tsx │ ├── metricsBuiltin │ │ ├── ExplorerDrawer │ │ │ ├── Panel.tsx │ │ │ └── index.tsx │ │ ├── List.tsx │ │ ├── components │ │ │ ├── Export.tsx │ │ │ ├── Filters │ │ │ │ ├── Filter.tsx │ │ │ │ ├── FormModal.tsx │ │ │ │ ├── index.tsx │ │ │ │ └── utils.ts │ │ │ ├── FormDrawer │ │ │ │ └── index.tsx │ │ │ └── Import.tsx │ │ ├── constants.ts │ │ ├── entry.tsx │ │ ├── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ │ ├── services.ts │ │ ├── style.less │ │ └── types.ts │ ├── monitor │ │ └── object │ │ │ ├── index.tsx │ │ │ ├── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ │ │ ├── metricViews │ │ │ ├── Export.tsx │ │ │ ├── Form.tsx │ │ │ ├── Graph.tsx │ │ │ ├── LabelsValues.tsx │ │ │ ├── List.tsx │ │ │ ├── Metrics.tsx │ │ │ ├── components │ │ │ │ └── Collapse │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.less │ │ │ ├── config.tsx │ │ │ ├── graphStandardOptions │ │ │ │ └── Hexbin.tsx │ │ │ └── utils.ts │ │ │ ├── style.less │ │ │ ├── types.ts │ │ │ └── utils.tsx │ ├── notFound │ │ ├── OutOfService.tsx │ │ ├── Page403.tsx │ │ ├── index.tsx │ │ └── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ ├── notificationChannels │ │ ├── constants.ts │ │ ├── entry.tsx │ │ ├── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ │ ├── pages │ │ │ ├── Add.tsx │ │ │ ├── Edit.tsx │ │ │ ├── Form │ │ │ │ ├── ContactKeysSelect │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── services.ts │ │ │ │ ├── Flashduty.tsx │ │ │ │ ├── HTTP.tsx │ │ │ │ ├── IdentsSelect.tsx │ │ │ │ ├── SMTP.tsx │ │ │ │ ├── Script.tsx │ │ │ │ └── index.tsx │ │ │ └── List │ │ │ │ ├── Export.tsx │ │ │ │ └── index.tsx │ │ ├── services.ts │ │ ├── types.ts │ │ └── utils │ │ │ └── normalizeValues.ts │ ├── notificationRules │ │ ├── constants.ts │ │ ├── entry.tsx │ │ ├── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ │ ├── pages │ │ │ ├── Add.tsx │ │ │ ├── Edit.tsx │ │ │ ├── Form │ │ │ │ ├── Attributes │ │ │ │ │ ├── TagItem.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── ChannelParams │ │ │ │ │ ├── Custom.tsx │ │ │ │ │ ├── Flashduty.tsx │ │ │ │ │ ├── UserInfo.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── ChannelSelect.tsx │ │ │ │ ├── EventPipelineConfigs │ │ │ │ │ ├── DragIcon.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── RuleConfig.tsx │ │ │ │ ├── TemplateSelect.tsx │ │ │ │ ├── TestButton.tsx │ │ │ │ └── index.tsx │ │ │ └── List.tsx │ │ ├── services.ts │ │ ├── style.less │ │ ├── types.ts │ │ └── utils │ │ │ ├── getValuePropsWithTimeFormItem.ts │ │ │ └── normalizeValues.ts │ ├── notificationTemplates │ │ ├── components │ │ │ └── FieldWithEditor │ │ │ │ ├── index.tsx │ │ │ │ └── style.less │ │ ├── constants.ts │ │ ├── entry.tsx │ │ ├── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ │ ├── pages │ │ │ └── List │ │ │ │ ├── Editor │ │ │ │ ├── HTML.tsx │ │ │ │ ├── Markdown.tsx │ │ │ │ └── Text.tsx │ │ │ │ ├── Form │ │ │ │ ├── ContentItem.tsx │ │ │ │ ├── ContentItemKey.tsx │ │ │ │ ├── ContentKeyFormModal.tsx │ │ │ │ ├── PreviewModal │ │ │ │ │ ├── Events.tsx │ │ │ │ │ └── index.tsx │ │ │ │ └── index.tsx │ │ │ │ ├── FormModal.tsx │ │ │ │ ├── ItemDetail.tsx │ │ │ │ ├── index.tsx │ │ │ │ └── style.less │ │ ├── services.ts │ │ └── types.ts │ ├── permissions │ │ ├── Operations.tsx │ │ ├── RoleFormModal.tsx │ │ ├── index.tsx │ │ ├── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ │ ├── services.ts │ │ └── types.ts │ ├── recordingRules │ │ ├── PageTable.tsx │ │ ├── add.tsx │ │ ├── components │ │ │ ├── Export.tsx │ │ │ ├── Import.tsx │ │ │ ├── editModal.tsx │ │ │ └── operateForm.tsx │ │ ├── edit.tsx │ │ ├── index.less │ │ ├── index.tsx │ │ └── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ ├── siteSettings │ │ ├── index.tsx │ │ ├── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ │ └── services.ts │ ├── targets │ │ ├── BusinessGroup │ │ │ ├── index.tsx │ │ │ ├── style.less │ │ │ └── utils.ts │ │ ├── List.tsx │ │ ├── OrganizeColumns.tsx │ │ ├── TargetMetaDrawer │ │ │ ├── index.tsx │ │ │ └── style.less │ │ ├── clipboard.tsx │ │ ├── components │ │ │ ├── EditBusinessGroups │ │ │ │ └── index.tsx │ │ │ └── Explorer │ │ │ │ ├── ExplorerPanels │ │ │ │ ├── Panel.tsx │ │ │ │ └── index.tsx │ │ │ │ ├── Metrics.tsx │ │ │ │ ├── constant.tsx │ │ │ │ ├── index.tsx │ │ │ │ └── style.less │ │ ├── index.less │ │ ├── index.tsx │ │ ├── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ │ ├── services.ts │ │ └── utils.ts │ ├── task │ │ ├── FieldCopy │ │ │ ├── clipboard.tsx │ │ │ └── index.tsx │ │ ├── add.tsx │ │ ├── detail.tsx │ │ ├── index.tsx │ │ ├── result.tsx │ │ └── style.less │ ├── taskOutput │ │ ├── host.jsx │ │ └── index.jsx │ ├── taskTpl │ │ ├── add.tsx │ │ ├── bindTags.tsx │ │ ├── clone.tsx │ │ ├── detail.tsx │ │ ├── editor.tsx │ │ ├── hostsFilterModal │ │ │ ├── Preview.tsx │ │ │ ├── ValuesSelect.tsx │ │ │ └── index.tsx │ │ ├── index.tsx │ │ ├── interface.ts │ │ ├── modify.tsx │ │ ├── style.less │ │ ├── tplForm.tsx │ │ └── unBindTags.tsx │ ├── traceCpt │ │ ├── Dependencies │ │ │ ├── index.tsx │ │ │ └── utils.tsx │ │ ├── Detail │ │ │ ├── Header │ │ │ │ ├── LabeledList.tsx │ │ │ │ ├── SpanGraph │ │ │ │ │ ├── CanvasSpanGraph.tsx │ │ │ │ │ ├── GraphTicks.tsx │ │ │ │ │ ├── Scrubber.tsx │ │ │ │ │ ├── TickLabels.tsx │ │ │ │ │ ├── ViewingLayer.css │ │ │ │ │ ├── ViewingLayer.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── render-into-canvas.tsx │ │ │ │ └── index.tsx │ │ │ ├── Timeline │ │ │ │ ├── ListView │ │ │ │ │ ├── Positions.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── ScrollManager.tsx │ │ │ │ ├── SpanBar.css │ │ │ │ ├── SpanBar.tsx │ │ │ │ ├── SpanBarRow.css │ │ │ │ ├── SpanBarRow.tsx │ │ │ │ ├── SpanDetail │ │ │ │ │ ├── AccordianKeyValues.css │ │ │ │ │ ├── AccordianKeyValues.markers.tsx │ │ │ │ │ ├── AccordianKeyValues.tsx │ │ │ │ │ ├── AccordianLogs.css │ │ │ │ │ ├── AccordianLogs.tsx │ │ │ │ │ ├── DetailState.tsx │ │ │ │ │ ├── KeyValuesTable.css │ │ │ │ │ ├── KeyValuesTable.tsx │ │ │ │ │ ├── TextList.css │ │ │ │ │ ├── TextList.tsx │ │ │ │ │ ├── index.css │ │ │ │ │ └── index.tsx │ │ │ │ ├── SpanDetailRow.css │ │ │ │ ├── SpanDetailRow.tsx │ │ │ │ ├── SpanTreeOffset.css │ │ │ │ ├── SpanTreeOffset.tsx │ │ │ │ ├── Ticks.tsx │ │ │ │ ├── TimelineHeaderRow.tsx │ │ │ │ ├── TimelineRow.tsx │ │ │ │ ├── TimelineViewingLayer.css │ │ │ │ ├── TimelineViewingLayer.tsx │ │ │ │ ├── Tween.tsx │ │ │ │ ├── VerticalResizer.css │ │ │ │ ├── VerticalResizer.tsx │ │ │ │ ├── VirtualizedTraceView │ │ │ │ │ ├── DetailState.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── utils.ts │ │ │ │ ├── index.tsx │ │ │ │ └── scroll-page.tsx │ │ │ ├── index.track.tsx │ │ │ ├── index.tsx │ │ │ └── types.ts │ │ ├── Explorer.tsx │ │ ├── Result │ │ │ ├── ResultItem │ │ │ │ ├── index.tsx │ │ │ │ └── title.tsx │ │ │ └── index.tsx │ │ ├── Search.tsx │ │ ├── components │ │ │ ├── LabelField │ │ │ │ ├── index.less │ │ │ │ └── index.tsx │ │ │ └── ScatterBubbleChart │ │ │ │ └── ScatterBubbleChart.tsx │ │ ├── index.less │ │ ├── index.tsx │ │ ├── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ │ ├── services.ts │ │ ├── type.ts │ │ └── utils │ │ │ ├── DraggableManager.tsx │ │ │ ├── EUpdateTypes.tsx │ │ │ ├── TreeNode.ts │ │ │ ├── color-generator.tsx │ │ │ ├── date.ts │ │ │ ├── index.ts │ │ │ ├── number.ts │ │ │ ├── span-ancestor-ids.tsx │ │ │ ├── trace.ts │ │ │ └── types.tsx │ ├── user │ │ ├── business.tsx │ │ ├── component │ │ │ ├── Tags │ │ │ │ └── index.tsx │ │ │ ├── addUser │ │ │ │ ├── index.less │ │ │ │ └── index.tsx │ │ │ ├── businessForm │ │ │ │ └── index.tsx │ │ │ ├── createModal │ │ │ │ └── index.tsx │ │ │ ├── delPopover │ │ │ │ ├── index.less │ │ │ │ └── index.tsx │ │ │ ├── passwordForm │ │ │ │ └── index.tsx │ │ │ ├── teamForm │ │ │ │ └── index.tsx │ │ │ └── userForm │ │ │ │ └── index.tsx │ │ ├── const.ts │ │ ├── constants.ts │ │ ├── groups.tsx │ │ ├── index.less │ │ ├── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ │ └── users.tsx │ ├── variableConfigs │ │ ├── FormModal.tsx │ │ ├── components │ │ │ └── Password.tsx │ │ ├── index.tsx │ │ ├── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ │ ├── services.ts │ │ └── types.ts │ └── warning │ │ ├── const.ts │ │ ├── index.less │ │ ├── shield │ │ ├── add.tsx │ │ ├── components │ │ │ ├── CateSelect │ │ │ │ └── index.tsx │ │ │ ├── PreviewMutedEvents.tsx │ │ │ ├── operateForm.tsx │ │ │ ├── tagItem.tsx │ │ │ └── utils.ts │ │ ├── edit.tsx │ │ ├── index.less │ │ ├── index.tsx │ │ └── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── ru_RU.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ │ └── subscribe │ │ ├── add.tsx │ │ ├── components │ │ ├── BusiGroupsTagItem.tsx │ │ ├── operateForm.tsx │ │ ├── ruleModal.tsx │ │ └── tagItem.tsx │ │ ├── constants.ts │ │ ├── edit.tsx │ │ ├── index.less │ │ ├── index.tsx │ │ └── locale │ │ ├── en_US.ts │ │ ├── index.ts │ │ ├── ja_JP.ts │ │ ├── ru_RU.ts │ │ ├── zh_CN.ts │ │ └── zh_HK.ts ├── plugins │ ├── TDengine │ │ ├── AlertRule │ │ │ ├── Queries │ │ │ │ ├── GraphPreview.tsx │ │ │ │ ├── index.tsx │ │ │ │ └── style.less │ │ │ └── index.tsx │ │ ├── Dashboard │ │ │ ├── QueryBuilder.tsx │ │ │ └── datasource.tsx │ │ ├── Event │ │ │ └── index.tsx │ │ ├── Explorer │ │ │ ├── Graph.tsx │ │ │ ├── QueryBuilder.tsx │ │ │ ├── Table.tsx │ │ │ ├── index.tsx │ │ │ ├── style.less │ │ │ └── utils.ts │ │ ├── components │ │ │ ├── AdvancedSettings.tsx │ │ │ ├── Meta │ │ │ │ ├── index.tsx │ │ │ │ └── style.less │ │ │ └── SqlTemplates.tsx │ │ ├── index.tsx │ │ ├── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ │ ├── services.ts │ │ ├── types.ts │ │ └── utils.ts │ ├── clickHouse │ │ ├── AlertRule │ │ │ ├── Queries │ │ │ │ ├── GraphPreview.tsx │ │ │ │ └── index.tsx │ │ │ └── index.tsx │ │ ├── Dashboard │ │ │ ├── QueryBuilder.tsx │ │ │ ├── VariableDatasource.ts │ │ │ ├── VariableQuerybuilder.tsx │ │ │ ├── datasource.tsx │ │ │ └── style.less │ │ ├── Datasource │ │ │ ├── Detail.tsx │ │ │ └── Form.tsx │ │ ├── Event │ │ │ └── index.tsx │ │ ├── Explorer │ │ │ ├── Graph.tsx │ │ │ ├── QueryBuilder.tsx │ │ │ ├── Table.tsx │ │ │ ├── index.tsx │ │ │ ├── style.less │ │ │ └── utils.ts │ │ ├── RecordingRules │ │ │ └── Queries │ │ │ │ ├── GraphPreview.tsx │ │ │ │ └── index.tsx │ │ ├── components │ │ │ ├── AdvancedSettings.tsx │ │ │ ├── DocumentDrawer │ │ │ │ ├── document_en_US.md │ │ │ │ ├── document_zh_CN.md │ │ │ │ ├── document_zh_HK.md │ │ │ │ └── index.tsx │ │ │ ├── HistoricalRecords │ │ │ │ ├── index.tsx │ │ │ │ └── style.less │ │ │ ├── LegendInput.tsx │ │ │ └── Meta │ │ │ │ ├── index.tsx │ │ │ │ └── style.less │ │ ├── constants.ts │ │ ├── globalState.ts │ │ ├── index.tsx │ │ ├── locale │ │ │ ├── en_US.ts │ │ │ ├── index.ts │ │ │ ├── ja_JP.ts │ │ │ ├── zh_CN.ts │ │ │ └── zh_HK.ts │ │ ├── services.ts │ │ ├── types.ts │ │ └── utils.ts │ └── elasticsearch │ │ ├── AlertRule │ │ ├── EnrichQueries │ │ │ ├── GraphPreview.tsx │ │ │ ├── Query.tsx │ │ │ ├── index.tsx │ │ │ └── style.less │ │ ├── GraphPreview.tsx │ │ ├── Queries │ │ │ ├── AdvancedSettings │ │ │ │ └── index.tsx │ │ │ ├── DateField.tsx │ │ │ ├── IndexPatternSelect.tsx │ │ │ ├── Query.tsx │ │ │ ├── Value.tsx │ │ │ └── index.tsx │ │ ├── index.tsx │ │ └── services.ts │ │ ├── Event │ │ ├── Graph.tsx │ │ ├── Logs.tsx │ │ ├── Preview.tsx │ │ └── index.tsx │ │ ├── components │ │ └── LogDownload │ │ │ ├── DownloadModal.tsx │ │ │ ├── ExportModal.tsx │ │ │ └── type.ts │ │ ├── index.tsx │ │ └── utils.ts ├── routers │ ├── index.tsx │ └── loadable.tsx ├── services │ ├── account.ts │ ├── common.ts │ ├── dashboardV2.ts │ ├── help.ts │ ├── index.ts │ ├── indicator.ts │ ├── login.ts │ ├── manage.ts │ ├── metric.ts │ ├── metricViews.ts │ ├── recording.ts │ ├── resource.ts │ ├── shield.ts │ ├── subscribe.ts │ ├── targets.ts │ └── warning.ts ├── store │ ├── accountInterface │ │ └── index.ts │ ├── businessInterface │ │ ├── index.ts │ │ └── resource.ts │ ├── chart │ │ └── index.ts │ ├── common.ts │ ├── commonInterface │ │ └── index.ts │ ├── dashboardInterface │ │ └── index.ts │ ├── eventInterface │ │ └── index.ts │ ├── manageInterface │ │ └── index.ts │ └── warningInterface │ │ ├── index.ts │ │ ├── shield.ts │ │ ├── strategy.ts │ │ └── subscribe.ts ├── theme │ ├── antd.dark.less │ ├── antd.light-gold.less │ ├── dark.less │ ├── default.less │ ├── index.less │ ├── light.less │ ├── variable.css │ └── variableConfig.ts ├── types │ └── svg.d.ts ├── utils │ ├── api.ts │ ├── constant.ts │ ├── darkMode.ts │ ├── datasource.ts │ ├── datetime │ │ ├── common.ts │ │ ├── formats.ts │ │ ├── formatter.ts │ │ ├── timezones.ts │ │ └── types.ts │ ├── flatten.ts │ ├── getFontFamily.ts │ ├── getTextWidth.ts │ ├── index.ts │ ├── request.tsx │ ├── rsa.ts │ └── useHook.ts └── vite-env.d.ts ├── tailwind.config.js ├── tsconfig.json └── vite.config.ts /.github/workflows/action.yml: -------------------------------------------------------------------------------- 1 | name: Build With Vite 2 | 3 | on: 4 | push: 5 | branches: [master, v5.1] 6 | pull_request: 7 | branches: [master, v5.1] 8 | 9 | jobs: 10 | build: 11 | runs-on: ubuntu-latest 12 | 13 | strategy: 14 | matrix: 15 | node-version: [12.x] 16 | 17 | steps: 18 | - uses: actions/checkout@v2 19 | 20 | - name: Use Node.js ${{ matrix.node-version }} 21 | uses: actions/setup-node@v1 22 | with: 23 | node-version: ${{ matrix.node-version }} 24 | 25 | - name: Build 26 | run: | 27 | npm install 28 | npm run build 29 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | dist 4 | dist-ssr 5 | *.local 6 | .vscode 7 | .idea/* 8 | pub 9 | deploy.sh 10 | src/Packages/* 11 | stats.html 12 | build.sh 13 | .env 14 | .env.advanced 15 | scripts/all_locales.json 16 | src/plus 17 | public/bound -------------------------------------------------------------------------------- /.husky/.gitignore: -------------------------------------------------------------------------------- 1 | _ 2 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | .prettiierrc.json 2 | .package.json -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "tabWidth": 2, 3 | "useTabs": false, 4 | "semi": true, 5 | "singleQuote": true, 6 | "quoteProps": "as-needed", 7 | "jsxSingleQuote": true, 8 | "trailingComma": "all", 9 | "bracketSpacing": true, 10 | "jsxBracketSameLine": false, 11 | "arrowParens": "always", 12 | "printWidth": 180, 13 | "curly": "all", 14 | "eqeqeq": true 15 | } 16 | -------------------------------------------------------------------------------- /comb_feats.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const process = require('process'); 3 | const _ = require('lodash'); 4 | 5 | const argv = (key) => { 6 | if (process.argv.includes(`--${key}`)) return true; 7 | const value = process.argv.find((element) => element.startsWith(`--${key}=`)); 8 | if (!value) return null; 9 | return value.replace(`--${key}=`, ''); 10 | }; 11 | 12 | const envUrl = '.env.advanced'; 13 | const feats = _.split(argv('feats'), ','); 14 | fs.writeFileSync( 15 | envUrl, 16 | _.join( 17 | _.map(feats, (feat) => { 18 | return `VITE_IS_${feat}=true`; 19 | }), 20 | '\n', 21 | ), 22 | ); 23 | -------------------------------------------------------------------------------- /public/bound/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/bound/README.md -------------------------------------------------------------------------------- /public/docs/categraf/image01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/docs/categraf/image01.png -------------------------------------------------------------------------------- /public/docs/elasticsearch-template-variables/zh_CN.md: -------------------------------------------------------------------------------- 1 | 使用 JSON 字符串编写查询定义。目前只支持 terms 查询,query 字段是 `Lucene query` 语法。 2 | 3 | ```json 4 | { "find": "terms", "field": "request", "query": "ident: host01" } 5 | ``` 6 | 7 | #### 排序 8 | 9 | 默认是根据字母顺序或数字顺序进行降序。如果要根据文档计数进行排序可添加 `orderBy: doc_count` 如果希望是升序则添加 `order: asc`。 10 | 11 | ```json 12 | { "find": "terms", "field": "request", "query": "ident: host01", "orderBy": "doc_count", "order": "asc" } 13 | ``` 14 | 15 | #### 限制 16 | 17 | 默认是最多返回 500 条数据,如果需要限制返回数据条数,可以添加 `size` 字段。考虑性能问题,建议不要设置太大。 18 | 19 | ```json 20 | { "find": "terms", "field": "request", "query": "ident: host01", "size": 10 } 21 | ``` 22 | -------------------------------------------------------------------------------- /public/docs/elasticsearch-template-variables/zh_HK.md: -------------------------------------------------------------------------------- 1 | 使用 JSON 字串編寫查詢定義。目前只支援 terms 查詢,query 欄位是 `Lucene query` 語法。 2 | 3 | ```json 4 | { "find": "terms", "field": "request", "query": "ident: host01" } 5 | ``` 6 | 7 | #### 排序 8 | 9 | 預設是根據字母順序或數字順序進行降序。如果要依照文件計數進行排序可新增 `orderBy: doc_count` 如果希望是升序則新增 `order: asc`。 10 | 11 | ```json 12 | { "find": "terms", "field": "request", "query": "ident: host01", "orderBy": "doc_count", "order": "asc" } 13 | ``` 14 | 15 | #### 限制 16 | 17 | 預設是最多傳回 500 條數據,如果需要限制傳回資料條數,可以新增 `size` 欄位。考慮效能問題,建議不要設定太大。 18 | 19 | ```json 20 | { "find": "terms", "field": "request", "query": "ident: host01", "size": 10 } 21 | ``` 22 | -------------------------------------------------------------------------------- /public/font/Monda-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/font/Monda-Regular.ttf -------------------------------------------------------------------------------- /public/font/codicon.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/font/codicon.ttf -------------------------------------------------------------------------------- /public/image/avatar1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/avatar1.png -------------------------------------------------------------------------------- /public/image/avatar2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/avatar2.png -------------------------------------------------------------------------------- /public/image/avatar3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/avatar3.png -------------------------------------------------------------------------------- /public/image/avatar4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/avatar4.png -------------------------------------------------------------------------------- /public/image/avatar5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/avatar5.png -------------------------------------------------------------------------------- /public/image/avatar6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/avatar6.png -------------------------------------------------------------------------------- /public/image/avatar7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/avatar7.png -------------------------------------------------------------------------------- /public/image/avatar8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/avatar8.png -------------------------------------------------------------------------------- /public/image/customerServiceWX.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/customerServiceWX.png -------------------------------------------------------------------------------- /public/image/default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/default.png -------------------------------------------------------------------------------- /public/image/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/favicon.ico -------------------------------------------------------------------------------- /public/image/login-left-top-corner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/login-left-top-corner.png -------------------------------------------------------------------------------- /public/image/login-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/login-logo.png -------------------------------------------------------------------------------- /public/image/login-right-bottom-corner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/login-right-bottom-corner.png -------------------------------------------------------------------------------- /public/image/logo-l.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/logo-l.png -------------------------------------------------------------------------------- /public/image/logo-light-l.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/logo-light-l.png -------------------------------------------------------------------------------- /public/image/logo-light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/logo-light.png -------------------------------------------------------------------------------- /public/image/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/logo.png -------------------------------------------------------------------------------- /public/image/logos/aliyun-sls.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/logos/aliyun-sls.png -------------------------------------------------------------------------------- /public/image/logos/ck.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/logos/ck.png -------------------------------------------------------------------------------- /public/image/logos/cloudwatch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/logos/cloudwatch.png -------------------------------------------------------------------------------- /public/image/logos/doris.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/logos/doris.png -------------------------------------------------------------------------------- /public/image/logos/elasticsearch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/logos/elasticsearch.png -------------------------------------------------------------------------------- /public/image/logos/host.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/logos/host.png -------------------------------------------------------------------------------- /public/image/logos/huawei-lts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/logos/huawei-lts.png -------------------------------------------------------------------------------- /public/image/logos/influxdb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/logos/influxdb.png -------------------------------------------------------------------------------- /public/image/logos/jaeger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/logos/jaeger.png -------------------------------------------------------------------------------- /public/image/logos/loki.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/logos/loki.png -------------------------------------------------------------------------------- /public/image/logos/mysql.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/logos/mysql.png -------------------------------------------------------------------------------- /public/image/logos/opensearch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/logos/opensearch.png -------------------------------------------------------------------------------- /public/image/logos/oracle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/logos/oracle.png -------------------------------------------------------------------------------- /public/image/logos/pgsql.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/logos/pgsql.png -------------------------------------------------------------------------------- /public/image/logos/prometheus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/logos/prometheus.png -------------------------------------------------------------------------------- /public/image/logos/redshift.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/logos/redshift.png -------------------------------------------------------------------------------- /public/image/logos/sqlserver.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/logos/sqlserver.png -------------------------------------------------------------------------------- /public/image/logos/tdengine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/logos/tdengine.png -------------------------------------------------------------------------------- /public/image/logos/tencent-cls.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/logos/tencent-cls.png -------------------------------------------------------------------------------- /public/image/logos/victorialogs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/logos/victorialogs.png -------------------------------------------------------------------------------- /public/image/logos/volc-tls.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/logos/volc-tls.png -------------------------------------------------------------------------------- /public/image/logos/zabbix.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/logos/zabbix.png -------------------------------------------------------------------------------- /public/image/map-mark-num-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/map-mark-num-bg.png -------------------------------------------------------------------------------- /public/image/no-idc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/no-idc.png -------------------------------------------------------------------------------- /public/image/no-ping.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/no-ping.png -------------------------------------------------------------------------------- /public/image/notification/flashduty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/notification/flashduty.png -------------------------------------------------------------------------------- /public/image/notification/http.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/notification/http.png -------------------------------------------------------------------------------- /public/image/notification/script.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/notification/script.png -------------------------------------------------------------------------------- /public/image/notification/smtp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/notification/smtp.png -------------------------------------------------------------------------------- /public/image/out-of-service.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/out-of-service.png -------------------------------------------------------------------------------- /public/image/screens/skin01/light_spot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/screens/skin01/light_spot.png -------------------------------------------------------------------------------- /public/image/screens/skin01/screen_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/screens/skin01/screen_1.png -------------------------------------------------------------------------------- /public/image/screens/skin01/screen_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/screens/skin01/screen_2.png -------------------------------------------------------------------------------- /public/image/screens/skin01/screen_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/screens/skin01/screen_3.png -------------------------------------------------------------------------------- /public/image/screens/skin01/stat_item_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/screens/skin01/stat_item_bg.png -------------------------------------------------------------------------------- /public/image/screens/skin02/Rectangle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/image/screens/skin02/important_stat_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/screens/skin02/important_stat_bg.png -------------------------------------------------------------------------------- /public/image/screens/skin03/Rectangle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/image/screens/skin03/important_stat_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/screens/skin03/important_stat_bg.png -------------------------------------------------------------------------------- /public/image/screens/skin04/critical.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/screens/skin04/critical.png -------------------------------------------------------------------------------- /public/image/screens/skin04/header_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/screens/skin04/header_bg.png -------------------------------------------------------------------------------- /public/image/screens/skin04/info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/screens/skin04/info.png -------------------------------------------------------------------------------- /public/image/screens/skin04/title_img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/screens/skin04/title_img.png -------------------------------------------------------------------------------- /public/image/screens/skin04/warning.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/public/image/screens/skin04/warning.png -------------------------------------------------------------------------------- /src/components/AuthorizationWrapper/locale/en_US.ts: -------------------------------------------------------------------------------- 1 | const en_US = { 2 | unauthorized: 'Unauthorized', 3 | }; 4 | export default en_US; 5 | -------------------------------------------------------------------------------- /src/components/AuthorizationWrapper/locale/index.ts: -------------------------------------------------------------------------------- 1 | import i18next from 'i18next'; 2 | import en_US from './en_US'; 3 | import zh_CN from './zh_CN'; 4 | import zh_HK from './zh_HK'; 5 | import ja_JP from './ja_JP'; 6 | import ru_RU from "./ru_RU"; 7 | 8 | i18next.addResourceBundle('en_US', 'AuthorizationWrapper', en_US); 9 | i18next.addResourceBundle('zh_CN', 'AuthorizationWrapper', zh_CN); 10 | i18next.addResourceBundle('zh_HK', 'AuthorizationWrapper', zh_HK); 11 | i18next.addResourceBundle('ja_JP', 'AuthorizationWrapper', ja_JP); 12 | i18next.addResourceBundle('ru_RU', 'AuthorizationWrapper', ru_RU); 13 | -------------------------------------------------------------------------------- /src/components/AuthorizationWrapper/locale/ja_JP.ts: -------------------------------------------------------------------------------- 1 | const ja_JP = { 2 | unauthorized: 'アクセス権がありません', 3 | }; 4 | export default ja_JP; 5 | -------------------------------------------------------------------------------- /src/components/AuthorizationWrapper/locale/ru_RU.ts: -------------------------------------------------------------------------------- 1 | const ru_RU = { 2 | unauthorized: 'Доступ запрещен', 3 | }; 4 | 5 | export default ru_RU; 6 | -------------------------------------------------------------------------------- /src/components/AuthorizationWrapper/locale/zh_CN.ts: -------------------------------------------------------------------------------- 1 | const zh_CN = { 2 | unauthorized: '无权访问', 3 | }; 4 | export default zh_CN; 5 | -------------------------------------------------------------------------------- /src/components/AuthorizationWrapper/locale/zh_HK.ts: -------------------------------------------------------------------------------- 1 | const zh_HK = { 2 | unauthorized: '無權訪問', 3 | }; 4 | 5 | export default zh_HK; 6 | -------------------------------------------------------------------------------- /src/components/BlankBusinessPlaceholder/index.less: -------------------------------------------------------------------------------- 1 | .blank-busi-holder { 2 | width: 100%; 3 | padding-top: 20px; 4 | padding-left: 20px; 5 | font-size: 14px; 6 | } 7 | -------------------------------------------------------------------------------- /src/components/BlankBusinessPlaceholder/locale/en_US.ts: -------------------------------------------------------------------------------- 1 | const en_US = { 2 | title: 'Prompt', 3 | content: 'Please create a business group first.', 4 | }; 5 | export default en_US; 6 | -------------------------------------------------------------------------------- /src/components/BlankBusinessPlaceholder/locale/index.ts: -------------------------------------------------------------------------------- 1 | import i18next from 'i18next'; 2 | import en_US from './en_US'; 3 | import zh_CN from './zh_CN'; 4 | import zh_HK from './zh_HK'; 5 | import ja_JP from './ja_JP'; 6 | import ru_RU from "./ru_RU"; 7 | 8 | i18next.addResourceBundle('en_US', 'BlankBusinessPlaceholder', en_US); 9 | i18next.addResourceBundle('zh_CN', 'BlankBusinessPlaceholder', zh_CN); 10 | i18next.addResourceBundle('zh_HK', 'BlankBusinessPlaceholder', zh_HK); 11 | i18next.addResourceBundle('ja_JP', 'BlankBusinessPlaceholder', ja_JP); 12 | i18next.addResourceBundle('ru_RU', 'BlankBusinessPlaceholder', ru_RU); 13 | -------------------------------------------------------------------------------- /src/components/BlankBusinessPlaceholder/locale/ja_JP.ts: -------------------------------------------------------------------------------- 1 | const ja_JP = { 2 | title: 'ビジネスグループ', 3 | content: 'ビジネス グループに所属する必要がある場合は、まずビジネス グループを作成してください。', 4 | }; 5 | export default ja_JP; 6 | -------------------------------------------------------------------------------- /src/components/BlankBusinessPlaceholder/locale/ru_RU.ts: -------------------------------------------------------------------------------- 1 | const ru_RU = { 2 | title: 'Сообщение', 3 | content: 'Необходимо принадлежать бизнес-группе, пожалуйста, создайте бизнес-группу', 4 | }; 5 | 6 | export default ru_RU; 7 | -------------------------------------------------------------------------------- /src/components/BlankBusinessPlaceholder/locale/zh_CN.ts: -------------------------------------------------------------------------------- 1 | const zh_CN = { 2 | title: '提示信息', 3 | content: '需要归属某个业务组,请先 创建业务组', 4 | }; 5 | export default zh_CN; 6 | -------------------------------------------------------------------------------- /src/components/BlankBusinessPlaceholder/locale/zh_HK.ts: -------------------------------------------------------------------------------- 1 | const zh_HK = { 2 | title: '提示信息', 3 | content: '需要归属某个业务组,请先 创建业务组', 4 | }; 5 | 6 | export default zh_HK; 7 | -------------------------------------------------------------------------------- /src/components/BreadCrumb/index.less: -------------------------------------------------------------------------------- 1 | .bread-crumb-container { 2 | display: inline-block; 3 | font-weight: 400; 4 | font-size: 12px; 5 | margin-left: 10px; 6 | .text { 7 | color: var(--fc-text-3); 8 | } 9 | .plr3 { 10 | padding: 0px 3px; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/components/BusinessGroup/BusinessGroupSelect.tsx: -------------------------------------------------------------------------------- 1 | import React, { useContext } from 'react'; 2 | import { Select } from 'antd'; 3 | import _ from 'lodash'; 4 | 5 | interface Props { 6 | data: { 7 | id: number; 8 | name: string; 9 | }[]; 10 | value: number; 11 | onChange: (value: number) => void; 12 | } 13 | 14 | export default function BusinessGroupSelect(props: Props) { 15 | return ( 16 | 14 | 15 | 16 | 17 | 18 | 19 | ); 20 | } 21 | -------------------------------------------------------------------------------- /src/pages/datasource/components/items/SkipTLSVerify.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Space, Form, Switch } from 'antd'; 3 | import { useTranslation } from 'react-i18next'; 4 | 5 | export default function SkipTLSVerify() { 6 | const { t } = useTranslation('datasourceManage'); 7 | return ( 8 | 9 | {t('form.skip_ssl_verify')} 10 | 11 | 12 | 13 | 14 | ); 15 | } 16 | -------------------------------------------------------------------------------- /src/pages/datasource/index.less: -------------------------------------------------------------------------------- 1 | .settings-data-source-detail-drawer .ant-drawer-header { 2 | display: none; 3 | } 4 | 5 | .settings-source-form { 6 | .page-title { 7 | margin: 0 0 16px; 8 | } 9 | } 10 | 11 | .settings-data-source-list { 12 | .settings-data-source-list-name { 13 | .anticon-edit { 14 | display: none; 15 | } 16 | } 17 | .ant-table-cell-row-hover { 18 | .settings-data-source-list-name { 19 | .anticon-edit { 20 | display: block; 21 | } 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /src/pages/datasource/locale/index.ts: -------------------------------------------------------------------------------- 1 | import i18next from 'i18next'; 2 | import en_US from './en_US'; 3 | import zh_CN from './zh_CN'; 4 | import zh_HK from './zh_HK'; 5 | import ja_JP from "./ja_JP"; 6 | import ru_RU from "./ru_RU"; 7 | 8 | i18next.addResourceBundle('en_US', 'datasourceManage', en_US); 9 | i18next.addResourceBundle('zh_CN', 'datasourceManage', zh_CN); 10 | i18next.addResourceBundle('zh_HK', 'datasourceManage', zh_HK); 11 | i18next.addResourceBundle('ja_JP', 'datasourceManage', ja_JP); 12 | i18next.addResourceBundle('ru_RU', 'datasourceManage', ru_RU); 13 | -------------------------------------------------------------------------------- /src/pages/demo/style.less: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/src/pages/demo/style.less -------------------------------------------------------------------------------- /src/pages/embeddedDashboards/entry.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import Audits from './index'; 3 | import './style.less'; 4 | import './locale'; 5 | 6 | export default { 7 | routes: [ 8 | { 9 | path: '/embedded-dashboards', 10 | component: Audits, 11 | exact: true, 12 | }, 13 | ], 14 | }; 15 | -------------------------------------------------------------------------------- /src/pages/embeddedDashboards/locale/en_US.ts: -------------------------------------------------------------------------------- 1 | const en_US = { 2 | title: 'Embedded dashboards', 3 | edit_title: 'Edit embedded dashboards', 4 | edit_btn: 'Configure now', 5 | name: 'Name', 6 | name_msg: 'Please enter name', 7 | url: 'URL', 8 | url_msg: 'Please enter URL', 9 | exitFullScreen_tip: 'Exiting full screen is restricted by iframe security and cannot be controlled. You need to manually delete the viewMode=fullscreen parameter in the URL.', 10 | }; 11 | export default en_US; 12 | -------------------------------------------------------------------------------- /src/pages/embeddedDashboards/locale/index.ts: -------------------------------------------------------------------------------- 1 | import i18next from 'i18next'; 2 | import en_US from './en_US'; 3 | import zh_CN from './zh_CN'; 4 | import zh_HK from './zh_HK'; 5 | import ja_JP from "./ja_JP"; 6 | import ru_RU from "./ru_RU"; 7 | 8 | i18next.addResourceBundle('en_US', 'embeddedDashboards', en_US); 9 | i18next.addResourceBundle('zh_CN', 'embeddedDashboards', zh_CN); 10 | i18next.addResourceBundle('zh_HK', 'embeddedDashboards', zh_HK); 11 | i18next.addResourceBundle('ja_JP', 'embeddedDashboards', ja_JP); 12 | i18next.addResourceBundle('ru_RU', 'embeddedDashboards', ru_RU); 13 | -------------------------------------------------------------------------------- /src/pages/embeddedDashboards/locale/ja_JP.ts: -------------------------------------------------------------------------------- 1 | const ja_JP = { 2 | title: "統合ダッシュボード", 3 | edit_title: "統合ダッシュボードを編集", 4 | edit_btn: "現在設定", 5 | name: "名前", 6 | name_msg: "名前を入力してください", 7 | url: "リンク", 8 | url_msg: "リンクを入力してください", 9 | exitFullScreen_tip: 10 | "全画面を退出するには、iframeのセキュリティ制限により制御できません。URLにviewMode=fullscreenパラメータを削除してください。", 11 | }; 12 | 13 | export default ja_JP; 14 | -------------------------------------------------------------------------------- /src/pages/embeddedDashboards/locale/ru_RU.ts: -------------------------------------------------------------------------------- 1 | const ru_RU = { 2 | title: 'Интегрированные панели мониторинга', 3 | edit_title: 'Редактировать интегрированную панель мониторинга', 4 | edit_btn: 'Настроить сейчас', 5 | name: 'Название', 6 | name_msg: 'Пожалуйста, введите название', 7 | url: 'Ссылка', 8 | url_msg: 'Пожалуйста, введите ссылку', 9 | exitFullScreen_tip: 'Выход из полноэкранного режима ограничен функциональностью iframe, необходимо вручную удалить параметр viewMode=fullscreen в URL', 10 | }; 11 | 12 | export default ru_RU; 13 | -------------------------------------------------------------------------------- /src/pages/embeddedDashboards/locale/zh_CN.ts: -------------------------------------------------------------------------------- 1 | const zh_CN = { 2 | title: '集成仪表盘', 3 | edit_title: '编辑集成仪表盘', 4 | edit_btn: '现在配置', 5 | name: '名称', 6 | name_msg: '请输入名称', 7 | url: '链接', 8 | url_msg: '请输入链接', 9 | exitFullScreen_tip: '退出全屏受 iframe 安全限制无法控制,需要手动在 URL 里删除 viewMode=fullscreen 参数', 10 | }; 11 | export default zh_CN; 12 | -------------------------------------------------------------------------------- /src/pages/embeddedDashboards/locale/zh_HK.ts: -------------------------------------------------------------------------------- 1 | const zh_HK = { 2 | title: '集成儀表板', 3 | edit_title: '編輯集成儀表板', 4 | edit_btn: '現在配置', 5 | name: '名稱', 6 | name_msg: '請輸入名稱', 7 | url: '鏈接', 8 | url_msg: '請輸入鏈接', 9 | exitFullScreen_tip: '退出全屏受 iframe 安全限制無法控制,需要手動在 URL 里刪除 viewMode=fullscreen 參數', 10 | }; 11 | 12 | export default zh_HK; 13 | -------------------------------------------------------------------------------- /src/pages/embeddedDashboards/style.less: -------------------------------------------------------------------------------- 1 | .embedded-dashboards-iframe { 2 | border: 0 none; 3 | } -------------------------------------------------------------------------------- /src/pages/embeddedDashboards/types.ts: -------------------------------------------------------------------------------- 1 | export interface Record { 2 | id: string; 3 | name: string; 4 | url: string; 5 | } 6 | -------------------------------------------------------------------------------- /src/pages/embeddedDashboards/utils.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 如果 url 里存在 theme:dark | light 参数,则将其替换为当前主题,否则添加当前主题参数 3 | * @param url 4 | * @param darkMode 5 | */ 6 | export const adjustURL = (url: string, darkMode: boolean) => { 7 | const theme = darkMode ? 'dark' : 'light'; 8 | try { 9 | const urlObj = new URL(url); 10 | const searchParams = urlObj.searchParams; 11 | const windowSearchParams = new URLSearchParams(window.location.search); 12 | for (const [key, value] of windowSearchParams) { 13 | searchParams.set(key, value); 14 | } 15 | searchParams.set('theme', theme); 16 | return urlObj.toString(); 17 | } catch (e) { 18 | return url; 19 | } 20 | }; 21 | -------------------------------------------------------------------------------- /src/pages/embeddedProduct/constants.ts: -------------------------------------------------------------------------------- 1 | export const NS = 'embedded-products'; 2 | export const PATH = `/${NS}`; 3 | export const DETAIL_PATH = `/embedded-product`; 4 | -------------------------------------------------------------------------------- /src/pages/embeddedProduct/entry.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { PATH, DETAIL_PATH } from './constants'; 4 | import List from './pages/List'; 5 | import Detail from './pages/Detail'; 6 | import './locale'; 7 | 8 | export default { 9 | routes: [ 10 | { 11 | path: PATH, 12 | component: List, 13 | exact: true, 14 | }, 15 | { 16 | path: `${DETAIL_PATH}/:id`, 17 | component: Detail, 18 | exact: true, 19 | }, 20 | ], 21 | }; 22 | -------------------------------------------------------------------------------- /src/pages/embeddedProduct/eventBus.ts: -------------------------------------------------------------------------------- 1 | import EventEmitter from 'eventemitter3'; 2 | 3 | export const eventBus = new EventEmitter(); 4 | 5 | export const EVENT_KEYS = { 6 | EMBEDDED_PRODUCT_UPDATED: 'EMBEDDED_PRODUCT_UPDATED', 7 | }; 8 | -------------------------------------------------------------------------------- /src/pages/embeddedProduct/locale/en_US.ts: -------------------------------------------------------------------------------- 1 | const en_US = { 2 | title: 'Embedded products', 3 | add: 'Add', 4 | edit: 'Edit', 5 | name: 'Name', 6 | name_msg: 'Please enter name', 7 | url: 'URL', 8 | url_msg: 'Please enter URL', 9 | visibility: 'Visibility', 10 | visibility_msg: 'Please select visibility', 11 | login_user_visible: 'Login user visible', 12 | team_visible: 'Team visible', 13 | team_ids: 'Authorized teams', 14 | team_ids_msg: 'Please select teams', 15 | exitFullScreen_tip: 'Exiting full screen is restricted by iframe security and cannot be controlled. You need to manually delete the viewMode=fullscreen parameter in the URL.', 16 | }; 17 | export default en_US; 18 | -------------------------------------------------------------------------------- /src/pages/embeddedProduct/locale/index.ts: -------------------------------------------------------------------------------- 1 | import i18next from 'i18next'; 2 | import { NS } from '../constants'; 3 | import en_US from './en_US'; 4 | import zh_CN from './zh_CN'; 5 | import zh_HK from './zh_HK'; 6 | import ja_JP from './ja_JP'; 7 | import ru_RU from './ru_RU'; 8 | 9 | i18next.addResourceBundle('en_US', NS, en_US); 10 | i18next.addResourceBundle('zh_CN', NS, zh_CN); 11 | i18next.addResourceBundle('zh_HK', NS, zh_HK); 12 | i18next.addResourceBundle('ja_JP', NS, ja_JP); 13 | i18next.addResourceBundle('ru_RU', NS, ru_RU); 14 | -------------------------------------------------------------------------------- /src/pages/embeddedProduct/locale/ja_JP.ts: -------------------------------------------------------------------------------- 1 | const ja_JP = { 2 | title: 'システム統合', 3 | add: '追加', 4 | edit: '編集', 5 | name: '名前', 6 | name_msg: '名前を入力してください', 7 | url: 'リンク', 8 | url_msg: 'リンクを入力してください', 9 | visibility: '可視性', 10 | visibility_msg: '可視性を選択してください', 11 | login_user_visible: 'ログインユーザー可視', 12 | team_visible: 'チーム可視', 13 | team_ids: '承認チーム', 14 | team_ids_msg: 'チームを選択してください', 15 | exitFullScreen_tip: '全画面を退出するには、iframeのセキュリティ制限により制御できません。URLにviewMode=fullscreenパラメータを削除してください。', 16 | }; 17 | 18 | export default ja_JP; 19 | -------------------------------------------------------------------------------- /src/pages/embeddedProduct/locale/zh_CN.ts: -------------------------------------------------------------------------------- 1 | const zh_CN = { 2 | title: '系统集成', 3 | edit: '编辑', 4 | add: '添加', 5 | name: '名称', 6 | name_msg: '请输入名称', 7 | url: '链接', 8 | url_msg: '请输入链接', 9 | visibility: '可见性', 10 | visibility_msg: '请选择可见性', 11 | login_user_visible: '登录用户可见', 12 | team_visible: '指定团队可见', 13 | team_ids: '如下团队成员可见', 14 | team_ids_msg: '请选择团队', 15 | exitFullScreen_tip: '退出全屏受 iframe 安全限制无法控制,需要手动在 URL 里删除 viewMode=fullscreen 参数', 16 | }; 17 | export default zh_CN; 18 | -------------------------------------------------------------------------------- /src/pages/embeddedProduct/locale/zh_HK.ts: -------------------------------------------------------------------------------- 1 | const zh_HK = { 2 | title: '系統集成', 3 | edit: '編輯', 4 | add: '添加', 5 | name: '名稱', 6 | name_msg: '請輸入名稱', 7 | url: '鏈接', 8 | url_msg: '請輸入鏈接', 9 | visibility: '可見性', 10 | visibility_msg: '請選擇可見性', 11 | login_user_visible: '登錄用戶可見', 12 | team_visible: '指定團隊可見', 13 | team_ids: '如下團隊成員可見', 14 | team_ids_msg: '請選擇團隊', 15 | exitFullScreen_tip: '退出全屏受 iframe 安全限制無法控制,需要手動在 URL 里刪除 viewMode=fullscreen 參數', 16 | }; 17 | 18 | export default zh_HK; 19 | -------------------------------------------------------------------------------- /src/pages/embeddedProduct/types.ts: -------------------------------------------------------------------------------- 1 | export interface EmbeddedProductParams { 2 | id: number; 3 | name: string; 4 | url: string; 5 | is_private: boolean; 6 | team_ids: number[]; 7 | } 8 | export interface EmbeddedProductResponse { 9 | id: number; 10 | name: string; 11 | url: string; 12 | is_private: boolean; 13 | team_ids: number[]; 14 | create_at: number; 15 | update_at: number; 16 | create_by: string; 17 | update_by: string; 18 | } 19 | -------------------------------------------------------------------------------- /src/pages/embeddedProduct/utils.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 如果 url 里存在 theme:dark | light 参数,则将其替换为当前主题,否则添加当前主题参数 3 | * @param url 4 | * @param darkMode 5 | */ 6 | export const adjustURL = (url: string, darkMode: boolean) => { 7 | const theme = darkMode ? 'dark' : 'light'; 8 | try { 9 | const urlObj = new URL(url); 10 | const searchParams = urlObj.searchParams; 11 | const windowSearchParams = new URLSearchParams(window.location.search); 12 | for (const [key, value] of windowSearchParams) { 13 | searchParams.set(key, value); 14 | } 15 | searchParams.set('theme', theme); 16 | return urlObj.toString(); 17 | } catch (e) { 18 | return url; 19 | } 20 | }; 21 | -------------------------------------------------------------------------------- /src/pages/event/constants.tsx: -------------------------------------------------------------------------------- 1 | export const hoursOptions: { 2 | value: number; 3 | }[] = [{ value: 6 }, { value: 12 }, { value: 24 }, { value: 48 }, { value: 72 }, { value: 168 }, { value: 336 }, { value: 720 }, { value: 1440 }, { value: 2160 }]; 4 | -------------------------------------------------------------------------------- /src/pages/event/locale/index.ts: -------------------------------------------------------------------------------- 1 | import i18next from 'i18next'; 2 | import en_US from './en_US'; 3 | import zh_CN from './zh_CN'; 4 | import zh_HK from './zh_HK'; 5 | import ja_JP from "./ja_JP"; 6 | import ru_RU from "./ru_RU"; 7 | 8 | i18next.addResourceBundle('en_US', 'AlertCurEvents', en_US); 9 | i18next.addResourceBundle('zh_CN', 'AlertCurEvents', zh_CN); 10 | i18next.addResourceBundle('zh_HK', 'AlertCurEvents', zh_HK); 11 | i18next.addResourceBundle('ja_JP', 'AlertCurEvents', ja_JP); 12 | i18next.addResourceBundle('ru_RU', 'AlertCurEvents', ru_RU); 13 | -------------------------------------------------------------------------------- /src/pages/event/services.ts: -------------------------------------------------------------------------------- 1 | import _ from 'lodash'; 2 | import request from '@/utils/request'; 3 | import { RequestMethod } from '@/store/common'; 4 | 5 | export function getEvents(params) { 6 | let url = '/api/n9e/alert-cur-events/list'; 7 | if (import.meta.env.VITE_IS_PRO === 'true') { 8 | url = '/api/n9e-plus/alert-cur-events/list'; 9 | } 10 | return request(url, { 11 | method: RequestMethod.Get, 12 | params, 13 | }); 14 | } 15 | -------------------------------------------------------------------------------- /src/pages/eventPipeline/constants.ts: -------------------------------------------------------------------------------- 1 | export const NS = 'event-pipelines'; 2 | export const PERM = `/${NS}`; 3 | export const DEFAULT_PROCESSOR_CONFIG_MAP = { 4 | relabel: { 5 | action: 'replace', 6 | }, 7 | callback: { 8 | timeout: 10000, 9 | }, 10 | event_update: { 11 | timeout: 10000, 12 | }, 13 | }; 14 | export const DEFAULT_VALUES = { 15 | processors: [ 16 | { 17 | typ: 'relabel', 18 | config: DEFAULT_PROCESSOR_CONFIG_MAP['relabel'], 19 | }, 20 | ], 21 | }; 22 | -------------------------------------------------------------------------------- /src/pages/eventPipeline/entry.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { NS } from './constants'; 4 | import List from './pages/List'; 5 | import Add from './pages/Add'; 6 | import Edit from './pages/Edit'; 7 | 8 | import './locale'; 9 | 10 | export default { 11 | routes: [ 12 | { 13 | path: `/${NS}`, 14 | component: List, 15 | exact: true, 16 | }, 17 | { 18 | path: `/${NS}/add`, 19 | component: Add, 20 | exact: true, 21 | }, 22 | { 23 | path: `/${NS}/edit/:id`, 24 | component: Edit, 25 | exact: true, 26 | }, 27 | ], 28 | }; 29 | -------------------------------------------------------------------------------- /src/pages/eventPipeline/locale/index.ts: -------------------------------------------------------------------------------- 1 | import i18next from 'i18next'; 2 | import { NS } from '../constants'; 3 | import en_US from './en_US'; 4 | import zh_CN from './zh_CN'; 5 | import zh_HK from './zh_HK'; 6 | import ja_JP from './ja_JP'; 7 | import ru_RU from './ru_RU'; 8 | i18next.addResourceBundle('en_US', NS, en_US); 9 | i18next.addResourceBundle('zh_CN', NS, zh_CN); 10 | i18next.addResourceBundle('zh_HK', NS, zh_HK); 11 | i18next.addResourceBundle('ja_JP', NS, ja_JP); 12 | i18next.addResourceBundle('ru_RU', NS, ru_RU); 13 | -------------------------------------------------------------------------------- /src/pages/explorer/Elasticsearch/utils/highlight/highlight_request.ts: -------------------------------------------------------------------------------- 1 | import { highlightTags } from './highlight_tags'; 2 | 3 | const FRAGMENT_SIZE = Math.pow(2, 31) - 1; 4 | 5 | export function getHighlightRequest(shouldHighlight: boolean) { 6 | if (!shouldHighlight) return; 7 | 8 | return { 9 | pre_tags: [highlightTags.pre], 10 | post_tags: [highlightTags.post], 11 | fields: { 12 | '*': {}, 13 | }, 14 | fragment_size: FRAGMENT_SIZE, 15 | }; 16 | } 17 | -------------------------------------------------------------------------------- /src/pages/explorer/Elasticsearch/utils/highlight/highlight_tags.ts: -------------------------------------------------------------------------------- 1 | export const highlightTags = { 2 | pre: '@n9e-highlighted-field@', 3 | post: '@/n9e-highlighted-field@', 4 | }; 5 | -------------------------------------------------------------------------------- /src/pages/explorer/Elasticsearch/utils/highlight/html_tags.ts: -------------------------------------------------------------------------------- 1 | export const htmlTags = { 2 | pre: '', 3 | post: '', 4 | }; 5 | -------------------------------------------------------------------------------- /src/pages/explorer/Elasticsearch/utils/highlight/index.ts: -------------------------------------------------------------------------------- 1 | export { getHighlightHtml } from './highlight_html'; 2 | export { getHighlightRequest } from './highlight_request'; 3 | -------------------------------------------------------------------------------- /src/pages/explorer/Loki/component/context/index.less: -------------------------------------------------------------------------------- 1 | .context-main { 2 | overflow: hidden; 3 | overflow-y: auto; 4 | width: 100%; 5 | flex-shrink: 0; 6 | border: 1px solid #d9d9d9; 7 | height: calc(100% - 200px); 8 | } -------------------------------------------------------------------------------- /src/pages/explorer/Loki/component/logRow/showTagIcon.tsx: -------------------------------------------------------------------------------- 1 | import React, { useState } from 'react'; 2 | import { DownOutlined, RightOutlined } from '@ant-design/icons'; 3 | 4 | interface IProps { 5 | showTags: boolean; 6 | onShowTagsChange: (showTags: boolean) => void; 7 | } 8 | 9 | const ShowTagSelectIcon = (props: IProps) => { 10 | const { showTags, onShowTagsChange } = props; 11 | return <>{showTags ? onShowTagsChange(false)} /> : onShowTagsChange(true)} />}; 12 | }; 13 | 14 | export default ShowTagSelectIcon; 15 | -------------------------------------------------------------------------------- /src/pages/explorer/Loki/component/operator/PrettifyJson.tsx: -------------------------------------------------------------------------------- 1 | import React, { useState } from 'react'; 2 | import { Switch } from 'antd'; 3 | 4 | export function PrettifyJson(props: { onChange: (v: boolean) => void }) { 5 | const [value, setValue] = useState(false); 6 | 7 | const handleChange = (v) => { 8 | setValue(v); 9 | props.onChange(v); 10 | }; 11 | 12 | return ( 13 | <> 14 | Prettify JSON 15 | 16 | 17 | ); 18 | } 19 | -------------------------------------------------------------------------------- /src/pages/explorer/Loki/component/operator/ShowTime.tsx: -------------------------------------------------------------------------------- 1 | import React, { useState } from 'react'; 2 | import { Switch } from 'antd'; 3 | 4 | export function ShowTime(props: { onChange: (v: boolean) => void }) { 5 | const [value, setValue] = useState(true); 6 | 7 | const handleChange = (v) => { 8 | setValue(v); 9 | props.onChange(v); 10 | }; 11 | 12 | return ( 13 | <> 14 | Show Time 15 | 16 | 17 | ); 18 | } 19 | -------------------------------------------------------------------------------- /src/pages/explorer/Loki/component/operator/WrapLines.tsx: -------------------------------------------------------------------------------- 1 | import React, { useState } from 'react'; 2 | import { Switch } from 'antd'; 3 | 4 | export function WrapLines(props: { onChange: (v: boolean) => void }) { 5 | const [value, setValue] = useState(true); 6 | 7 | const handleChange = (v) => { 8 | setValue(v); 9 | props.onChange(v); 10 | }; 11 | 12 | return ( 13 | <> 14 | Wrap Lines 15 | 16 | 17 | ); 18 | } 19 | -------------------------------------------------------------------------------- /src/pages/explorer/Loki/services.ts: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request'; 2 | import { RequestMethod } from '@/store/common'; 3 | import { N9E_PATHNAME } from '@/utils/constant'; 4 | import _ from 'lodash'; 5 | 6 | export function getLogsQuery(datasourceValue: number, params) { 7 | return request(`/api/${N9E_PATHNAME}/proxy/${datasourceValue}/api/v1/query_range`, { 8 | method: RequestMethod.Get, 9 | params, 10 | }).then((res) => res.data); 11 | } 12 | -------------------------------------------------------------------------------- /src/pages/explorer/Prometheus/HistoricalRecords/style.less: -------------------------------------------------------------------------------- 1 | .n9e-historical-records-popover-content { 2 | width: 400px; 3 | .n9e-historical-records-popover-content-records-content { 4 | margin-top: 16px; 5 | max-height: 300px; 6 | overflow-y: auto; 7 | .n9e-historical-records-popover-content-records-item { 8 | padding: 5px 10px; 9 | cursor: pointer; 10 | &:hover { 11 | background-color: var(--fc-fill-3); 12 | } 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /src/pages/explorer/constants.ts: -------------------------------------------------------------------------------- 1 | import { ParseOptions } from 'query-string'; 2 | 3 | export const queryStringOptions: ParseOptions = { 4 | arrayFormat: 'index', 5 | }; 6 | -------------------------------------------------------------------------------- /src/pages/explorer/index.tsx: -------------------------------------------------------------------------------- 1 | import Metric from './Metric'; 2 | import Log from './Log'; 3 | import './locale'; 4 | 5 | export { Metric, Log }; 6 | -------------------------------------------------------------------------------- /src/pages/explorer/locale/index.ts: -------------------------------------------------------------------------------- 1 | import i18next from 'i18next'; 2 | import en_US from './en_US'; 3 | import zh_CN from './zh_CN'; 4 | import zh_HK from './zh_HK'; 5 | import ja_JP from "./ja_JP"; 6 | import ru_RU from "./ru_RU"; 7 | 8 | i18next.addResourceBundle('en_US', 'explorer', en_US); 9 | i18next.addResourceBundle('zh_CN', 'explorer', zh_CN); 10 | i18next.addResourceBundle('zh_HK', 'explorer', zh_HK); 11 | i18next.addResourceBundle('ja_JP', 'explorer', ja_JP); 12 | i18next.addResourceBundle('ru_RU', 'explorer', ru_RU); 13 | -------------------------------------------------------------------------------- /src/pages/help/NotificationSettings/locale/index.ts: -------------------------------------------------------------------------------- 1 | import i18next from 'i18next'; 2 | import en_US from './en_US'; 3 | import zh_CN from './zh_CN'; 4 | import zh_HK from './zh_HK'; 5 | import ja_JP from "./ja_JP"; 6 | import ru_RU from "./ru_RU"; 7 | 8 | i18next.addResourceBundle('en_US', 'notificationSettings', en_US); 9 | i18next.addResourceBundle('zh_CN', 'notificationSettings', zh_CN); 10 | i18next.addResourceBundle('zh_HK', 'notificationSettings', zh_HK); 11 | i18next.addResourceBundle('ja_JP', 'notificationSettings', ja_JP); 12 | i18next.addResourceBundle('ru_RU', 'notificationSettings', ru_RU); 13 | -------------------------------------------------------------------------------- /src/pages/help/NotificationSettings/style.less: -------------------------------------------------------------------------------- 1 | .webhooks-container { 2 | display: flex; 3 | gap: 16px; 4 | } 5 | .webhooks-content { 6 | width: 100%; 7 | } 8 | .webhook-item { 9 | border: 1px solid var(--fc-border-color); 10 | padding: 16px; 11 | margin-bottom: 10px; 12 | position: relative; 13 | } 14 | .webhook-item-remove { 15 | position: absolute; 16 | top: 8px; 17 | right: 8px; 18 | cursor: pointer; 19 | font-size: 14px; 20 | color: #999; 21 | &:hover { 22 | color: #333; 23 | } 24 | } 25 | .webhooks-doc { 26 | width: 300px; 27 | } 28 | 29 | .channels-container { 30 | .ant-table { 31 | margin-top: 0 !important; 32 | } 33 | } -------------------------------------------------------------------------------- /src/pages/help/NotificationSettings/types.ts: -------------------------------------------------------------------------------- 1 | export interface WebhookType { 2 | enable: boolean; 3 | note: string; 4 | url: string; 5 | timeout: number; 6 | basic_auth_user: string; 7 | basic_auth_password: string; 8 | headers: { 9 | [key: string]: string; 10 | }; 11 | skip_verify: boolean; 12 | } 13 | 14 | export interface ScriptType { 15 | enable: boolean; 16 | content: string; 17 | timeout: number; 18 | type: 0 | 1; 19 | } 20 | 21 | export interface ChannelType { 22 | name: string; 23 | ident: string; 24 | hide: boolean; 25 | built_in: boolean; 26 | } 27 | 28 | export interface ContactType { 29 | name: string; 30 | ident: string; 31 | hide: boolean; 32 | built_in: boolean; 33 | } 34 | -------------------------------------------------------------------------------- /src/pages/help/NotificationTpls/locale/en_US.ts: -------------------------------------------------------------------------------- 1 | const en_US = { 2 | title: 'Notification template management', 3 | list: 'List', 4 | name: 'Name', 5 | channel: 'Channel', 6 | contact_key_name: 'Contact name', 7 | contact_key: 'Contact key', 8 | hide_channel: 'Hide channel', 9 | hide_contact: 'Hide contact', 10 | hide: { 11 | 0: 'No', 12 | 1: 'Yes', 13 | }, 14 | content_prompt: 'The content has been modified. Do you want to discard the changes?', 15 | post_title: 'Add notification template', 16 | update_title: 'Edit notification template', 17 | }; 18 | export default en_US; 19 | -------------------------------------------------------------------------------- /src/pages/help/NotificationTpls/locale/index.ts: -------------------------------------------------------------------------------- 1 | import i18next from 'i18next'; 2 | import en_US from './en_US'; 3 | import zh_CN from './zh_CN'; 4 | import zh_HK from './zh_HK'; 5 | import ja_JP from "./ja_JP"; 6 | import ru_RU from "./ru_RU"; 7 | 8 | i18next.addResourceBundle('en_US', 'notificationTpls', en_US); 9 | i18next.addResourceBundle('zh_CN', 'notificationTpls', zh_CN); 10 | i18next.addResourceBundle('zh_HK', 'notificationTpls', zh_HK); 11 | i18next.addResourceBundle('ja_JP', 'notificationTpls', ja_JP); 12 | i18next.addResourceBundle('ru_RU', 'notificationTpls', ru_RU); 13 | -------------------------------------------------------------------------------- /src/pages/help/NotificationTpls/locale/ja_JP.ts: -------------------------------------------------------------------------------- 1 | const ja_JP = { 2 | title: "通知テンプレート管理", 3 | list: "通知テンプレート", 4 | name: "名前", 5 | channel: "識別子", 6 | contact_key_name: "連絡先名", 7 | contact_key: "連絡先識別子", 8 | hide_channel: "チャネルを非表示", 9 | hide_contact: "連絡先を非表示", 10 | hide: { 11 | "0": "非表示しない", 12 | "1": "非表示", 13 | }, 14 | content_prompt: "内容が変更されています。変更された内容を放棄しますか?", 15 | post_title: "新しい通知テンプレートを追加", 16 | update_title: "通知テンプレートを編集", 17 | }; 18 | 19 | export default ja_JP; 20 | -------------------------------------------------------------------------------- /src/pages/help/NotificationTpls/locale/ru_RU.ts: -------------------------------------------------------------------------------- 1 | const ru_RU = { 2 | title: 'Управление шаблонами уведомлений', 3 | list: 'Шаблоны уведомлений', 4 | name: 'Название', 5 | channel: 'Идентификатор', 6 | contact_key_name: 'Название способа связи', 7 | contact_key: 'Идентификатор способа связи', 8 | hide_channel: 'Скрыть канал', 9 | hide_contact: 'Скрыть контактную информацию', 10 | hide: { 11 | '0': 'Не скрывать', 12 | '1': 'Скрывать', 13 | }, 14 | content_prompt: 'Содержимое изменено, хотите отменить изменения?', 15 | post_title: 'Добавить новый шаблон уведомления', 16 | update_title: 'Редактировать шаблон уведомления', 17 | }; 18 | 19 | export default ru_RU; 20 | -------------------------------------------------------------------------------- /src/pages/help/NotificationTpls/locale/zh_CN.ts: -------------------------------------------------------------------------------- 1 | const zh_CN = { 2 | title: '通知模板管理', 3 | list: '通知模板', 4 | name: '名称', 5 | channel: '标识', 6 | contact_key_name: '联系方式名称', 7 | contact_key: '联系方式标识', 8 | hide_channel: '隐藏通道', 9 | hide_contact: '隐藏联系方式', 10 | hide: { 11 | 0: '不隐藏', 12 | 1: '隐藏', 13 | }, 14 | content_prompt: '内容有修改,是否放弃修改的内容?', 15 | post_title: '新增通知模板', 16 | update_title: '编辑通知模板', 17 | }; 18 | export default zh_CN; 19 | -------------------------------------------------------------------------------- /src/pages/help/NotificationTpls/locale/zh_HK.ts: -------------------------------------------------------------------------------- 1 | const zh_HK = { 2 | title: '通知模板管理', 3 | list: '通知模板', 4 | name: '名稱', 5 | channel: '標識', 6 | contact_key_name: '聯繫方式名稱', 7 | contact_key: '聯繫方式標識', 8 | hide_channel: '隱藏通道', 9 | hide_contact: '隱藏聯繫方式', 10 | hide: { 11 | '0': '不隱藏', 12 | '1': '隱藏', 13 | }, 14 | content_prompt: '內容有修改,是否放棄修改的內容?', 15 | post_title: '新增通知模板', 16 | update_title: '編輯通知模板', 17 | }; 18 | 19 | export default zh_HK; 20 | -------------------------------------------------------------------------------- /src/pages/help/NotificationTpls/style.less: -------------------------------------------------------------------------------- 1 | .n9e-notification-tpls { 2 | background-color: unset !important; 3 | display: flex; 4 | gap: 10px; 5 | height: 100%; 6 | } -------------------------------------------------------------------------------- /src/pages/help/NotificationTpls/types.ts: -------------------------------------------------------------------------------- 1 | export interface NotifyTplsType { 2 | id: number; 3 | name: string; 4 | channel: string; 5 | content?: string; 6 | contact_key: string; 7 | contact_key_name: string; 8 | hide_contact: 0 | 1; 9 | hide_channel: 0 | 1; 10 | built_in: boolean; 11 | } 12 | -------------------------------------------------------------------------------- /src/pages/help/SSOConfigs/locale/en_US.ts: -------------------------------------------------------------------------------- 1 | const en_US = { 2 | title: 'Single Sign-On settings', 3 | }; 4 | export default en_US; 5 | -------------------------------------------------------------------------------- /src/pages/help/SSOConfigs/locale/index.ts: -------------------------------------------------------------------------------- 1 | import i18next from 'i18next'; 2 | import en_US from './en_US'; 3 | import zh_CN from './zh_CN'; 4 | import zh_HK from './zh_HK'; 5 | import ja_JP from "./ja_JP"; 6 | import ru_RU from "./ru_RU"; 7 | 8 | i18next.addResourceBundle('en_US', 'SSOConfigs', en_US); 9 | i18next.addResourceBundle('zh_CN', 'SSOConfigs', zh_CN); 10 | i18next.addResourceBundle('zh_HK', 'SSOConfigs', zh_HK); 11 | i18next.addResourceBundle('ja_JP', 'SSOConfigs', ja_JP); 12 | i18next.addResourceBundle('ru_RU', 'SSOConfigs', ru_RU); 13 | -------------------------------------------------------------------------------- /src/pages/help/SSOConfigs/locale/ja_JP.ts: -------------------------------------------------------------------------------- 1 | const ja_JP = { 2 | title: "シングルサインオン管理", 3 | }; 4 | 5 | export default ja_JP; 6 | -------------------------------------------------------------------------------- /src/pages/help/SSOConfigs/locale/ru_RU.ts: -------------------------------------------------------------------------------- 1 | const ru_RU = { 2 | title: 'Управление SSO', 3 | }; 4 | 5 | export default ru_RU; 6 | -------------------------------------------------------------------------------- /src/pages/help/SSOConfigs/locale/zh_CN.ts: -------------------------------------------------------------------------------- 1 | const zh_CN = { 2 | title: '单点登录管理', 3 | }; 4 | export default zh_CN; 5 | -------------------------------------------------------------------------------- /src/pages/help/SSOConfigs/locale/zh_HK.ts: -------------------------------------------------------------------------------- 1 | const zh_HK = { 2 | title: '單點登入管理', 3 | }; 4 | 5 | export default zh_HK; 6 | -------------------------------------------------------------------------------- /src/pages/help/SSOConfigs/services.ts: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request'; 2 | import { RequestMethod } from '@/store/common'; 3 | import { SSOConfigType } from './types'; 4 | 5 | export const getSSOConfigs = function (): Promise { 6 | return request('/api/n9e/sso-configs', { 7 | method: RequestMethod.Get, 8 | }).then((res) => { 9 | return res.dat || []; 10 | }); 11 | }; 12 | 13 | export const putSSOConfig = function (data: SSOConfigType) { 14 | return request('/api/n9e/sso-config', { 15 | method: RequestMethod.Put, 16 | data, 17 | }).then((res) => { 18 | return res.dat || []; 19 | }); 20 | }; 21 | -------------------------------------------------------------------------------- /src/pages/help/SSOConfigs/types.ts: -------------------------------------------------------------------------------- 1 | export interface SSOConfigType { 2 | id: number; 3 | name: string; 4 | content: string; 5 | } 6 | -------------------------------------------------------------------------------- /src/pages/help/migrate/locale/en_US.ts: -------------------------------------------------------------------------------- 1 | const en_US = { 2 | title: 'Dashboard Migration', 3 | migrate: 'Migration', 4 | help: ` 5 | The v6 version will not support global Prometheus cluster switching. The new version can achieve this capability through the panel associated data source variable. 6 |
7 | The migration tool will create a data source variable and associate all panels that are not associated with the data source. 8 |
9 | The following is a list of dashboards to be migrated. Click the migration button to start the migration. 10 | `, 11 | }; 12 | export default en_US; 13 | -------------------------------------------------------------------------------- /src/pages/help/migrate/locale/index.ts: -------------------------------------------------------------------------------- 1 | import i18next from 'i18next'; 2 | import en_US from './en_US'; 3 | import zh_CN from './zh_CN'; 4 | import zh_HK from './zh_HK'; 5 | import ja_JP from "./ja_JP"; 6 | import ru_RU from "./ru_RU"; 7 | 8 | i18next.addResourceBundle('en_US', 'migrationDashboard', en_US); 9 | i18next.addResourceBundle('zh_CN', 'migrationDashboard', zh_CN); 10 | i18next.addResourceBundle('zh_HK', 'migrationDashboard', zh_HK); 11 | i18next.addResourceBundle('ja_JP', 'migrationDashboard', ja_JP); 12 | i18next.addResourceBundle('ru_RU', 'migrationDashboard', ru_RU); 13 | -------------------------------------------------------------------------------- /src/pages/help/migrate/locale/ja_JP.ts: -------------------------------------------------------------------------------- 1 | const ja_JP = { 2 | title: "ダッシュボード移行", 3 | migrate: "移行", 4 | help: "\n v6 版本では、全局 Prometheus クラスターの切り替えがサポートされなくなります。新しいバージョンでは、データソース変数を通じてグラフの関連付けを行うことで、この機能を実現できます。\n
\n 移行ツールは、データソース変数を作成し、未関連のデータソースを持つすべてのグラフを関連付けします。\n
\n 以下は移行が必要なダッシュボードの一覧です。移行ボタンをクリックして移行を開始します。\n ", 5 | }; 6 | 7 | export default ja_JP; 8 | -------------------------------------------------------------------------------- /src/pages/help/migrate/locale/ru_RU.ts: -------------------------------------------------------------------------------- 1 | const ru_RU = { 2 | title: 'Перенос панелей', 3 | migrate: 'Перенос', 4 | help: '\n v6 версия больше не поддерживает глобальный переключатель кластера Prometheus, но новая версия может реализовать эту функцию с помощью переменных данных панели. \n
\n Инструмент переноса создаст переменные данных и все несвязанные панели данных. \n
\n Вот список панелей для переноса, нажмите кнопку переноса, чтобы начать перенос. \n ', 5 | }; 6 | 7 | export default ru_RU; 8 | -------------------------------------------------------------------------------- /src/pages/help/migrate/locale/zh_CN.ts: -------------------------------------------------------------------------------- 1 | const zh_CN = { 2 | title: '仪表盘迁移', 3 | migrate: '迁移', 4 | help: ` 5 | v6 版本将不再支持全局 Prometheus 集群切换,新版本可通过图表关联数据源变量来实现该能力。 6 |
7 | 迁移工具会创建数据源变量以及关联所有未关联数据源的图表。 8 |
9 | 以下是待迁移的仪表盘列表,点击迁移按钮开始迁移。 10 | `, 11 | }; 12 | export default zh_CN; 13 | -------------------------------------------------------------------------------- /src/pages/help/migrate/locale/zh_HK.ts: -------------------------------------------------------------------------------- 1 | const zh_HK = { 2 | title: '儀表盤遷移', 3 | migrate: '遷移', 4 | help: ` 5 | v6 版本將不再支持全局 Prometheus 集群切換,新版本可通過圖表關聯數據源變量來實現該能力。 6 |
7 | 遷移工具會創建數據源變量以及關聯所有未關聯數據源的圖表。 8 |
9 | 以下是待遷移的儀表盤列表,點擊遷移按鈕開始遷移。 10 | `, 11 | }; 12 | 13 | export default zh_HK; 14 | -------------------------------------------------------------------------------- /src/pages/help/servers/locale/en_US.ts: -------------------------------------------------------------------------------- 1 | const en_US = { 2 | title: 'Alerting engines', 3 | instance: 'Instance', 4 | cluster: 'Cluster', 5 | datasource: 'Datasource', 6 | modify_datasource: 'Modify datasource', 7 | clock: 'Last heartbeat', 8 | unauthorized: 'You are not authorized to view this page', 9 | }; 10 | export default en_US; 11 | -------------------------------------------------------------------------------- /src/pages/help/servers/locale/index.ts: -------------------------------------------------------------------------------- 1 | import i18next from 'i18next'; 2 | import en_US from './en_US'; 3 | import zh_CN from './zh_CN'; 4 | import zh_HK from './zh_HK'; 5 | import ja_JP from "./ja_JP"; 6 | import ru_RU from "./ru_RU"; 7 | 8 | i18next.addResourceBundle('en_US', 'servers', en_US); 9 | i18next.addResourceBundle('zh_CN', 'servers', zh_CN); 10 | i18next.addResourceBundle('zh_HK', 'servers', zh_HK); 11 | i18next.addResourceBundle('ja_JP', 'servers', ja_JP); 12 | i18next.addResourceBundle('ru_RU', 'servers', ru_RU); 13 | -------------------------------------------------------------------------------- /src/pages/help/servers/locale/ja_JP.ts: -------------------------------------------------------------------------------- 1 | const ja_JP = { 2 | title: "アラートエンジン", 3 | instance: "エンジンインスタンス", 4 | cluster: "エンジンクラスター", 5 | datasource: "データソース", 6 | modify_datasource: "データソースを変更", 7 | clock: "最後の心拍時間", 8 | unauthorized: "権限が不足していて、表示できません", 9 | }; 10 | 11 | export default ja_JP; 12 | -------------------------------------------------------------------------------- /src/pages/help/servers/locale/ru_RU.ts: -------------------------------------------------------------------------------- 1 | const ru_RU = { 2 | title: 'Система оповещений', 3 | instance: 'Экземпляр движка', 4 | cluster: 'Движок кластера', 5 | datasource: 'Источник данных', 6 | modify_datasource: 'Изменить источник данных', 7 | clock: 'Время последнего обновления', 8 | unauthorized: 'У вас нет прав на просмотр', 9 | }; 10 | 11 | export default ru_RU; 12 | -------------------------------------------------------------------------------- /src/pages/help/servers/locale/zh_CN.ts: -------------------------------------------------------------------------------- 1 | const zh_CN = { 2 | title: '告警引擎', 3 | instance: '引擎实例', 4 | cluster: '引擎集群', 5 | datasource: '数据源', 6 | modify_datasource: '修改数据源', 7 | clock: '上次心跳时间', 8 | unauthorized: '您没有权限查看', 9 | }; 10 | export default zh_CN; 11 | -------------------------------------------------------------------------------- /src/pages/help/servers/locale/zh_HK.ts: -------------------------------------------------------------------------------- 1 | const zh_HK = { 2 | title: '告警引擎', 3 | instance: '引擎例項', 4 | cluster: '引擎叢集', 5 | datasource: '數據源', 6 | modify_datasource: '修改數據源', 7 | clock: '上次心跳時間', 8 | unauthorized: '你沒有權限檢視', 9 | }; 10 | 11 | export default zh_HK; 12 | -------------------------------------------------------------------------------- /src/pages/help/version/locale/en_US.ts: -------------------------------------------------------------------------------- 1 | const en_US = { 2 | title: 'About product', 3 | frontend: 'Frontend version', 4 | backend: 'Backend version', 5 | }; 6 | export default en_US; 7 | -------------------------------------------------------------------------------- /src/pages/help/version/locale/index.ts: -------------------------------------------------------------------------------- 1 | import i18next from 'i18next'; 2 | import en_US from './en_US'; 3 | import zh_CN from './zh_CN'; 4 | import zh_HK from './zh_HK'; 5 | import ja_JP from "./ja_JP"; 6 | import ru_RU from "./ru_RU"; 7 | 8 | i18next.addResourceBundle('en_US', 'version', en_US); 9 | i18next.addResourceBundle('zh_CN', 'version', zh_CN); 10 | i18next.addResourceBundle('zh_HK', 'version', zh_HK); 11 | i18next.addResourceBundle('ja_JP', 'version', ja_JP); 12 | i18next.addResourceBundle('ru_RU', 'version', ru_RU); 13 | -------------------------------------------------------------------------------- /src/pages/help/version/locale/ja_JP.ts: -------------------------------------------------------------------------------- 1 | const ja_JP = { 2 | title: "製品について", 3 | frontend: "フロントエンドバージョン", 4 | backend: "バックエンドバージョン", 5 | }; 6 | 7 | export default ja_JP; 8 | -------------------------------------------------------------------------------- /src/pages/help/version/locale/ru_RU.ts: -------------------------------------------------------------------------------- 1 | const ru_RU = { 2 | title: 'О продукте', 3 | frontend: 'Версия фронтенда', 4 | backend: 'Версия бэкенда', 5 | }; 6 | 7 | export default ru_RU; 8 | -------------------------------------------------------------------------------- /src/pages/help/version/locale/zh_CN.ts: -------------------------------------------------------------------------------- 1 | const zh_CN = { 2 | title: '关于产品', 3 | frontend: '前端版本', 4 | backend: '后端版本', 5 | }; 6 | export default zh_CN; 7 | -------------------------------------------------------------------------------- /src/pages/help/version/locale/zh_HK.ts: -------------------------------------------------------------------------------- 1 | const zh_HK = { 2 | title: '關於產品', 3 | frontend: '前端版本', 4 | backend: '後端版本', 5 | }; 6 | 7 | export default zh_HK; 8 | -------------------------------------------------------------------------------- /src/pages/historyEvents/exportEvents.ts: -------------------------------------------------------------------------------- 1 | import { getAlertEventList } from '@/services/warning'; 2 | import { json2csv } from 'json-2-csv'; 3 | 4 | export const downloadFile = (data = '', filename = 'export.csv') => { 5 | let body = document.body; 6 | const a = document.createElement('a'); 7 | a.href = URL.createObjectURL( 8 | new Blob(['\ufeff' + data], { 9 | type: 'text/csv;charset=utf-8;', 10 | }), 11 | ); 12 | a.setAttribute('download', filename); 13 | body.appendChild(a); 14 | a.click(); 15 | body.removeChild(a); 16 | }; 17 | 18 | const exportEvents = (params, callback) => { 19 | getAlertEventList(params).then((res) => { 20 | json2csv(res, callback); 21 | }); 22 | }; 23 | export default exportEvents; 24 | -------------------------------------------------------------------------------- /src/pages/historyEvents/locale/index.ts: -------------------------------------------------------------------------------- 1 | import i18next from 'i18next'; 2 | import en_US from './en_US'; 3 | import zh_CN from './zh_CN'; 4 | import zh_HK from './zh_HK'; 5 | import ja_JP from "./ja_JP"; 6 | import ru_RU from "./ru_RU"; 7 | 8 | i18next.addResourceBundle('en_US', 'AlertHisEvents', en_US); 9 | i18next.addResourceBundle('zh_CN', 'AlertHisEvents', zh_CN); 10 | i18next.addResourceBundle('zh_HK', 'AlertHisEvents', zh_HK); 11 | i18next.addResourceBundle('ja_JP', 'AlertHisEvents', ja_JP); 12 | i18next.addResourceBundle('ru_RU', 'AlertHisEvents', ru_RU); 13 | -------------------------------------------------------------------------------- /src/pages/historyEvents/services.ts: -------------------------------------------------------------------------------- 1 | import _ from 'lodash'; 2 | import request from '@/utils/request'; 3 | import { RequestMethod } from '@/store/common'; 4 | 5 | export function getEvents(params) { 6 | return request('/api/n9e/alert-his-events/list', { 7 | method: RequestMethod.Get, 8 | params, 9 | }); 10 | } 11 | 12 | export function getEventsByIds(ids: string) { 13 | return request(`/api/n9e-plus/alert-his-events/${ids}`, { 14 | method: RequestMethod.Get, 15 | }); 16 | } 17 | -------------------------------------------------------------------------------- /src/pages/log/IndexPatterns/locale/index.ts: -------------------------------------------------------------------------------- 1 | import i18next from 'i18next'; 2 | import en_US from './en_US'; 3 | import zh_CN from './zh_CN'; 4 | import zh_HK from './zh_HK'; 5 | import ja_JP from './ja_JP'; 6 | 7 | i18next.addResourceBundle('en_US', 'es-index-patterns', en_US); 8 | i18next.addResourceBundle('ja_JP', 'es-index-patterns', ja_JP); 9 | i18next.addResourceBundle('zh_CN', 'es-index-patterns', zh_CN); 10 | i18next.addResourceBundle('zh_HK', 'es-index-patterns', zh_HK); 11 | -------------------------------------------------------------------------------- /src/pages/login/constants.ts: -------------------------------------------------------------------------------- 1 | export const NAME_SPACE = 'login'; 2 | -------------------------------------------------------------------------------- /src/pages/login/locale/en_US.ts: -------------------------------------------------------------------------------- 1 | const en_US = { 2 | username: 'Username', 3 | username_required: 'Please enter username', 4 | password: 'Password', 5 | password_required: 'Please enter password', 6 | verifyvalue: 'Verification code', 7 | verifyvalue_required: 'Please enter verification code', 8 | click_get_verify: 'Click to get verification code', 9 | login: 'Login', 10 | other_types: 'Other', 11 | language: 'Language', 12 | }; 13 | export default en_US; 14 | -------------------------------------------------------------------------------- /src/pages/login/locale/index.ts: -------------------------------------------------------------------------------- 1 | import i18next from 'i18next'; 2 | import { NAME_SPACE } from '../constants'; 3 | import en_US from './en_US'; 4 | import zh_CN from './zh_CN'; 5 | import zh_HK from './zh_HK'; 6 | import ja_JP from './ja_JP'; 7 | import ru_RU from './ru_RU'; 8 | 9 | i18next.addResourceBundle('en_US', NAME_SPACE, en_US); 10 | i18next.addResourceBundle('zh_CN', NAME_SPACE, zh_CN); 11 | i18next.addResourceBundle('zh_HK', NAME_SPACE, zh_HK); 12 | i18next.addResourceBundle('ja_JP', NAME_SPACE, ja_JP); 13 | i18next.addResourceBundle('ru_RU', NAME_SPACE, ru_RU); 14 | -------------------------------------------------------------------------------- /src/pages/login/locale/ja_JP.ts: -------------------------------------------------------------------------------- 1 | const ja_JP = { 2 | username: 'ユーザー名', 3 | username_required: 'ユーザー名を入力してください', 4 | password: 'パスワード', 5 | password_required: 'パスワードを入力してください', 6 | verifyvalue: '認証コード', 7 | verifyvalue_required: '認証コードを入力してください', 8 | click_get_verify: '認証コードを取得するにはクリックしてください', 9 | login: 'ログイン', 10 | other_types: '他のログイン方法', 11 | language: '言語', 12 | }; 13 | 14 | export default ja_JP; 15 | -------------------------------------------------------------------------------- /src/pages/login/locale/ru_RU.ts: -------------------------------------------------------------------------------- 1 | const ru_RU = { 2 | username: 'Имя пользователя', 3 | username_required: 'Введите имя пользователя', 4 | password: 'Пароль', 5 | password_required: 'Введите пароль', 6 | verifyvalue: 'Код подтверждения', 7 | verifyvalue_required: 'Введите код подтверждения', 8 | click_get_verify: 'Нажмите, чтобы получить код подтверждения', 9 | login: 'Войти', 10 | other_types: 'Другие способы входа', 11 | language: 'Язык', 12 | }; 13 | 14 | export default ru_RU; 15 | -------------------------------------------------------------------------------- /src/pages/login/locale/zh_CN.ts: -------------------------------------------------------------------------------- 1 | import { language } from '@codemirror/language'; 2 | 3 | const zh_CN = { 4 | username: '用户名', 5 | username_required: '请输入用户名', 6 | password: '密码', 7 | password_required: '请输入密码', 8 | verifyvalue: '验证码', 9 | verifyvalue_required: '请输入验证码', 10 | click_get_verify: '点击获取验证码', 11 | login: '登录', 12 | other_types: '其他登录方式', 13 | language: '语言', 14 | }; 15 | export default zh_CN; 16 | -------------------------------------------------------------------------------- /src/pages/login/locale/zh_HK.ts: -------------------------------------------------------------------------------- 1 | const zh_HK = { 2 | username: '用戶名', 3 | username_required: '請輸入用戶名', 4 | password: '密碼', 5 | password_required: '請輸入密碼', 6 | verifyvalue: '驗證碼', 7 | verifyvalue_required: '請輸入驗證碼', 8 | click_get_verify: '點擊獲取驗證碼', 9 | login: '登錄', 10 | other_types: '其他登錄方式', 11 | language: '語言', 12 | }; 13 | 14 | export default zh_HK; 15 | -------------------------------------------------------------------------------- /src/pages/metricsBuiltin/locale/index.ts: -------------------------------------------------------------------------------- 1 | import i18next from 'i18next'; 2 | import en_US from './en_US'; 3 | import zh_CN from './zh_CN'; 4 | import zh_HK from './zh_HK'; 5 | import ja_JP from "./ja_JP"; 6 | import ru_RU from "./ru_RU"; 7 | 8 | i18next.addResourceBundle('en_US', 'metricsBuiltin', en_US); 9 | i18next.addResourceBundle('zh_CN', 'metricsBuiltin', zh_CN); 10 | i18next.addResourceBundle('zh_HK', 'metricsBuiltin', zh_HK); 11 | i18next.addResourceBundle('ja_JP', 'metricsBuiltin', ja_JP); 12 | i18next.addResourceBundle('ru_RU', 'metricsBuiltin', ru_RU); 13 | -------------------------------------------------------------------------------- /src/pages/metricsBuiltin/types.ts: -------------------------------------------------------------------------------- 1 | export interface Record { 2 | uid: number; // 只是用于 panel 的 id 3 | id: number; 4 | collector: string; 5 | typ: string; 6 | name: string; 7 | unit: string; 8 | note: string; 9 | expression?: string; 10 | } 11 | 12 | export type PostRecord = Omit; 13 | export type PutRecord = Record; 14 | 15 | export interface Filter { 16 | collector?: string; 17 | typ?: string; 18 | unit?: string[]; 19 | query?: string; 20 | } 21 | -------------------------------------------------------------------------------- /src/pages/monitor/object/locale/index.ts: -------------------------------------------------------------------------------- 1 | import i18next from 'i18next'; 2 | import en_US from './en_US'; 3 | import zh_CN from './zh_CN'; 4 | import zh_HK from './zh_HK'; 5 | 6 | i18next.addResourceBundle('en_US', 'objectExplorer', en_US); 7 | i18next.addResourceBundle('zh_CN', 'objectExplorer', zh_CN); 8 | i18next.addResourceBundle('zh_HK', 'objectExplorer', zh_HK); 9 | -------------------------------------------------------------------------------- /src/pages/monitor/object/metricViews/components/Collapse/style.less: -------------------------------------------------------------------------------- 1 | .n9e-sidebar-collapse { 2 | width: 12px; 3 | padding: 0px; 4 | margin: 0px; 5 | .n9e-sidebar-collapse-content { 6 | visibility: hidden; 7 | } 8 | .n9e-sidebar-collapse-btn { 9 | right: 0px; 10 | } 11 | } 12 | .n9e-sidebar-collapse-btn { 13 | cursor: pointer; 14 | position: absolute; 15 | display: flex; 16 | align-items: center; 17 | top: 50%; 18 | margin-top: -29px; 19 | right: -10px; 20 | height: 58px; 21 | width: 10px; 22 | border-radius: 6px; 23 | background: var(--fc-fill-4); 24 | } 25 | -------------------------------------------------------------------------------- /src/pages/notFound/locale/en_US.ts: -------------------------------------------------------------------------------- 1 | const en_US = { 2 | 网络开小差了: ' network has deviated', 3 | 可以刷新一下试试: 'You can try refreshing it', 4 | 刷新: 'Refresh', 5 | }; 6 | 7 | export default en_US; 8 | -------------------------------------------------------------------------------- /src/pages/notFound/locale/index.ts: -------------------------------------------------------------------------------- 1 | import i18next from 'i18next'; 2 | import en_US from './en_US'; 3 | import zh_CN from './zh_CN'; 4 | import zh_HK from './zh_HK'; 5 | import ja_JP from "./ja_JP"; 6 | import ru_RU from "./ru_RU"; 7 | 8 | i18next.addResourceBundle('en_US', 'notFound', en_US); 9 | i18next.addResourceBundle('zh_CN', 'notFound', zh_CN); 10 | i18next.addResourceBundle('zh_HK', 'notFound', zh_HK); 11 | i18next.addResourceBundle('ja_JP', 'notFound', ja_JP); 12 | i18next.addResourceBundle('ru_RU', 'notFound', ru_RU); 13 | -------------------------------------------------------------------------------- /src/pages/notFound/locale/ja_JP.ts: -------------------------------------------------------------------------------- 1 | const ja_JP = { 2 | "The Flashcat webpage is": "Flashcatウェブページ", 3 | "The Nightingale webpage is": "Nightingale監視ウェブページ", 4 | "out of Service": "サービスが利用できません", 5 | }; 6 | 7 | export default ja_JP; 8 | -------------------------------------------------------------------------------- /src/pages/notFound/locale/ru_RU.ts: -------------------------------------------------------------------------------- 1 | const ru_RU = { 2 | 'The Flashcat webpage is': 'Веб-страница Flashcat', 3 | 'The Nightingale webpage is': 'Веб-страница мониторинга Nightingale', 4 | 'out of Service': 'недоступна', 5 | }; 6 | 7 | export default ru_RU; 8 | -------------------------------------------------------------------------------- /src/pages/notFound/locale/zh_CN.ts: -------------------------------------------------------------------------------- 1 | const zh_CN = { 2 | 'The Flashcat webpage is': "Flashcat网页端", 3 | 'The Nightingale webpage is': "夜莺监控网页端", 4 | 'out of Service': "服务不可用" 5 | }; 6 | export default zh_CN; 7 | -------------------------------------------------------------------------------- /src/pages/notFound/locale/zh_HK.ts: -------------------------------------------------------------------------------- 1 | const zh_HK = { 2 | "网络开小差了": "網絡開小差了", 3 | "可以刷新一下试试": "可以刷新一下試試", 4 | "刷新": "刷新", 5 | } 6 | 7 | export default zh_HK; 8 | -------------------------------------------------------------------------------- /src/pages/notificationChannels/entry.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import './locale'; 4 | import { NS } from './constants'; 5 | import List from './pages/List'; 6 | import Add from './pages/Add'; 7 | import Edit from './pages/Edit'; 8 | 9 | export default { 10 | routes: [ 11 | { 12 | path: `/${NS}`, 13 | component: List, 14 | exact: true, 15 | }, 16 | { 17 | path: `/${NS}/add`, 18 | component: Add, 19 | exact: true, 20 | }, 21 | { 22 | path: `/${NS}/edit/:id`, 23 | component: Edit, 24 | exact: true, 25 | }, 26 | ], 27 | }; 28 | -------------------------------------------------------------------------------- /src/pages/notificationChannels/locale/index.ts: -------------------------------------------------------------------------------- 1 | import i18next from 'i18next'; 2 | import { NS } from '../constants'; 3 | import en_US from './en_US'; 4 | import zh_CN from './zh_CN'; 5 | import zh_HK from './zh_HK'; 6 | import ja_JP from './ja_JP'; 7 | import ru_RU from "./ru_RU"; 8 | 9 | i18next.addResourceBundle('en_US', NS, en_US); 10 | i18next.addResourceBundle('zh_CN', NS, zh_CN); 11 | i18next.addResourceBundle('zh_HK', NS, zh_HK); 12 | i18next.addResourceBundle('ja_JP', NS, ja_JP); 13 | i18next.addResourceBundle('ru_RU', NS, ru_RU); 14 | -------------------------------------------------------------------------------- /src/pages/notificationChannels/pages/Form/ContactKeysSelect/services.ts: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request'; 2 | import { RequestMethod } from '@/store/common'; 3 | 4 | export interface Item { 5 | key: string; 6 | label: string; 7 | } 8 | 9 | export function getContactKeys(): Promise { 10 | return request('/api/n9e/contact-keys', { 11 | method: RequestMethod.Get, 12 | }).then((res) => { 13 | return res.dat ?? []; 14 | }); 15 | } 16 | -------------------------------------------------------------------------------- /src/pages/notificationRules/constants.ts: -------------------------------------------------------------------------------- 1 | import moment from 'moment'; 2 | 3 | export const NS = 'notification-rules'; 4 | export const CN = 'n9e-notification-rules'; 5 | export const PERM = `/${NS}`; 6 | export const DEFAULT_VALUES = { 7 | enable: true, 8 | notify_configs: [ 9 | { 10 | severities: [1, 2, 3], 11 | }, 12 | ], 13 | }; 14 | export const DEFAULT_VALUES_TIME_RANGE = { 15 | week: [0, 1, 2, 3, 4, 5, 6], 16 | start: moment('00:00', 'HH:mm'), 17 | end: moment('00:00', 'HH:mm'), 18 | }; 19 | export const TABLE_PAGINATION_CACHE_KEY = `${NS}-table-pagination`; 20 | -------------------------------------------------------------------------------- /src/pages/notificationRules/entry.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { NS } from './constants'; 4 | import List from './pages/List'; 5 | import Add from './pages/Add'; 6 | import Edit from './pages/Edit'; 7 | import './style.less'; 8 | import './locale'; 9 | 10 | export default { 11 | routes: [ 12 | { 13 | path: `/${NS}`, 14 | component: List, 15 | exact: true, 16 | }, 17 | { 18 | path: `/${NS}/add`, 19 | component: Add, 20 | exact: true, 21 | }, 22 | { 23 | path: `/${NS}/edit/:id`, 24 | component: Edit, 25 | exact: true, 26 | }, 27 | ], 28 | }; 29 | -------------------------------------------------------------------------------- /src/pages/notificationRules/locale/index.ts: -------------------------------------------------------------------------------- 1 | import i18next from 'i18next'; 2 | import { NS } from '../constants'; 3 | import en_US from './en_US'; 4 | import zh_CN from './zh_CN'; 5 | import zh_HK from './zh_HK'; 6 | import ja_JP from './ja_JP'; 7 | import ru_RU from "./ru_RU"; 8 | 9 | i18next.addResourceBundle('en_US', NS, en_US); 10 | i18next.addResourceBundle('zh_CN', NS, zh_CN); 11 | i18next.addResourceBundle('zh_HK', NS, zh_HK); 12 | i18next.addResourceBundle('ja_JP', NS, ja_JP); 13 | i18next.addResourceBundle('ru_RU', NS, ru_RU); 14 | -------------------------------------------------------------------------------- /src/pages/notificationRules/style.less: -------------------------------------------------------------------------------- 1 | .n9e-notification-rules { 2 | @keyframes borderFlash { 3 | 0% { border: 0 solid transparent; } 4 | 50% { border: 2px solid var(--fc-fill-primary); } 5 | 100% { border: 0 solid transparent; } 6 | } 7 | 8 | .rule-config-border-animate { 9 | animation: borderFlash 1s ease-in-out forwards; 10 | } 11 | } -------------------------------------------------------------------------------- /src/pages/notificationRules/utils/getValuePropsWithTimeFormItem.ts: -------------------------------------------------------------------------------- 1 | import _ from 'lodash'; 2 | import moment from 'moment'; 3 | 4 | export default function getValuePropsWithTimeFormItem(value: string | moment.Moment) { 5 | if (_.isString(value)) { 6 | return { 7 | value: moment(value, 'HH:mm'), 8 | }; 9 | } 10 | if (moment.isMoment(value)) { 11 | return { 12 | value: value, 13 | }; 14 | } 15 | return { 16 | value: undefined, 17 | }; 18 | } 19 | -------------------------------------------------------------------------------- /src/pages/notificationTemplates/constants.ts: -------------------------------------------------------------------------------- 1 | export const NS = 'notification-templates'; 2 | export const CN = 'n9e-notification-templates'; 3 | export const PERM = `/${NS}`; 4 | export const DEFAULT_VALUES = {}; 5 | -------------------------------------------------------------------------------- /src/pages/notificationTemplates/entry.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import './locale'; 4 | import { NS } from './constants'; 5 | import List from './pages/List'; 6 | 7 | export default { 8 | routes: [ 9 | { 10 | path: `/${NS}`, 11 | component: List, 12 | exact: true, 13 | }, 14 | ], 15 | }; 16 | -------------------------------------------------------------------------------- /src/pages/notificationTemplates/locale/index.ts: -------------------------------------------------------------------------------- 1 | import i18next from 'i18next'; 2 | import { NS } from '../constants'; 3 | import en_US from './en_US'; 4 | import zh_CN from './zh_CN'; 5 | import zh_HK from './zh_HK'; 6 | import ja_JP from './ja_JP'; 7 | import ru_RU from "./ru_RU"; 8 | 9 | i18next.addResourceBundle('en_US', NS, en_US); 10 | i18next.addResourceBundle('zh_CN', NS, zh_CN); 11 | i18next.addResourceBundle('zh_HK', NS, zh_HK); 12 | i18next.addResourceBundle('ja_JP', NS, ja_JP); 13 | i18next.addResourceBundle('ru_RU', NS, ru_RU); 14 | -------------------------------------------------------------------------------- /src/pages/notificationTemplates/locale/zh_CN.ts: -------------------------------------------------------------------------------- 1 | const zh_CN = { 2 | title: '消息模板', 3 | add_title: '新增消息模板', 4 | edit_title: '编辑消息模板', 5 | clone_title: '克隆消息模板', 6 | user_group_ids: '授权团队', 7 | private: { 8 | title: '显示模式', 9 | 0: '公共', 10 | 1: '私有', 11 | }, 12 | notify_channel_ident: '媒介类型', 13 | content: { 14 | add_title: '添加模板字段', 15 | edit_title: '编辑模板字段', 16 | preview: '预览模板内容', 17 | contentKey: '字段标识', 18 | tip: '可以在通知媒介中使用的字段,通过 $tpl.{{contentKey}} 引用此字段的内容', 19 | prompt: '内容有修改,是否放弃修改的内容?', 20 | value_msg: '请输入字段内容', 21 | }, 22 | preview: { 23 | select_events: '选择告警事件', 24 | result: '预览结果', 25 | }, 26 | }; 27 | export default zh_CN; 28 | -------------------------------------------------------------------------------- /src/pages/notificationTemplates/locale/zh_HK.ts: -------------------------------------------------------------------------------- 1 | const zh_HK = { 2 | title: '消息模板', 3 | add_title: '新增消息模板', 4 | edit_title: '編輯消息模板', 5 | clone_title: '克隆消息模板', 6 | user_group_ids: '授權團隊', 7 | private: { 8 | title: '顯示模式', 9 | 0: '公共', 10 | 1: '私有', 11 | }, 12 | notify_channel_ident: '媒介類型', 13 | content: { 14 | add_title: '添加模板字段', 15 | edit_title: '編輯模板字段', 16 | preview: '預覽模板內容', 17 | contentKey: '字段標識', 18 | tip: '可以在通知媒介中使用的字段,通過 $tpl.{{contentKey}} 引用此字段的內容', 19 | prompt: '內容有修改,是否放棄修改的內容?', 20 | value_msg: '請輸入字段內容', 21 | }, 22 | preview: { 23 | select_events: '選擇告警事件', 24 | result: '預覽結果', 25 | }, 26 | }; 27 | 28 | export default zh_HK; 29 | -------------------------------------------------------------------------------- /src/pages/notificationTemplates/types.ts: -------------------------------------------------------------------------------- 1 | export interface Item { 2 | id: number; 3 | name: string; 4 | ident: string; 5 | content: { 6 | [index: string]: string | undefined; 7 | }; 8 | user_group_ids: number[]; 9 | private: 0 | 1; // 0: 公共 1: 私有 10 | notify_channel_ident: string; 11 | create_by: string; 12 | } 13 | -------------------------------------------------------------------------------- /src/pages/permissions/locale/en_US.ts: -------------------------------------------------------------------------------- 1 | const en_US = { 2 | title: 'Roles', 3 | roles: 'Roles', 4 | role_add: 'Add Role', 5 | edit_title: { 6 | post: 'Add Role', 7 | put: 'Edit Role', 8 | }, 9 | }; 10 | export default en_US; 11 | -------------------------------------------------------------------------------- /src/pages/permissions/locale/index.ts: -------------------------------------------------------------------------------- 1 | import i18next from 'i18next'; 2 | import en_US from './en_US'; 3 | import zh_CN from './zh_CN'; 4 | import zh_HK from './zh_HK'; 5 | import ja_JP from "./ja_JP"; 6 | import ru_RU from "./ru_RU"; 7 | 8 | i18next.addResourceBundle('en_US', 'permissions', en_US); 9 | i18next.addResourceBundle('zh_CN', 'permissions', zh_CN); 10 | i18next.addResourceBundle('zh_HK', 'permissions', zh_HK); 11 | i18next.addResourceBundle('ja_JP', 'permissions', ja_JP); 12 | i18next.addResourceBundle('ru_RU', 'permissions', ru_RU); 13 | -------------------------------------------------------------------------------- /src/pages/permissions/locale/ja_JP.ts: -------------------------------------------------------------------------------- 1 | const ja_JP = { 2 | title: 'ロール管理', 3 | roles: 'ロールリスト', 4 | role_add: 'ロールの追加', 5 | edit_title: { 6 | post: 'ロールの追加', 7 | put: 'ロールの編集', 8 | }, 9 | }; 10 | 11 | export default ja_JP; 12 | -------------------------------------------------------------------------------- /src/pages/permissions/locale/ru_RU.ts: -------------------------------------------------------------------------------- 1 | const ru_RU = { 2 | title: 'Параметры доступа', 3 | roles: 'Список ролей', 4 | role_add: 'Добавить роль', 5 | edit_title: { 6 | post: 'Добавить роль', 7 | put: 'Редактировать роль', 8 | }, 9 | }; 10 | 11 | export default ru_RU; 12 | -------------------------------------------------------------------------------- /src/pages/permissions/locale/zh_CN.ts: -------------------------------------------------------------------------------- 1 | const zh_CN = { 2 | title: '角色管理', 3 | roles: '角色列表', 4 | role_add: '添加角色', 5 | edit_title: { 6 | post: '添加角色', 7 | put: '编辑角色', 8 | }, 9 | }; 10 | export default zh_CN; 11 | -------------------------------------------------------------------------------- /src/pages/permissions/locale/zh_HK.ts: -------------------------------------------------------------------------------- 1 | const zh_HK = { 2 | title: '角色管理', 3 | roles: '角色列表', 4 | role_add: '新增角色', 5 | edit_title: { 6 | post: '新增角色', 7 | put: '編輯角色', 8 | }, 9 | }; 10 | 11 | export default zh_HK; 12 | -------------------------------------------------------------------------------- /src/pages/permissions/types.ts: -------------------------------------------------------------------------------- 1 | export interface RoleType { 2 | id: number; 3 | name: string; 4 | note?: string; 5 | } 6 | 7 | export type RolePostType = Omit; 8 | 9 | export interface OperationType { 10 | name: string; 11 | cname: string; 12 | ops: { 13 | name: string; 14 | cname: string; 15 | }[]; 16 | } 17 | -------------------------------------------------------------------------------- /src/pages/recordingRules/add.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { useTranslation } from 'react-i18next'; 3 | import PageLayout from '@/components/pageLayout'; 4 | import OperateForm from './components/operateForm'; 5 | import './index.less'; 6 | 7 | const StrategyAdd: React.FC = () => { 8 | const { t } = useTranslation('recordingRules'); 9 | return ( 10 | 11 | 12 | 13 | ); 14 | }; 15 | 16 | export default StrategyAdd; 17 | -------------------------------------------------------------------------------- /src/pages/recordingRules/locale/index.ts: -------------------------------------------------------------------------------- 1 | import i18next from 'i18next'; 2 | import en_US from './en_US'; 3 | import zh_CN from './zh_CN'; 4 | import zh_HK from './zh_HK'; 5 | import ja_JP from "./ja_JP"; 6 | import ru_RU from "./ru_RU"; 7 | 8 | i18next.addResourceBundle('en_US', 'recordingRules', en_US); 9 | i18next.addResourceBundle('zh_CN', 'recordingRules', zh_CN); 10 | i18next.addResourceBundle('zh_HK', 'recordingRules', zh_HK); 11 | i18next.addResourceBundle('ja_JP', 'recordingRules', ja_JP); 12 | i18next.addResourceBundle('ru_RU', 'recordingRules', ru_RU); 13 | -------------------------------------------------------------------------------- /src/pages/siteSettings/locale/index.ts: -------------------------------------------------------------------------------- 1 | import i18next from 'i18next'; 2 | import en_US from './en_US'; 3 | import zh_CN from './zh_CN'; 4 | import zh_HK from './zh_HK'; 5 | import ja_JP from "./ja_JP"; 6 | import ru_RU from "./ru_RU"; 7 | 8 | i18next.addResourceBundle('en_US', 'siteInfo', en_US); 9 | i18next.addResourceBundle('zh_CN', 'siteInfo', zh_CN); 10 | i18next.addResourceBundle('zh_HK', 'siteInfo', zh_HK); 11 | i18next.addResourceBundle('ja_JP', 'siteInfo', ja_JP); 12 | i18next.addResourceBundle('ru_RU', 'siteInfo', ru_RU); 13 | -------------------------------------------------------------------------------- /src/pages/siteSettings/services.ts: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request'; 2 | import { RequestMethod } from '@/store/common'; 3 | 4 | export const getN9eConfig = function (key: string) { 5 | return request('/api/n9e/site-info', { 6 | method: RequestMethod.Get, 7 | params: { key }, 8 | silence: true, 9 | }).then((res) => res.dat || ''); 10 | }; 11 | 12 | export const putN9eConfig = function (data: { ckey: string; cval: string }) { 13 | return request('/api/n9e/config', { 14 | method: RequestMethod.Put, 15 | data, 16 | }); 17 | }; 18 | -------------------------------------------------------------------------------- /src/pages/targets/components/Explorer/style.less: -------------------------------------------------------------------------------- 1 | .n9e-hosts-explorer-metrics-container { 2 | height: 100%; 3 | display: flex; 4 | gap: 16px; 5 | } 6 | .n9e-hosts-explorer-metrics-list { 7 | width: 400px; 8 | flex-shrink: 0; 9 | display: flex; 10 | flex-direction: column; 11 | } 12 | .n9e-hosts-explorer-metrics-list-table { 13 | .ant-table-container { 14 | border: 1px solid var(--fc-border-color); 15 | border-radius: 2px; 16 | } 17 | } 18 | .n9e-hosts-explorer-metrics-main { 19 | width: 100%; 20 | height: 100%; 21 | overflow-x: hidden; 22 | overflow-y: auto; 23 | } -------------------------------------------------------------------------------- /src/pages/targets/locale/index.ts: -------------------------------------------------------------------------------- 1 | import i18next from 'i18next'; 2 | import en_US from './en_US'; 3 | import zh_CN from './zh_CN'; 4 | import zh_HK from './zh_HK'; 5 | import ja_JP from "./ja_JP"; 6 | import ru_RU from "./ru_RU"; 7 | 8 | i18next.addResourceBundle('en_US', 'targets', en_US); 9 | i18next.addResourceBundle('zh_CN', 'targets', zh_CN); 10 | i18next.addResourceBundle('zh_HK', 'targets', zh_HK); 11 | i18next.addResourceBundle('ja_JP', 'targets', ja_JP); 12 | i18next.addResourceBundle('ru_RU', 'targets', ru_RU); 13 | -------------------------------------------------------------------------------- /src/pages/taskTpl/style.less: -------------------------------------------------------------------------------- 1 | .job-tpl-form { 2 | // width: 800px; 3 | // margin: 0 auto; 4 | .ant-form-item-label { 5 | strong { 6 | margin-right: 10px; 7 | } 8 | } 9 | .ant-form-item-label label:after { 10 | content: ''; 11 | } 12 | } 13 | 14 | .job-task-table { 15 | .ant-table-body { 16 | .ant-table-tbody { 17 | td { 18 | padding: 8px 0; 19 | border: none; 20 | } 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/pages/traceCpt/Detail/Header/SpanGraph/GraphTicks.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | type GraphTicksProps = { 4 | numTicks: number; 5 | }; 6 | 7 | export default function GraphTicks(props: GraphTicksProps) { 8 | const { numTicks } = props; 9 | const ticks: React.ReactElement[] = []; 10 | // i starts at 1, limit is `i < numTicks` so the first and last ticks aren't drawn 11 | for (let i = 1; i < numTicks; i++) { 12 | const x = `${(i / numTicks) * 100}%`; 13 | ticks.push(); 14 | } 15 | 16 | return ( 17 | 20 | ); 21 | } 22 | -------------------------------------------------------------------------------- /src/pages/traceCpt/Explorer.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import PageLayout from '@/components/pageLayout'; 3 | import { useTranslation } from 'react-i18next'; 4 | import Trace from './index'; 5 | import Dependencies from './Dependencies'; 6 | import './locale'; 7 | 8 | export { Dependencies }; 9 | 10 | export default function index() { 11 | const { t } = useTranslation('trace'); 12 | 13 | return ( 14 | 15 |
16 |
17 | 18 |
19 |
20 |
21 | ); 22 | } 23 | -------------------------------------------------------------------------------- /src/pages/traceCpt/locale/index.ts: -------------------------------------------------------------------------------- 1 | import i18next from 'i18next'; 2 | import en_US from './en_US'; 3 | import zh_CN from './zh_CN'; 4 | import zh_HK from './zh_HK'; 5 | import ja_JP from "./ja_JP"; 6 | import ru_RU from "./ru_RU"; 7 | 8 | i18next.addResourceBundle('en_US', 'trace', en_US); 9 | i18next.addResourceBundle('zh_CN', 'trace', zh_CN); 10 | i18next.addResourceBundle('zh_HK', 'trace', zh_HK); 11 | i18next.addResourceBundle('ja_JP', 'trace', ja_JP); 12 | i18next.addResourceBundle('ru_RU', 'trace', ru_RU); 13 | -------------------------------------------------------------------------------- /src/pages/traceCpt/locale/zh_CN.ts: -------------------------------------------------------------------------------- 1 | const zh_CN = { 2 | title: '即时查询', 3 | dependencies: '拓扑分析', 4 | mode: { 5 | id: 'Trace ID 查询', 6 | query: '条件查询', 7 | }, 8 | label: '标签', 9 | label_tip: ` 10 | <0> 11 | 值支持 12 | <1>logfmt 13 | 格式 14 | 15 | <2>空格分割 16 | <3>包含空格的字符串需要引号包裹 17 | `, 18 | time: '时间区间', 19 | duration_max: '最大耗时', 20 | duration_min: '最小耗时', 21 | num_traces: '显示结果数', 22 | query: '查询', 23 | traceid_msg: '请输入 Trace ID', 24 | sort: { 25 | MOST_RECENT: '最新优先', 26 | LONGEST_FIRST: '时长优先', 27 | SHORTEST_FIRST: '时短优先', 28 | MOST_SPANS: 'span多优先', 29 | LEAST_SPANS: 'span少优先', 30 | }, 31 | }; 32 | export default zh_CN; 33 | -------------------------------------------------------------------------------- /src/pages/traceCpt/locale/zh_HK.ts: -------------------------------------------------------------------------------- 1 | const zh_HK = { 2 | title: '即時查詢', 3 | dependencies: '拓撲分析', 4 | mode: { 5 | id: 'Trace ID 查詢', 6 | query: '條件查詢', 7 | }, 8 | label: '標籤', 9 | label_tip: ` 10 | <0> 11 | 值支援 12 | <1>logfmt 13 | 格式 14 | 15 | <2>空格分割 16 | <3>包含空格的字串需要引號包裹 17 | `, 18 | time: '時間區間', 19 | duration_max: '最大耗時', 20 | duration_min: '最小耗時', 21 | num_traces: '顯示結果數', 22 | query: '查詢', 23 | traceid_msg: '請輸入 Trace ID', 24 | sort: { 25 | MOST_RECENT: '最新優先', 26 | LONGEST_FIRST: '時長優先', 27 | SHORTEST_FIRST: '時短優先', 28 | MOST_SPANS: 'span 多優先', 29 | LEAST_SPANS: 'span 少優先', 30 | }, 31 | }; 32 | 33 | export default zh_HK; 34 | -------------------------------------------------------------------------------- /src/pages/traceCpt/utils/number.ts: -------------------------------------------------------------------------------- 1 | export function toFloatPrecision(number: number, precision: number): number { 2 | const log10Length = Math.floor(Math.log10(Math.abs(number))) + 1; 3 | const targetPrecision = precision + log10Length; 4 | 5 | if (targetPrecision <= 0) { 6 | return Math.trunc(number); 7 | } 8 | 9 | return Number(number.toPrecision(targetPrecision)); 10 | } 11 | -------------------------------------------------------------------------------- /src/pages/traceCpt/utils/types.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | 3 | import DraggableManager from './DraggableManager'; 4 | import EUpdateTypes from './EUpdateTypes'; 5 | import { TNil } from '../type'; 6 | 7 | export type DraggableBounds = { 8 | clientXLeft: number; 9 | maxValue?: number; 10 | minValue?: number; 11 | width: number; 12 | }; 13 | 14 | export type DraggingUpdate = { 15 | event: React.MouseEvent | MouseEvent; 16 | manager: DraggableManager; 17 | tag: string | TNil; 18 | type: EUpdateTypes; 19 | value: number; 20 | x: number; 21 | }; 22 | -------------------------------------------------------------------------------- /src/pages/user/component/addUser/index.less: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n9e/fe/207e72335b4fa463a810a4e0e73550b92a4966ac/src/pages/user/component/addUser/index.less -------------------------------------------------------------------------------- /src/pages/user/component/delPopover/index.less: -------------------------------------------------------------------------------- 1 | .popover-wrapper { 2 | color: #666; 3 | } 4 | .popover-content { 5 | display: flex; 6 | color: #666; 7 | } 8 | -------------------------------------------------------------------------------- /src/pages/user/locale/index.ts: -------------------------------------------------------------------------------- 1 | import i18next from 'i18next'; 2 | import en_US from './en_US'; 3 | import zh_CN from './zh_CN'; 4 | import zh_HK from './zh_HK'; 5 | import ja_JP from "./ja_JP"; 6 | import ru_RU from "./ru_RU"; 7 | 8 | i18next.addResourceBundle('en_US', 'user', en_US); 9 | i18next.addResourceBundle('zh_CN', 'user', zh_CN); 10 | i18next.addResourceBundle('zh_HK', 'user', zh_HK); 11 | i18next.addResourceBundle('ja_JP', 'user', ja_JP); 12 | i18next.addResourceBundle('ru_RU', 'user', ru_RU); 13 | -------------------------------------------------------------------------------- /src/pages/variableConfigs/locale/en_US.ts: -------------------------------------------------------------------------------- 1 | const en_US = { 2 | title: 'Variable settings', 3 | search_placeholder: 'Search by name or note', 4 | ckey: 'Variable name', 5 | cval: 'Variable value', 6 | isEncrypted: 'Is encrypted', 7 | resetPassword: 'Reset password', 8 | passwordNotSaved: 'Password not saved', 9 | passwordRequired: 'Password is required', 10 | }; 11 | export default en_US; 12 | -------------------------------------------------------------------------------- /src/pages/variableConfigs/locale/index.ts: -------------------------------------------------------------------------------- 1 | import i18next from 'i18next'; 2 | import en_US from './en_US'; 3 | import zh_CN from './zh_CN'; 4 | import zh_HK from './zh_HK'; 5 | import ja_JP from "./ja_JP"; 6 | import ru_RU from "./ru_RU"; 7 | 8 | i18next.addResourceBundle('en_US', 'variableConfigs', en_US); 9 | i18next.addResourceBundle('zh_CN', 'variableConfigs', zh_CN); 10 | i18next.addResourceBundle('zh_HK', 'variableConfigs', zh_HK); 11 | i18next.addResourceBundle('ja_JP', 'variableConfigs', ja_JP); 12 | i18next.addResourceBundle('ru_RU', 'variableConfigs', ru_RU); 13 | -------------------------------------------------------------------------------- /src/pages/variableConfigs/locale/ja_JP.ts: -------------------------------------------------------------------------------- 1 | const ja_JP = { 2 | title: "変数リスト", 3 | search_placeholder: "名前または備考で検索", 4 | ckey: "変数名", 5 | cval: "変数値", 6 | isEncrypted: "暗号化されているか", 7 | resetPassword: "パスワードをリセット", 8 | passwordNotSaved: "パスワードが保存されていません", 9 | passwordRequired: "パスワードは必須です", 10 | }; 11 | 12 | export default ja_JP; 13 | -------------------------------------------------------------------------------- /src/pages/variableConfigs/locale/ru_RU.ts: -------------------------------------------------------------------------------- 1 | const ru_RU = { 2 | title: 'Список переменных', 3 | search_placeholder: 'Поиск по названию или примечанию', 4 | ckey: 'Имя переменной', 5 | cval: 'Значение переменной', 6 | isEncrypted: 'Зашифровать', 7 | resetPassword: 'Сбросить пароль', 8 | passwordNotSaved: 'Пароль не сохранен', 9 | passwordRequired: 'Пароль не может быть пустым', 10 | }; 11 | 12 | export default ru_RU; 13 | -------------------------------------------------------------------------------- /src/pages/variableConfigs/locale/zh_CN.ts: -------------------------------------------------------------------------------- 1 | const zh_CN = { 2 | title: '变量列表', 3 | search_placeholder: '搜索名称或备注', 4 | ckey: '变量名', 5 | cval: '变量值', 6 | isEncrypted: '是否加密', 7 | resetPassword: '重置密码', 8 | passwordNotSaved: '密码未保存', 9 | passwordRequired: '密码不能为空', 10 | }; 11 | export default zh_CN; 12 | -------------------------------------------------------------------------------- /src/pages/variableConfigs/locale/zh_HK.ts: -------------------------------------------------------------------------------- 1 | const zh_HK = { 2 | title: '變量列表', 3 | search_placeholder: '搜索名稱或備註', 4 | ckey: '變量名', 5 | cval: '變量值', 6 | isEncrypted: '是否加密', 7 | resetPassword: '重置密碼', 8 | passwordNotSaved: '密碼未保存', 9 | passwordRequired: '密碼不能為空', 10 | }; 11 | 12 | export default zh_HK; 13 | -------------------------------------------------------------------------------- /src/pages/variableConfigs/types.ts: -------------------------------------------------------------------------------- 1 | export interface VariableConfig { 2 | ckey: string; 3 | cval: string; 4 | note: string; 5 | encrypted: 0 | 1; 6 | } 7 | 8 | export interface RASConfig { 9 | OpenRSA: boolean; 10 | RSAPublicKey: string; 11 | } 12 | -------------------------------------------------------------------------------- /src/pages/warning/shield/locale/index.ts: -------------------------------------------------------------------------------- 1 | import i18next from 'i18next'; 2 | import en_US from './en_US'; 3 | import zh_CN from './zh_CN'; 4 | import zh_HK from './zh_HK'; 5 | import ja_JP from "./ja_JP"; 6 | import ru_RU from "./ru_RU"; 7 | 8 | i18next.addResourceBundle('en_US', 'alertMutes', en_US); 9 | i18next.addResourceBundle('zh_CN', 'alertMutes', zh_CN); 10 | i18next.addResourceBundle('zh_HK', 'alertMutes', zh_HK); 11 | i18next.addResourceBundle('ja_JP', 'alertMutes', ja_JP); 12 | i18next.addResourceBundle('ru_RU', 'alertMutes', ru_RU); 13 | -------------------------------------------------------------------------------- /src/pages/warning/subscribe/locale/index.ts: -------------------------------------------------------------------------------- 1 | import i18next from 'i18next'; 2 | import en_US from './en_US'; 3 | import zh_CN from './zh_CN'; 4 | import zh_HK from './zh_HK'; 5 | import ja_JP from "./ja_JP"; 6 | import ru_RU from "./ru_RU"; 7 | 8 | i18next.addResourceBundle('en_US', 'alertSubscribes', en_US); 9 | i18next.addResourceBundle('zh_CN', 'alertSubscribes', zh_CN); 10 | i18next.addResourceBundle('zh_HK', 'alertSubscribes', zh_HK); 11 | i18next.addResourceBundle('ja_JP', 'alertSubscribes', ja_JP); 12 | i18next.addResourceBundle('ru_RU', 'alertSubscribes', ru_RU); 13 | -------------------------------------------------------------------------------- /src/plugins/TDengine/AlertRule/Queries/style.less: -------------------------------------------------------------------------------- 1 | .alert-rule-sls-preview-table-column { 2 | min-width: 100px; 3 | } -------------------------------------------------------------------------------- /src/plugins/TDengine/Explorer/utils.ts: -------------------------------------------------------------------------------- 1 | import _ from 'lodash'; 2 | 3 | export const getSerieName = (metric: any) => { 4 | const metricName = metric?.__name__ || ''; 5 | const labels = _.keys(metric) 6 | .filter((ml) => ml !== '__name__') 7 | .map((label) => { 8 | return `${label}="${metric[label]}"`; 9 | }); 10 | 11 | return `${metricName}{${_.join(labels, ',')}}`; 12 | }; 13 | -------------------------------------------------------------------------------- /src/plugins/TDengine/components/Meta/style.less: -------------------------------------------------------------------------------- 1 | .tdengine-discover-meta-content { 2 | display: flex; 3 | flex-direction: column; 4 | overflow: hidden; 5 | height: 100%; 6 | .ant-tree .ant-tree-node-content-wrapper { 7 | user-select: unset; 8 | cursor: unset; 9 | } 10 | } 11 | .tdengine-discover-meta-tree { 12 | overflow: auto; 13 | } 14 | .tdengine-discover-meta-modal { 15 | pointer-events: none; 16 | .ant-modal-header { 17 | padding: 0 !important; 18 | } 19 | .ant-modal-close-x { 20 | width: 38px; 21 | height: 38px; 22 | line-height: 38px; 23 | } 24 | .tdengine-discover-meta-modal-title { 25 | width: 100%; 26 | cursor: move; 27 | padding: 8px 12px; 28 | } 29 | } -------------------------------------------------------------------------------- /src/plugins/TDengine/index.tsx: -------------------------------------------------------------------------------- 1 | import AlertRule from './AlertRule'; 2 | import QueryBuilder from './Dashboard/QueryBuilder'; 3 | import datasource from './Dashboard/datasource'; 4 | // import Event from './Event'; 5 | // import EventLogs from './Event/Logs'; 6 | // import EventPreview from './Event/Preview'; 7 | import Explorer from './Explorer'; 8 | import './locale'; 9 | 10 | export { 11 | AlertRule, 12 | QueryBuilder, 13 | datasource, 14 | // Event, EventLogs, EventPreview, 15 | Explorer, 16 | }; 17 | -------------------------------------------------------------------------------- /src/plugins/TDengine/locale/index.ts: -------------------------------------------------------------------------------- 1 | import i18next from 'i18next'; 2 | import en_US from './en_US'; 3 | import zh_CN from './zh_CN'; 4 | import zh_HK from './zh_HK'; 5 | 6 | i18next.addResourceBundle('en_US', 'db_tdengine', en_US); 7 | i18next.addResourceBundle('zh_CN', 'db_tdengine', zh_CN); 8 | i18next.addResourceBundle('zh_HK', 'db_tdengine', zh_HK); 9 | -------------------------------------------------------------------------------- /src/plugins/TDengine/types.ts: -------------------------------------------------------------------------------- 1 | export interface BaseParams { 2 | cate: string; 3 | datasource_id: number; 4 | } 5 | 6 | export type Database = string; 7 | export type Table = string; 8 | export type Column = string[]; 9 | -------------------------------------------------------------------------------- /src/plugins/TDengine/utils.ts: -------------------------------------------------------------------------------- 1 | import _ from 'lodash'; 2 | 3 | export const getSerieName = (metric: any) => { 4 | const metricName = metric?.__name__ || ''; 5 | const labels = _.keys(metric) 6 | .filter((ml) => ml !== '__name__') 7 | .map((label) => { 8 | return `${label}="${metric[label]}"`; 9 | }); 10 | 11 | return `${metricName}{${_.join(labels, ',')}}`; 12 | }; 13 | -------------------------------------------------------------------------------- /src/plugins/clickHouse/Dashboard/VariableQuerybuilder.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Form, Input } from 'antd'; 3 | import { useTranslation } from 'react-i18next'; 4 | import _ from 'lodash'; 5 | 6 | import { NAME_SPACE } from '../constants'; 7 | 8 | export default function VariableQuerybuilder() { 9 | const { t } = useTranslation(NAME_SPACE); 10 | 11 | return ( 12 | 21 | 22 | 23 | ); 24 | } 25 | -------------------------------------------------------------------------------- /src/plugins/clickHouse/Dashboard/style.less: -------------------------------------------------------------------------------- 1 | .n9e-mysql-dashboard-querybuilder-query-item { 2 | .ant-form-item-label { 3 | label { 4 | width: 100%; 5 | } 6 | } 7 | } -------------------------------------------------------------------------------- /src/plugins/clickHouse/Explorer/utils.ts: -------------------------------------------------------------------------------- 1 | import _ from 'lodash'; 2 | 3 | export const getSerieName = (metric: any) => { 4 | const metricName = metric?.__name__ || ''; 5 | const labels = _.keys(metric) 6 | .filter((ml) => ml !== '__name__') 7 | .map((label) => { 8 | return `${label}="${metric[label]}"`; 9 | }); 10 | 11 | return `${metricName}{${_.join(labels, ',')}}`; 12 | }; 13 | -------------------------------------------------------------------------------- /src/plugins/clickHouse/components/HistoricalRecords/style.less: -------------------------------------------------------------------------------- 1 | .n9e-historical-records-popover-content { 2 | width: 400px; 3 | .n9e-historical-records-popover-content-records-content { 4 | margin-top: 16px; 5 | max-height: 300px; 6 | overflow-y: auto; 7 | .n9e-historical-records-popover-content-records-item { 8 | padding: 5px 10px; 9 | cursor: pointer; 10 | &:hover { 11 | background-color: var(--fc-fill-3); 12 | } 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /src/plugins/clickHouse/constants.ts: -------------------------------------------------------------------------------- 1 | export const NAME_SPACE = 'n9e-ck'; 2 | export const CACHE_KEY = 'ck-query-history-records'; 3 | -------------------------------------------------------------------------------- /src/plugins/clickHouse/globalState.ts: -------------------------------------------------------------------------------- 1 | import { createGlobalState } from 'react-hooks-global-state'; 2 | 3 | export const { useGlobalState } = createGlobalState<{ 4 | mySQLTableFields: string[]; 5 | }>({ 6 | mySQLTableFields: [], 7 | }); 8 | -------------------------------------------------------------------------------- /src/plugins/clickHouse/index.tsx: -------------------------------------------------------------------------------- 1 | import AlertRule from './AlertRule'; 2 | import QueryBuilder from './Dashboard/QueryBuilder'; 3 | import datasource from './Dashboard/datasource'; 4 | import Event from './Event'; 5 | import Explorer from './Explorer'; 6 | import VariableQuerybuilder from './Dashboard/VariableQuerybuilder'; 7 | import './locale'; 8 | 9 | export { AlertRule, QueryBuilder, datasource, Event, Explorer, VariableQuerybuilder }; 10 | -------------------------------------------------------------------------------- /src/plugins/clickHouse/locale/index.ts: -------------------------------------------------------------------------------- 1 | import i18next from 'i18next'; 2 | import { NAME_SPACE } from '../constants'; 3 | import en_US from './en_US'; 4 | import zh_CN from './zh_CN'; 5 | import zh_HK from './zh_HK'; 6 | import ja_JP from "./ja_JP"; 7 | 8 | i18next.addResourceBundle('en_US', NAME_SPACE, en_US); 9 | i18next.addResourceBundle('zh_CN', NAME_SPACE, zh_CN); 10 | i18next.addResourceBundle('zh_HK', NAME_SPACE, zh_HK); 11 | i18next.addResourceBundle('ja_JP', NAME_SPACE, ja_JP); 12 | -------------------------------------------------------------------------------- /src/plugins/clickHouse/types.ts: -------------------------------------------------------------------------------- 1 | export interface BaseParams { 2 | cate: string; 3 | datasource_id: number; 4 | } 5 | 6 | export type Database = string; 7 | export type Table = string; 8 | export type Column = string[]; 9 | -------------------------------------------------------------------------------- /src/plugins/clickHouse/utils.ts: -------------------------------------------------------------------------------- 1 | import _ from 'lodash'; 2 | 3 | export const getSerieName = (metric: Object, ref?: string) => { 4 | let name = metric['__name__'] || ''; 5 | _.forEach(_.omit(metric, '__name__'), (value, key) => { 6 | name += ` ${key}: ${value}`; 7 | }); 8 | name = _.trim(name); 9 | if (ref) { 10 | name = `${ref} ${name}`; 11 | } 12 | return name; 13 | }; 14 | -------------------------------------------------------------------------------- /src/plugins/elasticsearch/AlertRule/EnrichQueries/style.less: -------------------------------------------------------------------------------- 1 | .alert-rule-es-preview-table-column { 2 | min-width: 150px; 3 | } -------------------------------------------------------------------------------- /src/plugins/elasticsearch/AlertRule/services.ts: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request'; 2 | import { RequestMethod } from '@/store/common'; 3 | 4 | export function getDsQuery(params, silence = true) { 5 | return request('/api/n9e/ds-query', { 6 | method: RequestMethod.Post, 7 | data: params, 8 | headers: { 9 | 'X-Cluster': 'Default', 10 | }, 11 | silence, 12 | }); 13 | } 14 | 15 | export function getLogsQuery(params) { 16 | return request('/api/n9e/logs-query', { 17 | method: RequestMethod.Post, 18 | data: params, 19 | headers: { 20 | 'X-Cluster': 'Default', 21 | }, 22 | silence: true, 23 | }).then((res) => res.dat); 24 | } 25 | -------------------------------------------------------------------------------- /src/plugins/elasticsearch/components/LogDownload/type.ts: -------------------------------------------------------------------------------- 1 | export interface ITaskItem { 2 | id: number; 3 | cate: string; 4 | datasource_id: number; 5 | query: ITaskQuery; 6 | version: string; 7 | config: ITaskConfig; 8 | server: string; 9 | status: 1; 10 | create_time: number; 11 | create_by: string; 12 | update_time: number; 13 | } 14 | 15 | export interface ITaskQuery { 16 | date_field: string; 17 | index: string; 18 | filter?: string; 19 | range: { 20 | end: string; 21 | start: string; 22 | }; 23 | } 24 | 25 | export interface ITaskConfig { 26 | format: 'json' | 'csv'; 27 | file_name: string; 28 | ascending: false; 29 | count: number; 30 | file_path: string; 31 | } 32 | -------------------------------------------------------------------------------- /src/plugins/elasticsearch/index.tsx: -------------------------------------------------------------------------------- 1 | import AlertRule from './AlertRule'; 2 | import Event from './Event'; 3 | import EventLogs from './Event/Logs'; 4 | import EventPreview from './Event/Preview'; 5 | 6 | export { AlertRule, Event, EventLogs, EventPreview }; 7 | -------------------------------------------------------------------------------- /src/plugins/elasticsearch/utils.ts: -------------------------------------------------------------------------------- 1 | export const normalizeTime = (value?: number, unit?: 'second' | 'min' | 'hour') => { 2 | if (!value) { 3 | return value; 4 | } 5 | if (unit === 'second') { 6 | return value; 7 | } 8 | if (unit === 'min') { 9 | return value * 60; 10 | } 11 | if (unit === 'hour') { 12 | return value * 60 * 60; 13 | } 14 | if (unit === 'day') { 15 | return value * 60 * 60 * 24; 16 | } 17 | return value; 18 | }; 19 | -------------------------------------------------------------------------------- /src/services/index.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2022 Nightingale Team 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | * 16 | */ 17 | export * from './resource'; 18 | -------------------------------------------------------------------------------- /src/store/businessInterface/index.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2022 Nightingale Team 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | * 16 | */ 17 | export * from './resource'; 18 | -------------------------------------------------------------------------------- /src/theme/light.less: -------------------------------------------------------------------------------- 1 | .theme-light { 2 | background-color: var(--fc-fill-1); 3 | } 4 | 5 | .theme-light-gold { 6 | .ant-table-tbody>tr:last-child>td { 7 | border-bottom: 1px solid var(--fc-primary-color); 8 | } 9 | 10 | .n9e-pro-tag { 11 | color: rgb(34, 34, 34); 12 | } 13 | } -------------------------------------------------------------------------------- /src/types/svg.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.svg?component' { 2 | import React from 'react'; 3 | const SVGComponent: React.FC>; 4 | export default SVGComponent; 5 | } 6 | -------------------------------------------------------------------------------- /src/utils/datetime/common.ts: -------------------------------------------------------------------------------- 1 | import { isEmpty } from 'lodash'; 2 | 3 | import { TimeZone, TimeZoneOptions } from './types'; 4 | 5 | export const defaultTimeZone: TimeZone = 'browser'; 6 | 7 | export const getTimeZone = (options?: T): TimeZone => { 8 | if (options?.timeZone && !isEmpty(options.timeZone)) { 9 | return options.timeZone; 10 | } 11 | return defaultTimeZone; 12 | }; 13 | -------------------------------------------------------------------------------- /src/utils/datetime/formats.ts: -------------------------------------------------------------------------------- 1 | export const DEFAULT_SYSTEM_DATE_FORMAT = 'YYYY-MM-DD HH:mm:ss'; 2 | export const DEFAULT_SYSTEM_DATE_MS_FORMAT = 'YYYY-MM-DD HH:mm:ss.SSS'; 3 | -------------------------------------------------------------------------------- /src/utils/getFontFamily.ts: -------------------------------------------------------------------------------- 1 | export default function getFontFamily(isEnt: boolean) { 2 | let fontFamily = '"Microsoft Yahei",Verdana,Helvetica Neue,sans-serif,PingFangSC-Regular,simsun,"sans-serif"'; 3 | if (isEnt) { 4 | fontFamily = 'Helvetica Neue,sans-serif,PingFangSC-Regular,microsoft yahei ui,microsoft yahei,simsun,"sans-serif"'; 5 | } 6 | return fontFamily; 7 | } 8 | -------------------------------------------------------------------------------- /src/utils/rsa.ts: -------------------------------------------------------------------------------- 1 | import JSEncrypt from 'jsencrypt'; 2 | /** 3 | * rsa加密 4 | * @author: talon 5 | * @Date: 2023-07-05 15:06:44 6 | */ 7 | export function RsaEncry(data: any, publicKey: string) { 8 | // 使用 RSA 公钥加密 请求响应解密的key 9 | const myEncrypt = new JSEncrypt(); 10 | myEncrypt.setPublicKey(atob(publicKey)); 11 | const cryptRespKeyStr = myEncrypt.encrypt(data); 12 | return cryptRespKeyStr; 13 | } 14 | -------------------------------------------------------------------------------- /src/utils/useHook.ts: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { createGlobalState } from 'react-use'; 3 | 4 | type IGlobalVarType = { 5 | RangePickerHour?: string; 6 | }; 7 | export const useGlobalVar = createGlobalState({}); 8 | -------------------------------------------------------------------------------- /src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | --------------------------------------------------------------------------------