Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
4976398
Add OpenSpec proposal for personal rate notifications
niemyjski May 31, 2026
f821e7f
fix: address five spec review findings in personal rate notifications
niemyjski May 31, 2026
c8773f8
feat: add RateNotificationRule model, repository, and ES index
niemyjski May 31, 2026
f2bc457
feat: add RateCounterService and pipeline action for event rate tracking
niemyjski May 31, 2026
fc1636f
feat: add RateNotificationEvaluatorJob and RateNotificationsJob
niemyjski May 31, 2026
bd51eed
feat: add SendRateNotificationAsync to IMailer and rate-notification …
niemyjski May 31, 2026
9692a4b
feat: add RateNotificationRule API controller and DTOs
niemyjski May 31, 2026
1de73ed
feat: register rate notification services, jobs, and queues in DI
niemyjski May 31, 2026
09c4b3f
test: add rate notification tests including snooze back-alert regression
niemyjski May 31, 2026
43254b0
chore: update .gitignore
niemyjski May 31, 2026
2d93a42
feat: add rate-notifications Svelte 5 frontend feature module
niemyjski May 31, 2026
143cfea
fix: use ImmediateConsistency on AddAsync to prevent rule-count bypas…
niemyjski May 31, 2026
0cbe829
fix: string-enum serialization + mutation-init + UI integration for r…
niemyjski May 31, 2026
568f8fc
style: address bot feedback - combine nested ifs and use Where() in p…
niemyjski May 31, 2026
eaaf2c2
Merge remote-tracking branch 'origin/main' into feature/rate-notifica…
niemyjski Jul 10, 2026
794ad11
fix: harden rate notification runtime
niemyjski Jul 10, 2026
6a7f9c3
fix: harden rate notification UI
niemyjski Jul 10, 2026
1ef9c39
fix: finish rate notification production hardening
niemyjski Jul 10, 2026
0ba6727
fix: complete rate notification production hardening
niemyjski Jul 10, 2026
8abe14b
Merge branch 'feature/rate-notifications-production-hardening' into f…
niemyjski Jul 10, 2026
fda2466
Merge remote-tracking branch 'origin/main' into niemyjski/add-persona…
niemyjski Jul 12, 2026
71639f9
chore: keep rate notification diff focused
niemyjski Jul 12, 2026
ebb1e07
fix: use email verification API contract
niemyjski Jul 12, 2026
9c7f17c
test: serialize shared integration data lifetimes
niemyjski Jul 12, 2026
241a266
fix: harden personal rate notification delivery
niemyjski Jul 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
139 changes: 139 additions & 0 deletions k8s/exceptionless/templates/jobs.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,145 @@ spec:
fieldPath: metadata.uid
{{- include "exceptionless.otel-env" . | indent 12 }}

---
apiVersion: batch/v1
kind: CronJob
metadata:
name: {{ template "exceptionless.fullname" . }}-jobs-rate-notification-evaluator
labels:
app: {{ template "exceptionless.name" . }}
component: {{ template "exceptionless.fullname" . }}-jobs-rate-notification-evaluator
tier: {{ template "exceptionless.fullname" . }}-job
chart: {{ template "exceptionless.chart" . }}
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
spec:
schedule: "* * * * *"
concurrencyPolicy: Forbid
jobTemplate:
spec:
template:
spec:
containers:
- name: {{ template "exceptionless.name" . }}-jobs-rate-notification-evaluator
image: "{{ .Values.jobs.image.repository }}:{{ .Values.version }}"
imagePullPolicy: {{ .Values.jobs.image.pullPolicy }}
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 10
periodSeconds: 10
resources:
requests:
memory: 100Mi
cpu: 50m
limits:
memory: 300Mi
cpu: 500m
args: [RateNotificationEvaluator]
envFrom:
- configMapRef:
name: {{ template "exceptionless.fullname" . }}-config
env:
- name: HOST_IP
valueFrom:
fieldRef:
fieldPath: status.hostIP
- name: K8S_POD_IP
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: status.podIP
- name: K8S_POD_UID
valueFrom:
fieldRef:
fieldPath: metadata.uid
{{- include "exceptionless.otel-env" . | indent 16 }}
restartPolicy: OnFailure

---
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ template "exceptionless.fullname" . }}-jobs-rate-notifications
labels:
app: {{ template "exceptionless.name" . }}
component: {{ template "exceptionless.fullname" . }}-jobs-rate-notifications
tier: {{ template "exceptionless.fullname" . }}-job
chart: {{ template "exceptionless.chart" . }}
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
spec:
{{- if not (kindIs "invalid" ( .Values.jobs.rateNotifications | default dict ).replicaCount) }}
replicas: {{ .Values.jobs.rateNotifications.replicaCount }}
{{- end }}
selector:
matchLabels:
component: {{ template "exceptionless.fullname" . }}-jobs-rate-notifications
template:
metadata:
labels:
app: {{ template "exceptionless.name" . }}
component: {{ template "exceptionless.fullname" . }}-jobs-rate-notifications
tier: {{ template "exceptionless.fullname" . }}-job
chart: {{ template "exceptionless.chart" . }}
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
annotations:
checksum/config: {{ include (print $.Template.BasePath "/config.yaml") . | sha256sum }}
spec:
topologySpreadConstraints:
- maxSkew: 1
topologyKey: kubernetes.io/hostname
whenUnsatisfiable: ScheduleAnyway
labelSelector:
matchLabels:
component: {{ template "exceptionless.fullname" . }}-jobs-rate-notifications
containers:
- name: {{ template "exceptionless.name" . }}-jobs-rate-notifications
image: "{{ .Values.jobs.image.repository }}:{{ .Values.version }}"
imagePullPolicy: {{ .Values.jobs.image.pullPolicy }}
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 10
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 3
periodSeconds: 3
timeoutSeconds: 5
resources:
requests:
memory: 100Mi
cpu: 100m
limits:
memory: 300Mi
cpu: 500m
args: [RateNotifications]
envFrom:
- configMapRef:
name: {{ template "exceptionless.fullname" . }}-config
env:
- name: HOST_IP
valueFrom:
fieldRef:
fieldPath: status.hostIP
- name: K8S_POD_IP
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: status.podIP
- name: K8S_POD_UID
valueFrom:
fieldRef:
fieldPath: metadata.uid
{{- include "exceptionless.otel-env" . | indent 12 }}

---
apiVersion: apps/v1
kind: Deployment
Expand Down
1 change: 1 addition & 0 deletions k8s/exceptionless/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ jobs:
image:
repository: exceptionless/job
pullPolicy: IfNotPresent
rateNotifications: {}

config: {}
# key: value
Expand Down
Loading
Loading