Compare commits
2 Commits
39ed9280e1
...
902ab96b2d
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
902ab96b2d | ||
|
|
60017a8d3a |
@@ -27,6 +27,7 @@ type Config struct {
|
|||||||
LocalTokenizer string
|
LocalTokenizer string
|
||||||
AssetPattern string
|
AssetPattern string
|
||||||
DatacenterPattern string
|
DatacenterPattern string
|
||||||
|
EventNamePattern string
|
||||||
storage Storage
|
storage Storage
|
||||||
queue Queue
|
queue Queue
|
||||||
driver Driver
|
driver Driver
|
||||||
@@ -43,6 +44,7 @@ func newConfigFromEnv(ctx context.Context, getEnv func(string) string) (Config,
|
|||||||
OllamaModel: "gemma:2b",
|
OllamaModel: "gemma:2b",
|
||||||
AssetPattern: `(dpg|svc|red)-[a-z0-9-]*`,
|
AssetPattern: `(dpg|svc|red)-[a-z0-9-]*`,
|
||||||
DatacenterPattern: `[a-z]{4}[a-z]*-[0-9]`,
|
DatacenterPattern: `[a-z]{4}[a-z]*-[0-9]`,
|
||||||
|
EventNamePattern: `(^\[[^\]]*\] *)`,
|
||||||
}
|
}
|
||||||
|
|
||||||
var m map[string]any
|
var m map[string]any
|
||||||
|
|||||||
@@ -107,9 +107,10 @@ type (
|
|||||||
slackAction struct{}
|
slackAction struct{}
|
||||||
)
|
)
|
||||||
|
|
||||||
func ParseSlack(b []byte, assetPattern, datacenterPattern string) (Message, error) {
|
func ParseSlack(b []byte, assetPattern, datacenterPattern, eventNamePattern string) (Message, error) {
|
||||||
asset := regexp.MustCompile(assetPattern)
|
asset := regexp.MustCompile(assetPattern)
|
||||||
datacenter := regexp.MustCompile(datacenterPattern)
|
datacenter := regexp.MustCompile(datacenterPattern)
|
||||||
|
eventName := regexp.MustCompile(eventNamePattern)
|
||||||
|
|
||||||
s, err := parseSlack(b)
|
s, err := parseSlack(b)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -134,7 +135,7 @@ func ParseSlack(b []byte, assetPattern, datacenterPattern string) (Message, erro
|
|||||||
Source: fmt.Sprintf(`https://renderinc.slack.com/archives/%s/p%s`, s.Event.Channel, strings.ReplaceAll(s.Event.ID, ".", "")),
|
Source: fmt.Sprintf(`https://renderinc.slack.com/archives/%s/p%s`, s.Event.Channel, strings.ReplaceAll(s.Event.ID, ".", "")),
|
||||||
Channel: s.Event.Channel,
|
Channel: s.Event.Channel,
|
||||||
Thread: s.Event.ID,
|
Thread: s.Event.ID,
|
||||||
EventName: strings.Split(s.Event.Attachments[0].Title, ": Firing: ")[1],
|
EventName: eventNamePattern.FindString(strings.Split(s.Event.Attachments[0].Title, ": Firing: ")[1]),
|
||||||
Event: strings.TrimPrefix(strings.Split(s.Event.Attachments[0].Title, ":")[0], "#"),
|
Event: strings.TrimPrefix(strings.Split(s.Event.Attachments[0].Title, ":")[0], "#"),
|
||||||
Plaintext: s.Event.Attachments[0].Text,
|
Plaintext: s.Event.Attachments[0].Text,
|
||||||
Asset: asset.FindString(s.Event.Attachments[0].Text),
|
Asset: asset.FindString(s.Event.Attachments[0].Text),
|
||||||
|
|||||||
38
report.tmpl
38
report.tmpl
@@ -20,19 +20,20 @@
|
|||||||
allMessages.map((message) => {
|
allMessages.map((message) => {
|
||||||
Object.keys(fieldsToOptions).map((field) => {fieldsToOptions[field][message[field]] = true});
|
Object.keys(fieldsToOptions).map((field) => {fieldsToOptions[field][message[field]] = true});
|
||||||
});
|
});
|
||||||
Object.keys(fieldsToOptions).map((field) => {fieldsToOptions[field] = Object.keys(fieldsToOptions[field])});
|
Object.keys(fieldsToOptions).map((field) => {fieldsToOptions[field] = Object.keys(fieldsToOptions[field]); fieldsToOptions[field].sort();});
|
||||||
|
|
||||||
document.getElementById("form").innerHTML = Object.keys(fieldsToOptions).map((field) => {
|
document.getElementById("form").innerHTML = Object.keys(fieldsToOptions).map((field) => {
|
||||||
}).join("");
|
return `
|
||||||
|
<label for="${field}">${field}</label>
|
||||||
console.log(fieldsToOptions);
|
<select name="${field}" multiple ${fieldsToOptions[field].length > 10 ? "size=10" : `size=${fieldsToOptions[field].length}`}>
|
||||||
`
|
${fieldsToOptions[field].map((option) => `
|
||||||
<select name="filter1" multiple>
|
<option selected>${option}</option>
|
||||||
<option selected>a</option>
|
`)}
|
||||||
<option selected>b</option>
|
</select>
|
||||||
</select>
|
`
|
||||||
`
|
}).join("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
function drawAll() {
|
function drawAll() {
|
||||||
const messages = filterMessages(allMessages)
|
const messages = filterMessages(allMessages)
|
||||||
drawEventVolumeByName(messages)
|
drawEventVolumeByName(messages)
|
||||||
@@ -40,11 +41,20 @@
|
|||||||
drawEventVolumeByHour(messages)
|
drawEventVolumeByHour(messages)
|
||||||
drawEventVolumeByAsset(messages)
|
drawEventVolumeByAsset(messages)
|
||||||
}
|
}
|
||||||
|
|
||||||
function filterMessages(messages) {
|
function filterMessages(messages) {
|
||||||
|
const filters = document.getElementById("form");
|
||||||
|
console.log(filters);
|
||||||
|
return messages.map(() => {
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function drawEventVolumeByName() {}
|
function drawEventVolumeByName() {}
|
||||||
|
|
||||||
function drawEventVolumeByWeekday() {}
|
function drawEventVolumeByWeekday() {}
|
||||||
|
|
||||||
function drawEventVolumeByHour() {}
|
function drawEventVolumeByHour() {}
|
||||||
|
|
||||||
function drawEventVolumeByAsset() {}
|
function drawEventVolumeByAsset() {}
|
||||||
</script>
|
</script>
|
||||||
<style>
|
<style>
|
||||||
@@ -61,10 +71,14 @@
|
|||||||
rows, columns { border: 1px solid red; }
|
rows, columns { border: 1px solid red; }
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body onload="fillForm()">
|
<body onload="fillForm(); drawAll();">
|
||||||
<h1>Report</h1>
|
<h1>Report</h1>
|
||||||
<columns>
|
<columns>
|
||||||
<form id="form" style="width: 10em; flex-shrink: 0;" onchange="drawAll()">
|
<form style="width: 16em; flex-shrink: 0;" onsubmit="drawAll(); return false;">
|
||||||
|
<columns>
|
||||||
|
<button type="submit">Apply</button>
|
||||||
|
</columns>
|
||||||
|
<rows id="form"></rows>
|
||||||
</form>
|
</form>
|
||||||
<rows>
|
<rows>
|
||||||
<rows>
|
<rows>
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ func TestReport(t *testing.T) {
|
|||||||
w := bytes.NewBuffer(nil)
|
w := bytes.NewBuffer(nil)
|
||||||
|
|
||||||
db := NewRAM()
|
db := NewRAM()
|
||||||
FillWithTestdata(ctx, db, renderAssetPattern, renderDatacenterPattern)
|
FillWithTestdata(ctx, db, renderAssetPattern, renderDatacenterPattern, renderEventNamePattern)
|
||||||
s := NewStorage(db)
|
s := NewStorage(db)
|
||||||
|
|
||||||
if err := ReportSince(ctx, w, s, time.Now().Add(-1*time.Hour*24*365*20)); err != nil {
|
if err := ReportSince(ctx, w, s, time.Now().Add(-1*time.Hour*24*365*20)); err != nil {
|
||||||
|
|||||||
Reference in New Issue
Block a user