diff --git a/api/index_management/elasticsearch.go b/api/index_management/elasticsearch.go new file mode 100644 index 00000000..ece9809e --- /dev/null +++ b/api/index_management/elasticsearch.go @@ -0,0 +1,87 @@ +package index_management + +import ( + "fmt" + httprouter "infini.sh/framework/core/api/router" + "infini.sh/framework/core/elastic" + "infini.sh/framework/core/orm" + "infini.sh/framework/core/util" + "infini.sh/framework/modules/elastic/common" + "net/http" + log "github.com/cihub/seelog" +) + +func (handler APIHandler) ElasticsearchOverviewAction(w http.ResponseWriter, req *http.Request, ps httprouter.Params) { + var ( + totalNode int + totalStoreSize int + hosts = map[string]struct{}{} + ) + elastic.WalkConfigs(func(key, value interface{})bool{ + if handler.Config.Elasticsearch == key { + return true + } + data, err := handler.getLatestClusterMonitorData(key) + if err != nil{ + log.Error(err) + } + val, err := data.GetValue("cluster_stats.nodes.count.total") + if err != nil { + log.Warn(err) + } + if num, ok := val.(float64); ok { + totalNode += int(num) + } + val, err = data.GetValue("index_stats._all.total.store.size_in_bytes") + if err != nil { + log.Warn(err) + } + if num, ok := val.(float64); ok { + totalStoreSize += int(num) + } + + val, err = data.GetValue("agent.ip") + if err != nil { + log.Warn(err) + } + if ip, ok := val.(string); ok { + hosts[ip] = struct{}{} + } + return true + }) + resBody := util.MapStr{ + "total_node": totalNode, + "total_store_size_in_bytes": totalStoreSize, + "total_host": len(hosts), + //"hosts": hosts, + } + handler.WriteJSON(w, resBody, http.StatusOK) +} + +func (handler APIHandler) getLatestClusterMonitorData(clusterID interface{}) (util.MapStr, error){ + client := elastic.GetClient(handler.Config.Elasticsearch) + queryDSLTpl := `{ + "size": 1, + "query": { + "match": { + "elasticsearch": "%s" + } + }, + "sort": [ + { + "cluster_stats.timestamp": { + "order": "desc" + } + } + ] +}` + queryDSL := fmt.Sprintf(queryDSLTpl, clusterID) + searchRes, err := client.SearchWithRawQueryDSL(orm.GetIndexName(common.MonitoringItem{}), []byte(queryDSL)) + if err != nil { + return nil, err + } + if len(searchRes.Hits.Hits) == 0 { + return nil, nil + } + return searchRes.Hits.Hits[0].Source, nil +} diff --git a/api/init.go b/api/init.go index dfc444b2..8183eeb7 100644 --- a/api/init.go +++ b/api/init.go @@ -17,6 +17,8 @@ func Init(cfg *config.AppConfig) { } var pathPrefix = "/_search-center/" //ui.HandleUIMethod(api.POST, "/api/get_indices",index_management.API1) + ui.HandleUIMethod(api.GET, path.Join(pathPrefix, "elasticsearch/overview"), handler.ElasticsearchOverviewAction) + ui.HandleUIMethod(api.GET, path.Join(pathPrefix, "dict/_search"), handler.GetDictListAction) ui.HandleUIMethod(api.POST, path.Join(pathPrefix, "dict/*id"), handler.CreateDictItemAction) //ui.HandleUIMethod(api.GET, "/api/dict/:id",handler.GetDictItemAction) diff --git a/service/alerting/monitor.go b/service/alerting/monitor.go index 13ec49cc..5da1e0b9 100644 --- a/service/alerting/monitor.go +++ b/service/alerting/monitor.go @@ -679,14 +679,14 @@ func ExecuteMonitor(w http.ResponseWriter, req *http.Request, ps httprouter.Para } monitorCtx, err := createMonitorContext(&trigger, resBody, &sm, IfaceMap{}) if err != nil { - triggerResult["error"] = err + triggerResult["error"] = err.Error() triggerResults[trigger.ID] = triggerResult continue } isTrigger, err := resolveTriggerResult(&trigger, monitorCtx) triggerResult["triggered"] = isTrigger if err != nil { - triggerResult["error"] = err + triggerResult["error"] = err.Error() } if trigger.ID == "" { trigger.ID = util.GetUUID() diff --git a/web/config/router.config.js b/web/config/router.config.js index 41da0947..0a975c31 100644 --- a/web/config/router.config.js +++ b/web/config/router.config.js @@ -214,9 +214,9 @@ export default [ }, ] }, - // - // - // //search + + + //search // { // path: '/search', // name: 'search', diff --git a/web/src/components/kibana/console/components/ConsoleInput.tsx b/web/src/components/kibana/console/components/ConsoleInput.tsx index f1b6f577..663a70bc 100644 --- a/web/src/components/kibana/console/components/ConsoleInput.tsx +++ b/web/src/components/kibana/console/components/ConsoleInput.tsx @@ -65,7 +65,7 @@ const SendRequestButton = (props: any) => { interface ConsoleInputProps { clusterID: string, - initialText: string, + initialText: string | undefined, } const DEFAULT_INPUT_VALUE = `GET _search @@ -198,7 +198,7 @@ const ConsoleInputUI = ({clusterID, initialText}:ConsoleInputProps) => { ); }; -const ConsoleInput = ({clusterID}:ConsoleInputProps)=>{ +const ConsoleInput = ({clusterID}:{clusterID:string})=>{ const { done, error, retry } = useDataInit(); const { currentTextObject } = useEditorReadContext(); return done ? : <> diff --git a/web/src/components/kibana/console/services/settings.ts b/web/src/components/kibana/console/services/settings.ts index 434b82ab..564f0347 100644 --- a/web/src/components/kibana/console/services/settings.ts +++ b/web/src/components/kibana/console/services/settings.ts @@ -35,7 +35,7 @@ export class Settings { constructor(private readonly storage: Storage) {} getFontSize() { - return this.storage.get('font_size', 14); + return this.storage.get('font_size', 12); } setFontSize(size: any) { diff --git a/web/src/lib/format.js b/web/src/lib/format.js new file mode 100644 index 00000000..c4d8257a --- /dev/null +++ b/web/src/lib/format.js @@ -0,0 +1,19 @@ +const unitArr = Array("B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"); + +export const formatter = { + bytes: (value) => { + if (isNaN(value) || null == value || value === ''||value==0) { + return "0B"; + } + var index = 0; + var srcsize = parseFloat(value); + index = Math.floor(Math.log(srcsize) / Math.log(1024)); + var size = srcsize / Math.pow(1024, index); + size = size.toFixed(1); + return { + size, + unit: unitArr[index], + }; + }, +} + diff --git a/web/src/locales/en-US/alert.js b/web/src/locales/en-US/alert.js index 7f4e7bb3..1ccfb728 100644 --- a/web/src/locales/en-US/alert.js +++ b/web/src/locales/en-US/alert.js @@ -145,6 +145,7 @@ export default { 'alert.trigger.edit.action.field.name': 'Action name', 'alert.trigger.edit.action.field.destination': 'Destination', 'alert.trigger.edit.action.field.message': 'Message', + 'alert.trigger.edit.action.field.message.info.paragraph1': 'You have access to a "_ctx" variable in your yaml scripts and action templates.', 'alert.trigger.edit.action.field.message_subject': 'Message subject', 'alert.trigger.edit.action.field.message_preview': 'Message preview', 'alert.trigger.edit.action.send_test_message': 'Send test message', diff --git a/web/src/locales/zh-CN/alert.js b/web/src/locales/zh-CN/alert.js index 135868e0..f0e27965 100644 --- a/web/src/locales/zh-CN/alert.js +++ b/web/src/locales/zh-CN/alert.js @@ -143,7 +143,8 @@ export default { 'alert.trigger.edit.action.button.add_action': '添加通知', 'alert.trigger.edit.action.field.name': '通知名称', 'alert.trigger.edit.action.field.destination': '渠道选择', - 'alert.trigger.edit.action.field.message': '消息配置', + 'alert.trigger.edit.action.field.message': '消息', + 'alert.trigger.edit.action.field.message.info.paragraph1': '您可以在 yaml 脚本中和通知模版中访问 "_ctx" 变量', 'alert.trigger.edit.action.field.message_subject': '消息标题', 'alert.trigger.edit.action.field.message_preview': '消息预览', 'alert.trigger.edit.action.send_test_message': '发送测试消息', diff --git a/web/src/pages/Alerting/components/Flyout/flyouts/message.js b/web/src/pages/Alerting/components/Flyout/flyouts/message.js index ded35adc..520f5ebf 100644 --- a/web/src/pages/Alerting/components/Flyout/flyouts/message.js +++ b/web/src/pages/Alerting/components/Flyout/flyouts/message.js @@ -16,6 +16,7 @@ import React from 'react'; import { EuiLink, EuiText, EuiTitle } from '@elastic/eui'; import { URL } from '../../../utils/constants'; +import {formatMessage} from 'umi/locale'; const message = () => ({ flyoutProps: { @@ -27,14 +28,14 @@ const message = () => ({ header: (

- Message + {formatMessage({id:"alert.trigger.edit.action.field.message"})}

), body: (

- {`You have access to a "_ctx" variable in your yaml scripts and action quicktemplate templates.`} + {formatMessage({id:"alert.trigger.edit.action.field.message.info.paragraph1"})}

{/*

Learn More