---
# System prepended metadata

title: EventCenter 整合說明 (20240715更新)

---

# EventCenter 整合說明 (20240715更新)

|日期|更新內容|更新者|
|-|-|-|
|2023.12.05|1. 更新欄位說明|cch|
|2023.08.15|1. status修改為appStatus|cch|
|2024.04.08|1.修正一些欄位內容|展豪|
|2024.04.15|1.修正一些欄位內容|展豪|
|2024.04.23|1.修正一些欄位內容|展豪|
|2024.05.16|1.修正一些欄位內容|展豪|
|2024.07.08|1.補充一些說明，新增graphql打法|展豪|
|2024.07.15|1.新增欄位 timeZone|展豪|


## RMQ傳輸方式
使用rabbitMQ傳送，相關設定如下:
|參數|值|說明|
|-|-|-|
|exchange|amq.topic||
|queueName|<不限>||
|topic|ec."appName"|如app name為andon，則發送的的topic為ec.andon|

連線位置獲取方法如下：
https://portal-mp-ensaas.edgehub.wise-paas.io/instance-list
1. 登入MP頁面
2. 搜尋到 instanceID 為 "18f3875d-ce7e-5f93-bae9-c1d8898efbb3" 的服務
3. 進去建立 secret 且其 vhost 名稱為：KAqAAkaExVqG

## API傳輸方式
API地址：
PUT https://event-center-core-wiseiot-ensaas.edgehub.wise-paas.io/v1/logs 

傳遞內容與RMQ傳遞內容相同。


## 格式內容
```go!
{
	"source":<string>,
	"tenantID":<string>,
	"creator":<string>,
	"eventID": <string>,
	"eventCode": <string>,
	"subject":<string>,
	"target":<string>,
	"targetID":<string>,
	"targetPath":<string>,
	"targetPathID":<string>,
	"appStatus":<string>,
	"level": <string>,
	"owners": <string[]>,
	"tags": <string[]>,
	"createdAt": <int64>, （ms）
	"timeZone": <string>,
	"additionalData": map[string]interface{},
        "processingEndAt": <int64>, （ms）
        "processingStartAt": <int64> （ms）
}
```

## 欄位說明

|名稱|型態|必填|說明|
|-|-|-|-|
|source|string|是|註冊的時候提供的name，非label，[A-Za-z0-9_.-]
|tenantID|string|是|tenant id
|creator|string|否|產生事件的用戶，可以是用戶名也可以是email
|eventID|string|是|該事件發生的唯一ID
|eventCode|string|是|event categories中定義的event code
|subject|string|否|事件名稱
|target|string|是|
|targetID|string|是|
|targetPath|string|是|
|targetPathID|string|是|
|level|string|是|event的等級；如：HH，LL
|appStatus|string|是|event的狀況，如：未分配，已處理
|owners|string[]|否|處理人員
|tags|string[]|否|hash tag
|createdAt|int64|是|epoch timestamp(ms), 未填時以接收時間為準
|timeZone|string|否|時區|
|additionalData|map[string]interface{}|否|想要多塞的資料，只允許string,int,bool，不可以傳入array或是map
|processingEndAt|int64|是|epoch timestamp(ms), 計算異常時間結束
|processingStartAt|int64|是|epoch timestamp(ms), 計算異常時間開始

## Example

```go=
package main

import (
	"context"
	"encoding/json"
	"log"
	"time"

	amqp "github.com/rabbitmq/amqp091-go"
)

type Log struct {
	Source            string                 `json:"source"`
	TenantID          string                 `json:"tenantID"`
	Creator           string                 `json:"creator"`
	EventID           string                 `json:"eventID"`
	Subject           string                 `json:"subject"`
	Target            string                 `json:"target"`
	TargetID          string                 `json:"targetID"`
	TargetPath        string                 `bson:"targetPath"`
	TargetPathID      string                 `json:"targetPathID"`
	AppStatus         string                 `json:"appStatus"`
	Level             string                 `json:"level"`
	Owners            []string               `json:"owners"`
	Tags              []string               `json:"tags"`
	CreatedAt         int64                  `json:"createdAt"`
        TimeZone          string                 `json:"timeZone"`
	ProcessingEndAt   int64                  `json:"processingEndAt"`    
	ProcessingEndAt   int64                  `json:"processingEndAt"`    
	AdditionalData    map[string]interface{} `json:"additionalData"`
}

func failOnError(err error, msg string) {
	if err != nil {
		log.Panicf("%s: %s", msg, err)
	}
}

func main() {
	amqpUri := "amqp://admin:admin@172.16.8.9:5672/ec"
	exchange := "amq.topic"
	appName := "exampleApp"
	topic := "ec." + appName
	testData := Log{
		Source:            appName,
		TenantID:          "test_tenant",
		Creator:           "test_user",
		EventID:           "test_uni_id",
		EventCode:         "FP0001"
		Subject:           "test event",
		Target:            "machine01",
		TargetID:          "machine01-ID",
		TargetPath:        "/aaa/bbb",
		TargetPathID:      "/aaa_id/bbb_id",
		AppStatus:         "Done",
		Owners:            []string{"owner1", "owner2"},
		Tags:              []string{"test1", "test2"},
		CreatedAt:         time.Now().UnixMilli(),
                TimeZone:         "Asia/Taipei",
                ProcessingEndAt:   0,
                ProcessingEndAt:   0,
	}

	conn, err := amqp.Dial(amqpUri)
	failOnError(err, "Failed to connect to RabbitMQ")
	defer conn.Close()

	ch, err := conn.Channel()
	failOnError(err, "Failed to open a channel")
	defer ch.Close()

	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancel()
	body, _ := json.Marshal(testData)

	err = ch.PublishWithContext(ctx,
		exchange, // exchange
		topic,    // routing key
		false,    // mandatory
		false,    // immediate
		amqp.Publishing{
			ContentType: "application/json",
			Body:        []byte(body),
		})
	failOnError(err, "Failed to publish a message")
	log.Printf(" [x] Sent %s\n", body)
}
```

## GRAPHQL傳輸方式
API地址：
POST https://event-center-core-wiseiot-ensaas.edgehub.wise-paas.io/insight/

## 格式內容
```graphql
mutation{
  ecLogsUpdate(input: {
    source:"<string>"
    tenantID:"<string>"
    target:"<string>"
    targetID:"<string>"
    targetPath:"<string>"
    targetPathID:"<string>"
    eventID:"<string>"
    eventCode:"<string>"
    subject:"<string>"
    appStatus:"<string>"
    creator:"<string>"
    level:"<string>"
    owners:["<string>","<string>"]
    tags:["<string>","<string>"]
    additionalData:{
      key: "string"
      value:"test"
    }
    createdAt:"<int64String>"
    timeZonw:"<string>"
    processingStartAt:"<int64String>"
  }){
    source
    tenantID
    target
    targetID
    targetPath
    targetPathID
    eventID
    eventCode
    subject
    appStatus
    creator
    level
    owners
    tags
    additionalData{
      key
      value
    }
    processingStartAt
    processingEndAt
    createdAt
    timeZone
  }
}
```
# 查詢歷史資料
## 查詢API 

API地址：
GET https://event-center-core-wiseiot-ensaas.edgehub.wise-paas.io/v1/logs/summary


## 可以攜帶的參數和說明
|名稱|型態|必填|說明|
|-|-|-|-|
|source|string|否|app name|
|target|string|否|設備的名稱|
|appStatus|string|否|APP設定的狀態|
|eventCenterStatus|string|否|EventCenter 對映到的狀態(OPEN、IN PROGRESS、CLOSED)|
|eventID|string|否|該事件發生的唯一ID|
|eventCategories|string|否|EventCode所在的路徑|
|targetPath|string|否|該設備的路徑訊息|
|level|string|否|event的等級；如：HH，LL|
|subject|string|否|該事件設定的主要名稱|
|startTime|int64|否|epoch timestamp(ms), 查詢比startTime還大的數據|
|endTime|int64|否|epoch timestamp(ms), 查詢比endTime還小的數據|
|search|string|否|key:value格式，用來查詢關鍵數據|
|orderBy|string|否|key:value格式，欄位：排序方式，範例：createdAt:desc|
|page|int|否|第幾，預設為1|
|limit|int|否|單一一頁的數量，預設50|

### 返回結果格式
```
{
  "pagination": {
    "page": 1,
    "limit": 50,
    "total": 0
  },
  "data": []
}
```
### 返回結果格式範例
```
{
  "pagination": {
    "page": 1,
    "limit": 50,
    "total": 2
  },
  "data": [
    {
      "eventID": "achilles08",
      "eventCode": "FP11",
      "eventCategories": "",
      "source": "achillesApp",
      "creator": "Achilles",
      "subject": "測試案例",
      "target": "烟感-10-001",
      "targetID": "d578fe3c778a4eb58586c005a6f81a5d",
      "targetPath": "SL01/2F/消防/二楼东侧廊道/C区货物走廊/烟感/烟感-10-001",
      "targetPathID": "a739eb5235fd476e9085ed97c9924d2b/aed88da29e3d46c6a365ef0125e55c76/985dd2d12cbc4c24b734747d04da9891/67f4dcb40a4d4166830278a9fafa09f3/2b87a50ed57c41af8bf2d94f40ed2452/726e8f8aae844224b7c60b4f0337ff0f/d578fe3c778a4eb58586c005a6f81a5d",
      "owners": "Achilles,Achilles2,Achilles3",
      "tags": "TEST,TEST2,TEST3",
      "updatedHistory": [
        {
          "source": "achillesApp",
          "creator": "Achilles",
          "owners": [
            "Achilles",
            "Achilles2",
            "Achilles3"
          ],
          "eventCode": "FP11",
          "appStatus": "triggered",
          "eventCenterStatus": "In progress",
          "additionalData": {},
          "level": "HH",
          "createdAt": 1720407177000,
          "subject": "測試案例"
        }
      ],
      "appStatus": "triggered",
      "eventCenterStatus": "In progress",
      "level": "HH",
      "additionalData": {},
      "processingStartAt": 1720407177000,
      "processingEndAt": 0,
      "processingTime": "24m26s",
      "abnormalDuration": "24m26s",
      "createdAt": 1720407177000,
      "updatedAt": 1720407177000
      "timeZone": "Asia/Taipei",
    },
    {
      "eventID": "achilles06",
      "eventCode": "FP11",
      "eventCategories": "",
      "source": "achillesApp",
      "creator": "Achilles",
      "subject": "測試案例",
      "target": "烟感-10-001",
      "targetID": "d578fe3c778a4eb58586c005a6f81a5d",
      "targetPath": "SL01/2F/消防/二楼东侧廊道/C区货物走廊/烟感/烟感-10-001",
      "targetPathID": "a739eb5235fd476e9085ed97c9924d2b/aed88da29e3d46c6a365ef0125e55c76/985dd2d12cbc4c24b734747d04da9891/67f4dcb40a4d4166830278a9fafa09f3/2b87a50ed57c41af8bf2d94f40ed2452/726e8f8aae844224b7c60b4f0337ff0f/d578fe3c778a4eb58586c005a6f81a5d",
      "owners": "Achilles",
      "tags": "TEST",
      "updatedHistory": [
        {
          "source": "achillesApp",
          "creator": "Achilles",
          "owners": [
            "Achilles"
          ],
          "eventCode": "FP11",
          "appStatus": "triggered",
          "eventCenterStatus": "In progress",
          "additionalData": {},
          "level": "HH",
          "createdAt": 1720175664000,
          "subject": "測試案例"
        }
      ],
      "appStatus": "triggered",
      "eventCenterStatus": "In progress",
      "level": "HH",
      "additionalData": {},
      "processingStartAt": 1720175664000,
      "processingEndAt": 0,
      "processingTime": "64h42m59s",
      "abnormalDuration": "64h42m59s",
      "createdAt": 1720175664000,
      "updatedAt": 1720175664000
      "timeZone": "Asia/Taipei",
    }
  ]
}
```


## 查詢 GRAPHQL API

### 範例
```
query{
  ecLogsSummary(input:
    {
      tenantID:"VGVuYW50.Y8S6RMlyJDcn_Bez"
      sources:["testApp"]
  }) {
    data {
      source
      subject
      appStatus
      eventCenterStatus
      owners
      creator
      eventID
      level
      target
      targetPath
      processingStartAt
      createdAt
      processingEndAt
      updatedAt
      timeZone
      processingTime
      abnormalDuration
      updatedHistory {
        appStatus
        createdAt
        creator
        eventCenterStatus
        level
      }
      additionalData{
        key
        value
       }
    }
    pagination {
      total
      limit
      page
    }
  }
}
```

# 額外項目
### Assignee API
#### API 內容規劃
|名稱|型態|必填|說明|
|-|-|-|-|
|userName|string|否|用戶名稱|
|confirmed|bool|否|預設false，如果填選了rootCause是要為true?|
|closeEvent|bool|否|預設false，選true需要幫用戶把狀態轉為closed|
|rootCauseTypeID|string|否|rootCauseType的ID|
|rootCauseTypeName|string|否|rootCauseType的內容物|
|rootCauseID|string|否|rootCause的ID|
|rootCauseName|string|否|rootCause的內容物|
|rootCauseDescription|string|否|用戶補充說明 rootCause 情境|
|suggestion|string|否|用戶的額外建議，會與未來AI模組整合?|