Мониторинг связи с НРД: участки Шлюз/НРД/M2M/Отправка, сквозная проверка справочником раз в 10 мин, история за сутки на «Статусе», цепочка в шапке (30 с), автоповтор недоставленных до 24 ч, баннер и статус «ожидает отправки» в кабинете клиента
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
This commit is contained in:
@@ -85,6 +85,8 @@ var nsdWatch struct {
|
||||
Contour string
|
||||
Alerted bool
|
||||
LastRemind time.Time
|
||||
LastPollAt time.Time // последний опрос НРД шлюзом (по журналу)
|
||||
LastPollOK time.Time // последний успешный
|
||||
}
|
||||
|
||||
// nsdLinkStatus — для страницы статуса: не отвечает ли НРД шлюзу.
|
||||
@@ -109,6 +111,19 @@ func nsdLinkTick(rc *RuntimeConfig, now time.Time) {
|
||||
}
|
||||
w := &nsdWatch
|
||||
w.Lock()
|
||||
w.LastPollAt = last.At
|
||||
if last.OK {
|
||||
w.LastPollOK = last.At
|
||||
} else if firstFail != nil && w.LastPollOK.IsZero() {
|
||||
// в хвосте журнала нет успешного опроса после сбоя — ищем последний успешный до него
|
||||
for _, ln := range strings.Split(string(tail), "\n") {
|
||||
if m := nsdPollRe.FindStringSubmatch(strings.TrimRight(ln, "\r")); m != nil && m[3] == "OK" {
|
||||
if at, err := time.ParseInLocation("2006-01-02 15:04:05", m[1], time.Local); err == nil {
|
||||
w.LastPollOK = at
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if last.OK {
|
||||
since, alerted := w.DownSince, w.Alerted
|
||||
w.DownSince, w.LastErr, w.Alerted = time.Time{}, "", false
|
||||
|
||||
Reference in New Issue
Block a user