1. # event center整合說明 (2023/08/02修改)
| 日期 | 更新內容 | 更新者 |
| -------- | -------- | -------- |
| 2024.05.08 | 1. 加入message欄位,如果message欄位有帶的話,會取代掉原先event code上的範本 | cch |
| 2024.05.02 | 1. 加入notifications的欄位,提供可以自訂通知用戶 | cch |
| 2023.12.05 | 1. 更新欄位說明 | cch |
| 2023.08.15 | 1. status修改為appStatus | cch |
## 傳輸方式
使用rabbitMQ傳送,相關設定如下:
| 參數 | 值 | 說明 |
| -------- | ------------ |:--------------------------------------------:|
| exchange | amq.topic | |
| topic | ec."appName" | 如app name為andon,則發送的的topic為ec.andon |
## 欄位格式
```json=
{
"source":<string>,
"tenantID":<string>,
"creator":<string>,
"eventID": <string>,
"subject":<string>,
"description":<string>,
"target":<string>,
"targetID":<string>,
"targetPath":<string>,
"targetPathID":<string>,
"type":<string>,
"appStatus":<string>,
"owners": <string[]>,
"tags": <string[]>,
"createdAt": <int64> (ms),
"level": <string>,
"additionalData": map[string]interface{},
"notifications":<string[]>,
"message": <string[]>
}
```
## 欄位說明
| 名稱 | 型態 | 必填 | 說明 |
|:------------:| -------- |:------------------------:|:----------------------------------------- |
| source | string | 是 | app name |
| tenantID | string | 是 | tenant id |
| creator | string | 是 | 產生事件的用戶,可以是用戶名也可以是email |
| eventID | string | 是 | 該app下唯一識別id |
| eventCode | string | 是 | event categories中定義的event code |
| subject | string | 是 | 事件名稱 |
| description | string | 否 | 事件描述 |
| target | string | 是 | |
| targetID | string | 是 | |
| targetPath | string | 是 | |
| targetPathID | string | 是 | |
| type | string | 是 | event的種類,如:火警 |
| level | string | 是 | event的等級;如:HH,LL |
| appStatus | string | 是 | event的狀況,如:未分配,已處理 |
| owners | string[] | 否 | 處理人員 |
| tags | string[] | 否 | hash tag |
| createdAt | int64 | 是 | epoch timestamp(ms) |
| notifications | string[] | 否 | eventNotice的id |
| message | string[] | 否 | 要通知的訊息,如果有帶時會取代掉原先配在event code上範本。訊息必需要使用base64編碼 |
## 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"`
Description string `json:"description"`
WorkUnit string `json:"target"`
WorkUnitID string `json:"targetID"`
WorkUnitPath string `bson:"targetPath"`
WorkUnitPathID string `json:"targetPathID"`
Type string `json:"type"`
Level string `json:"level"`
Status string `json:"status"`
Owners []string `json:"owners"`
Tags []string `json:"tags"`
CreatedAt int64 `json:"createdAt"`
}
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",
Subject: "test event",
Description: "This is a test event",
WorkUnit: "machine01",
WorkUnitID: "machine01-ID",
WorkUnitPath: "/aaa/bbb",
WorkUnitPathID: "/aaa_id/bbb_id",
Type: "HH",
Status: "Done",
Owners: []string{"owner1", "owner2"},
Tags: []string{"test1", "test2"},
CreatedAt: time.Now().UnixMilli(),
}
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)
}
```