Monitoring API
Το Monitoring API αντικατοπτρίζει την επιφάνεια Ρυθμίσεις → Logs & Monitoring του dashboard. Χρησιμοποιήστε το για να δημιουργείτε ειδοποιήσεις από το CI, να ελέγχετε ενεργοποιήσεις από script ή να διοχετεύετε το ιστορικό σε ένα SIEM.
Όλα τα endpoints απαιτούν JWT (συνεδρία dashboard) και το δικαίωμα settings:read ή settings:write, ανάλογα με την ενέργεια. Δεν καλούνται με κανονικό κλειδί API χώρου εργασίας - η διαχείριση ειδοποιήσεων είναι λειτουργία επιπέδου dashboard.
Όλα τα endpoints αυτής της σελίδας είναι σχετικά ως προς το βασικό URL: https://api-eu1.joryio.com/api - δείτε Επισκόπηση API.
Αντικείμενο ειδοποίησης
Η κανονική μορφή ειδοποίησης που επιστρέφεται από κάθε endpoint CRUD:
{
"id": "ak_01HXYZ...",
"organizationId": "org_...",
"workspaceId": "ws_...",
"name": "Server rejecting payloads",
"description": "Joryio returned 5xx on ingestion.",
"enabled": true,
"direction": "inbound",
"metric": "calls",
"codes": ["5xx"],
"mode": "absolute",
"op": ">",
"threshold": "100",
"duration": "5m",
"changeDir": null,
"changeKind": null,
"vsWindow": null,
"vsComparison": "previous",
"scopeApiKeyPrefix": null,
"scopeEndpoint": null,
"scopeWebhookUrl": null,
"scopeEventName": null,
"notifyChannel": "email",
"recipientMembers": [
],
"externalRecipients": [
{
"recipientId": "rcp_...",
"status": "confirmed",
"confirmationSentAt": "2026-05-29T05:00:00.000Z"
}
],
"recipientsNeedConfirmation": false,
"webhookUrl": null,
"webhookSecret": null,
"cooldown": "10m",
"status": "healthy",
"lastTriggeredAt": null,
"snoozedUntil": null,
"createdBy": "usr_...",
"createdAt": "2026-05-29T05:00:00.000Z",
"updatedAt": "2026-05-29T05:00:00.000Z"
}
Αναφορά πεδίων
| Πεδίο | Τύπος | Σημειώσεις |
|---|---|---|
name | string (1–255) | Απαιτείται. Εμφανίζεται στο dashboard και στα email ενεργοποίησης. |
description | string (≤2000) | Προαιρετικό. Εμφανίζεται στο σώμα του email. |
enabled | boolean | Προεπιλογή true. Όταν είναι false, η κατάσταση γίνεται paused και ο αξιολογητής παραλείπει την ειδοποίηση. |
direction | inbound | webhook | events | deliverability | Ποια ροή παρακολουθείται. Το events μετρά καταγεγραμμένα συμβάντα πελατών από τον πίνακα events. Το deliverability παρακολουθεί ποσοστά υγείας μηνυμάτων (% των απεσταλμένων). |
metric | calls | total_calls | rps | event_count | total_events | unique_users | bounceRate | hardBounceRate | softBounceRate | complaintRate | unsubscribeRate | deliveryRate | Τι μετριέται. Οι τρεις πρώτες αφορούν τα inbound/webhook· οι επόμενες τρεις τα events· οι έξι μετρικές *Rate το deliverability. |
codes | string[] | Κωδικοί κατάστασης HTTP ή ομάδες (2xx, 4xx, 5xx). Έχει νόημα μόνο όταν metric: calls. |
mode | absolute | change | Μοντέλο ορίου. Το deliverability είναι πάντα absolute. |
op | > | < | Μόνο σε absolute mode. Κατεύθυνση του ορίου. |
threshold | string (αριθμητικό) | Απαιτείται. Αποθηκεύεται ως αριθμητική συμβολοσειρά. Για deliverability, ποσοστό (π.χ. "5" = 5%). |
duration | 1m | 5m | 10m | 30m | 1h | Μόνο σε absolute mode. Παράθυρο συνεχούς υπέρβασης. Για deliverability, το παράθυρο αναδρομής του ποσοστού - χρησιμοποιήστε 1h | 4h | 1d | 7d. |
changeDir | increased | decreased | Μόνο σε change mode. Κατεύθυνση της μεταβολής. |
changeKind | percent | value | Μόνο σε change mode. Ερμηνεία του threshold ως ποσοστό ή ως απόλυτο πλήθος. |
vsWindow | 15m | 1h | 4h | 1d | 7d | Μόνο σε change mode. Μέγεθος του παραθύρου σύγκρισης. |
vsComparison | previous | last_week | average | same_weekday_median | Μόνο σε change mode. Βάση σύγκρισης: previous = το αμέσως προηγούμενο παράθυρο (προεπιλογή, και το λιγότερο ανεκτικό: μια ήσυχη Κυριακή διαβάζεται ως πτώση έναντι Σαββάτου)· last_week = το ίδιο παράθυρο πριν 7 μέρες, λαμβάνει υπόψη την εποχικότητα αλλά είναι μία μέρα, οπότε μια ασυνήθιστη δηλητηριάζει τη σύγκριση· average = ο ΜΕΣΟΣ ΟΡΟΣ του ίδιου παραθύρου τις τελευταίες avgDays μέρες (2-30, προεπιλογή 7), εξομαλύνει τον θόρυβο αλλά μία εξαιρετική μέρα ανεβάζει τη βάση για όλο το διάστημα· same_weekday_median = η ΔΙΑΜΕΣΟΣ του ίδιου παραθύρου 7/14/21/28 μέρες πριν - συνιστάται για ειδοποιήσεις ποσοστιαίας πτώσης: λαμβάνει υπόψη την εποχικότητα ΚΑΙ δεν μετακινείται από μία καμπάνια, άρθρο ή Black Friday. Χρειάζεται δεδομένα σε τουλάχιστον δύο από τις τέσσερις εβδομάδες, αλλιώς αναφέρει "not enough history yet" και δεν ενεργοποιείται. |
scopeApiKeyPrefix | string | null | Περιορισμός σε συγκεκριμένο κλειδί API. Χρησιμοποιήστε το ορατό πρόθεμα του κλειδιού (π.χ. jry_live_98f31a72). Μόνο inbound. |
scopeEndpoint | string | null | Περιορισμός σε συγκεκριμένη διαδρομή (π.χ. /users/:id). Χρησιμοποιήστε την κανονικοποιημένη μορφή. Μόνο inbound. |
scopeWebhookUrl | string | null | Περιορισμός σε συγκεκριμένο URL webhook. Το query string αφαιρείται πριν από τη σύγκριση. Μόνο εξερχόμενα. |
scopeEventName | string | null | Κατεύθυνση events. Ποιο event_name μετριέται. null = μέτρηση όλων των συμβάντων. Αγνοείται όταν metric: total_events. |
notifyChannel | email | webhook | Πώς παραδίδεται η ειδοποίηση. Προεπιλογή email. |
recipients | string[] (≤20) | Διευθύνσεις email που ειδοποιούνται κατά την ενεργοποίηση, λαμβάνουν υπενθύμιση κάθε 4 ώρες όσο παραμένει ενεργή (έως 3 φορές) και ενημερώνονται όταν επιλυθεί. Σε αίτημα, μια διεύθυνση που ανήκει σε ενεργό μέλος του οργανισμού αποθηκεύεται ως παραλήπτης μέλος· κάθε άλλη διεύθυνση είναι εξωτερική και πρέπει να επιβεβαιώσει πριν λάβει οτιδήποτε (παραλήπτες). Σε απόκριση, όλες οι διευθύνσεις του κανόνα - μέλη και εξωτερικές διευθύνσεις. |
recipientMembers | string[] σε αίτημα, object[] σε απόκριση | Προαιρετικό. Αίτημα: αναγνωριστικά χρηστών μελών, που επιλέγονται από τους ανθρώπους του οργανισμού - τα μέλη δεν χρειάζεται ποτέ να επιβεβαιώσουν. Απόκριση: { userId, email, name } για κάθε παραλήπτη μέλος. Όταν notifyChannel: email, τα recipients και recipientMembers μαζί χρειάζονται τουλάχιστον μία εγγραφή. |
externalRecipients | object[] | Μόνο για ανάγνωση. Οι εξωτερικές διευθύνσεις του κανόνα: { recipientId, email, status, confirmationSentAt }. Το status είναι pending (δεν λαμβάνει ακόμα τίποτα), confirmed ή unsubscribed· το confirmationSentAt είναι πότε στάλθηκε το τελευταίο email επιβεβαίωσης, ή null. |
recipientsNeedConfirmation | boolean | Μόνο για ανάγνωση. true όταν μια εξωτερική διεύθυνση είναι pending και δεν της στάλθηκε ποτέ email επιβεβαίωσης - συμβαίνει σε κανόνες που δημιουργήθηκαν πριν οι εξωτερικές διευθύνσεις χρειάζονται επιβεβαίωση. |
webhookUrl | string | null | URL προορισμού για το POST. Απαιτείται όταν notifyChannel: webhook. |
webhookSecret | string | null | Προαιρετικό μυστικό υπογραφής HMAC-SHA256. Όταν οριστεί, τα αιτήματα φέρουν κεφαλίδα X-Joryio-Signature. |
cooldown | 5m | 10m | 30m | 1h | Ελάχιστος χρόνος μεταξύ επανενεργοποιήσεων. |
status | healthy | triggered | snoozed | paused | Κατάσταση χρόνου εκτέλεσης. Μόνο για ανάγνωση από το API - χρησιμοποιήστε τα endpoints snooze/resume για μεταβάσεις. |
Παραλήπτες: μέλη και εξωτερικές διευθύνσεις
- Συμβατό με τα παλαιότερα. Μια απλή λίστα διευθύνσεων email στο
recipientsεξακολουθεί να γίνεται δεκτή, ακριβώς όπως πριν. - Μια διεύθυνση στο
recipientsπου ανήκει σε ενεργό μέλος του οργανισμού γίνεται παραλήπτης μέλος. Κάθε άλλη διεύθυνση γίνεται εξωτερικός παραλήπτης μεstatus: pending, και το Joryio της στέλνει email επιβεβαίωσης (έως ένα ανά διεύθυνση ανά οργανισμό την ημέρα, και 20 ανά οργανισμό την ημέρα). - Μια διεύθυνση σε αναμονή δεν λαμβάνει τίποτα - ούτε ειδοποίηση, ούτε υπενθύμιση, ούτε email επίλυσης - μέχρι να επιβεβαιώσει ο κάτοχός της. Μια διεύθυνση που κάνει διαγραφή αφαιρείται από τον κανόνα και δεν μπορεί να προστεθεί ξανά.
- Κανόνες που δημιουργήθηκαν πριν από αυτή την αλλαγή: οι διευθύνσεις μελών έγιναν παραλήπτες μέλη· κάθε άλλη διεύθυνση είναι σε αναμονή και δεν της στάλθηκε email. Αυτοί οι κανόνες επιστρέφουν
recipientsNeedConfirmation: true. Για να στείλετε το email επιβεβαίωσης (ή να το ξαναστείλετε), καλέστε το endpoint παρακάτω με τοrecipientIdαπό τοexternalRecipients. Απαιτείsettings:write, και τοresultείναι ένα απόsent,rate_limited,already_confirmedήunsubscribed.
POST /notifications/external-recipients/:recipientId/resend
{ "result": "sent" }
Δείτε Οι εξωτερικές διευθύνσεις πρέπει να επιβεβαιώσουν για το τι βλέπει η εξωτερική διεύθυνση.
Endpoints
Λίστα ειδοποιήσεων
GET /monitoring/alerts
Επιστρέφει όλες τις ειδοποιήσεις του τρέχοντος χώρου εργασίας, με τις νεότερες πρώτες.
Απόκριση: 200 OK - MonitoringAlert[]
Λήψη μίας ειδοποίησης
GET /monitoring/alerts/:id
Απόκριση: 200 OK - MonitoringAlert, ή 404 αν το ID δεν ανήκει σε αυτόν τον χώρο εργασίας.
Δημιουργία ειδοποίησης
POST /monitoring/alerts
Content-Type: application/json
{
"name": "5xx error rate",
"direction": "inbound",
"metric": "calls",
"codes": ["5xx"],
"mode": "absolute",
"op": ">",
"threshold": "100",
"duration": "5m",
"recipients": ["[email protected]"],
"cooldown": "10m"
}
Τα πεδία name, direction, metric, mode και threshold απαιτούνται πάντα. Τα πεδία που εξαρτώνται από το κανάλι και τη λειτουργία (mode) επικυρώνονται σημασιολογικά:
- Το κανάλι email (
notifyChannel: email, η προεπιλογή) απαιτεί τουλάχιστον έναν παραλήπτη - μια διεύθυνση στοrecipientsή ένα αναγνωριστικό μέλους στοrecipientMembers. - Το κανάλι webhook (
notifyChannel: webhook) απαιτεί έγκυροhttp(s)webhookUrl· τοrecipientsείναι προαιρετικό. ΤοwebhookSecretείναι προαιρετικό. - Τα πεδία ανά λειτουργία επικυρώνονται ως προς το
mode(π.χ. δεν μπορείτε να ορίσετεopσε change mode· τοvsComparisonισχύει μόνο σε change mode). - Για
direction: events, ορίστε τοscopeEventNameγια να μετριέται ένα συμβάν (ή παραλείψτε το για να μετριούνται όλα). Τοmetric: total_eventsμετρά πάντα όλα τα συμβάντα ανεξαρτήτωςscopeEventName. - Για
direction: deliverability, χρησιμοποιήστεmode: absoluteμε μία από τις μετρικές*Rate, έναop, ποσοστιαίοthresholdκαιduration1h/4h/1d/7d(η αναδρομή του ποσοστού). Τα πεδία scope και τοcodesαγνοούνται. Αν δεν στάλθηκαν μηνύματα στο παράθυρο, η ειδοποίηση δεν ενεργοποιείται.
Απόκριση: 201 Created - MonitoringAlert με συμπληρωμένο id.
Η νέα ειδοποίηση ξεκινά σε status: healthy (ή paused αν enabled: false) και παραλαμβάνεται από τον επόμενο κύκλο του αξιολογητή (εντός 60 δευτερολέπτων).
Ενημέρωση ειδοποίησης
PATCH /monitoring/alerts/:id
Content-Type: application/json
{ "threshold": "200" }
Όλα τα πεδία είναι προαιρετικά. Στείλτε μόνο όσα θέλετε να αλλάξετε. Η μετάβαση σε enabled: false μεταφέρει την ειδοποίηση σε paused· η επαναφορά του σε true την επιστρέφει σε healthy (ο επόμενος κύκλος αξιολόγησης θα την ενεργοποιήσει ξανά αν η μετρική εξακολουθεί να υπερβαίνει το όριο).
Απόκριση: 200 OK - ενημερωμένο MonitoringAlert.
Διαγραφή ειδοποίησης
DELETE /monitoring/alerts/:id
Διαγράφει οριστικά την ειδοποίηση. Οι γραμμές ιστορικού της διαγράφονται επίσης αλυσιδωτά.
Απόκριση: 200 OK - { "ok": true }.
Αναβολή (snooze) ειδοποίησης
POST /monitoring/alerts/:id/snooze
Content-Type: application/json
{ "window": "1h" }
Το window είναι προαιρετικό. Με παράθυρο, η ειδοποίηση μεταβαίνει σε snoozed με ορισμένο snoozedUntil και επανέρχεται αυτόματα όταν περάσει ο χρόνος. Χωρίς παράθυρο, η ειδοποίηση μεταβαίνει σε paused (επ' αόριστον).
Τιμή window | Συμπεριφορά |
|---|---|
1h | Αναβολή για 1 ώρα. |
4h | Αναβολή για 4 ώρες. |
24h | Αναβολή για 24 ώρες. |
until_morning | Αναβολή έως τις 09:00 ώρα διακομιστή την επόμενη ημέρα. |
| (παραλείπεται) | Παύση επ' αόριστον. |
Απόκριση: 200 OK - ενημερωμένο MonitoringAlert.
Συνέχιση ειδοποίησης
POST /monitoring/alerts/:id/resume
Καθαρίζει το snoozedUntil, ορίζει enabled: true και μεταβαίνει σε status: healthy. Ο επόμενος κύκλος του αξιολογητή επανελέγχει τη μετρική και μπορεί να μεταφέρει την ειδοποίηση σε triggered αμέσως, αν εξακολουθεί να υπερβαίνει το όριο.
Απόκριση: 200 OK - ενημερωμένο MonitoringAlert.
Αντιγραφή ειδοποίησης
POST /monitoring/alerts/:id/duplicate
Δημιουργεί νέα ειδοποίηση με την ίδια ρύθμιση. Το όνομα του αντιγράφου παίρνει το επίθημα (copy). Το αντίγραφο ξεκινά σε status: healthy με lastTriggeredAt: null, ανεξάρτητα από την κατάσταση χρόνου εκτέλεσης του πρωτοτύπου.
Απόκριση: 201 Created - το νέο MonitoringAlert.
Ζωντανή προεπισκόπηση
POST /monitoring/preview
Content-Type: application/json
{
"direction": "inbound",
"metric": "calls",
"codes": ["5xx"],
"mode": "absolute",
"op": ">",
"threshold": "100",
"duration": "5m"
}
Αξιολογεί την παρεχόμενη προδιαγραφή ειδοποίησης σε σχέση με τα τρέχοντα δεδομένα χωρίς να αποθηκεύσει τίποτα. Δεν δημιουργείται γραμμή ειδοποίησης. Δεν αποστέλλεται ειδοποίηση. Χρησιμοποιήστε το για να επικυρώσετε τα όρια πριν από τη δημιουργία.
Το payload δέχεται τα ίδια πεδία αξιολόγησης με τη δημιουργία - τα name, recipients, enabled και cooldown δεν χρειάζονται και αγνοούνται.
Απόκριση: 200 OK
{
"currentValue": 142,
"displayValue": "142",
"thresholdLabel": "> 100 in 5m",
"wouldFire": true
}
| Πεδίο | Σημασία |
|---|---|
currentValue | Η ακατέργαστη τιμή της μετρικής από την πηγή της. |
displayValue | Μορφοποιημένη εκδοχή της τιμής. Σε change mode περιλαμβάνει την κατεύθυνση (π.χ. ↓ 92%). |
thresholdLabel | Ευανάγνωστη έκφραση του ορίου που αντιστοιχεί στον κανόνα. |
wouldFire | true αν ο κανόνας θα βρισκόταν αυτή τη στιγμή σε κατάσταση ενεργοποίησης. |
Λίστα ιστορικού
GET /monitoring/history?alertId={id}&state={state}&limit={n}
Επιστρέφει το ημερολόγιο ελέγχου των μεταβάσεων ενεργοποίησης/επίλυσης, με τις νεότερες πρώτες.
Παράμετροι query:
| Παράμετρος | Τύπος | Προεπιλογή | Σημειώσεις |
|---|---|---|---|
alertId | string | - | Περιορισμός σε μία ειδοποίηση. |
state | firing | resolved | snoozed | - | Περιορισμός σε έναν τύπο μετάβασης. |
limit | integer | 200 | Ανώτατο όριο επιστρεφόμενων γραμμών. Αυστηρό όριο στις 1000. |
Απόκριση: 200 OK - MonitoringAlertHistoryEvent[]
[
{
"id": "ev_...",
"alertId": "ak_...",
"alertName": "Server rejecting payloads",
"metric": "Calls returning 5xx",
"valueAtFire": "184",
"valueLabel": "184",
"thresholdLabel": "> 100 in 5m",
"state": "firing",
"resolvedAt": null,
"notificationsSent": 1,
"firedAt": "2026-05-29T14:38:00.000Z"
}
]
Οι γραμμές ιστορικού είναι στιγμιότυπα - αποτυπώνουν το όνομα, τη μετρική, το όριο και τους παραλήπτες της ειδοποίησης τη στιγμή της μετάβασης. Η μετονομασία ή η διαγραφή της ειδοποίησης αργότερα δεν αλλάζει τις ιστορικές γραμμές.
Βοηθητικά endpoints
Αυτά τροφοδοτούν τους επιλογείς και το «καμπανάκι» ειδοποιήσεων του dashboard. Όλα απαιτούν settings:read.
Λίστα ονομάτων συμβάντων
GET /monitoring/event-names
Επιστρέφει τα διακριτά ονόματα συμβάντων του χώρου εργασίας που εμφανίστηκαν τις τελευταίες 30 ημέρες, ταξινομημένα κατά συχνότητα (κορυφαία 200). Τροφοδοτεί τον επιλογέα scopeEventName της κατεύθυνσης Events, ώστε οι πελάτες να βλέπουν το δικό τους λεξιλόγιο συμβάντων.
Απόκριση: 200 OK
[
{ "name": "purchase_complete", "count": 18422 },
{ "name": "add_to_cart", "count": 51904 },
{ "name": "signup", "count": 1203 }
]
Λίστα πηγών webhook
GET /monitoring/webhook-sources
Επιστρέφει τα διακριτά URL προορισμού webhook που είναι ρυθμισμένα στους ενεργούς κόμβους webhook στα ενεργά και προσχέδια Journeys του χώρου εργασίας (τα αρχειοθετημένα canvases εξαιρούνται). Τροφοδοτεί τον επιλογέα scopeWebhookUrl της εξερχόμενης κατεύθυνσης.
Απόκριση: 200 OK
[
{
"url": "https://hooks.your-company.com/joryio",
"canvasId": "cv_...",
"canvasName": "Win-back flow",
"nodeId": "node_...",
"nodeLabel": "Notify CRM"
}
]
Payload ειδοποίησης webhook
Όταν μια ειδοποίηση με notifyChannel: webhook κάνει μετάβαση, το Joryio στέλνει HTTP POST στο webhookUrl. Όπως και το email, το κανάλι webhook στέλνει POST και σε triggered και σε resolved, ώστε ο δέκτης να αντιστοιχίζει τα περιστατικά από άκρη σε άκρη. Οι υπενθυμίσεις «ακόμη ενεργή» στέλνονται μόνο με email - το webhook δεν ξαναστέλνεται όσο η ειδοποίηση παραμένει ενεργοποιημένη.
Αίτημα:
POST {webhookUrl}
Content-Type: application/json
User-Agent: Joryio-Monitoring/1.0
X-Joryio-Signature: {hex hmac-sha256, only when a signing secret is set}
{
"alert": "Server rejecting payloads",
"status": "triggered",
"metric": "Calls returning 5xx",
"value": 184,
"displayValue": "184",
"accountName": "Acme Inc",
"workspaceName": "Production",
"firedAt": "2026-05-29T14:38:00.000Z"
}
| Πεδίο | Τύπος | Σημειώσεις |
|---|---|---|
alert | string | Το όνομα της ειδοποίησης. |
status | triggered | resolved | Ποια μετάβαση αντιπροσωπεύει αυτό το POST. |
metric | string | Ευανάγνωστη ετικέτα της παρακολουθούμενης μετρικής. |
accountName | string | Ο λογαριασμός (οργανισμός) στον οποίο ανήκει η ειδοποίηση. |
workspaceName | string | Ο χώρος εργασίας στον οποίο ανήκει η ειδοποίηση. |
value | number | Η ακατέργαστη τιμή της μετρικής κατά τη μετάβαση. |
displayValue | string | Μορφοποιημένη τιμή (σε change mode περιλαμβάνει την κατεύθυνση, π.χ. ↓ 92%). |
firedAt | string (ISO 8601) | Πότε συνέβη η μετάβαση. |
Επαλήθευση υπογραφής. Όταν έχει οριστεί webhookSecret, το Joryio υπολογίζει HMAC-SHA256(rawBody) με κλειδί το μυστικό και το στέλνει ως πεζή δεκαεξαδική συμβολοσειρά (χωρίς πρόθεμα) στην κεφαλίδα X-Joryio-Signature. Υπολογίστε το ξανά πάνω στο ακριβές ακατέργαστο σώμα του αιτήματος και συγκρίνετε με έλεγχο σταθερού χρόνου πριν εμπιστευτείτε το payload.
Σημασιολογία παράδοσης. Το Joryio αναμένει απόκριση 2xx. Σε αποτυχία, επαναλαμβάνει έως 3 φορές με εκθετική αναμονή (≈0.5s, 1s, 2s)· κάθε προσπάθεια έχει χρονικό όριο 10s. Μετά από 3 αποτυχίες, η παράδοση εγκαταλείπεται (η ίδια η μετάβαση κατάστασης εξακολουθεί να αποθηκεύεται στο Ιστορικό).
Προστασία SSRF. Το URL επικυρώνεται κατά τη δημιουργία/ενημέρωση της ειδοποίησης και επανεπικυρώνεται τη στιγμή της αποστολής (το DNS μπορεί να αλλάξει δέσμευση μεταξύ εγγραφής και ενεργοποίησης) - μια παράδοση σε ιδιωτική, link-local ή cloud-metadata διεύθυνση αποκλείεται. Οι ανακατευθύνσεις δεν ακολουθούνται (maxRedirects: 0), αφού ένα 3xx προς εσωτερική διεύθυνση θα παρέκαμπτε αυτόν τον έλεγχο.
Πηγή μετρικών
Οι πηγές μετρικών βρίσκονται στο event store των αναλυτικών στοιχείων και συμπληρώνονται αυτόματα. Είναι οι ίδιες πηγές από τις οποίες διαβάζουν τα γραφήματα του dashboard, οπότε ο μηχανισμός ειδοποιήσεων και τυχόν προσαρμοσμένα αναλυτικά στοιχεία μοιράζονται μία ενιαία πηγή αλήθειας.
Το log εισερχόμενων αιτημάτων API και το log εξερχόμενων παραδόσεων webhook είναι το καθένα ενεργοποιήσιμο/απενεργοποιήσιμο ανά οργανισμό και έχουν ρυθμιζόμενο παράθυρο διατήρησης (7–365 ημέρες, προεπιλογή 90), τα οποία διαχειρίζεται το προσωπικό του Joryio στην κονσόλα διαχείρισης. Όταν μια ροή είναι απενεργοποιημένη για έναν οργανισμό, δεν γράφονται γραμμές και οι ειδοποιήσεις αυτής της κατεύθυνσης σταματούν να αξιολογούνται. Η διατήρηση επιβάλλεται ανά γραμμή μέσω στήλης delete_at (οι υπάρχουσες γραμμές συμπληρώθηκαν αναδρομικά με ts + 90d).
api_request_logs
Μία γραμμή ανά αίτημα με έλεγχο ταυτότητας κλειδιού API προς το REST API του Joryio.
| Στήλη | Τύπος | Σημειώσεις |
|---|---|---|
ts | DateTime | Χρονοσφραγίδα UTC της ολοκλήρωσης του αιτήματος. |
organization_id | String | Οργανισμός-κάτοχος. |
workspace_id | String | Χώρος εργασίας-κάτοχος. |
api_key_id | Nullable(String) | UUID της γραμμής του κλειδιού API. |
api_key_prefix | String | Δημόσιο πρόθεμα του κλειδιού (π.χ. jry_live_98f31a72). |
method | LowCardinality(String) | Ρήμα HTTP. |
endpoint | LowCardinality(String) | Κανονικοποιημένη διαδρομή. Τα UUID και τα μεγάλα αριθμητικά τμήματα αντικαθίστανται με :id. |
raw_path | String | Αρχική διαδρομή με το query string, με όριο 512 χαρακτήρες. |
status | UInt16 | Κατάσταση της απόκρισης HTTP. |
duration_ms | UInt32 | Καθυστέρηση σε χιλιοστά του δευτερολέπτου. |
request_ip | Nullable(String) | IP προέλευσης (μετά την ανάλυση του X-Forwarded-For). |
- Διαμέριση: μηνιαία (
toYYYYMM(ts)). - Διατήρηση: TTL ανά γραμμή μέσω στήλης
delete_at, που ορίζεται σεts + retentionDaysκατά την εγγραφή. Προεπιλογή 90 ημέρες, ρυθμιζόμενη ανά οργανισμό (7–365). Η καταγραφή μπορεί να απενεργοποιηθεί ανά οργανισμό. - Τι εξαιρείται: Κίνηση dashboard με έλεγχο ταυτότητας JWT· διαδρομές ελέγχου υγείας (
/health,/metrics).
webhook_delivery_logs
Μία γραμμή ανά προσπάθεια εξερχόμενης παράδοσης webhook (επιτυχία ή αποτυχία).
| Στήλη | Τύπος | Σημειώσεις |
|---|---|---|
ts | DateTime | Χρονοσφραγίδα UTC της ολοκλήρωσης της προσπάθειας. |
organization_id | String | Οργανισμός-κάτοχος. |
workspace_id | String | Χώρος εργασίας-κάτοχος. |
canvas_id | Nullable(String) | ID του Journey χρηστών προέλευσης. |
execution_id | Nullable(String) | ID εκτέλεσης του Journey προέλευσης. |
node_id | Nullable(String) | ID του κόμβου webhook προέλευσης. |
url | String | Πλήρες URL προορισμού. |
url_canonical | String | URL με αφαιρεμένο το query string και χωρίς κάθετο στο τέλος. Χρησιμοποιείται από τα φίλτρα ειδοποιήσεων. |
method | LowCardinality(String) | Ρήμα HTTP. |
status | UInt16 | Κατάσταση απόκρισης. 0 για σφάλματα επιπέδου μεταφοράς (timeout, αποτυχία DNS, άρνηση σύνδεσης). |
duration_ms | UInt32 | Καθυστέρηση σε χιλιοστά του δευτερολέπτου. |
attempt | UInt8 | Αριθμός προσπάθειας (1 στην πρώτη). |
error | Nullable(String) | Μήνυμα σφάλματος σε αποκρίσεις εκτός 2xx. |
- Διαμέριση: μηνιαία.
- Διατήρηση: TTL ανά γραμμή μέσω
delete_at. Προεπιλογή 90 ημέρες, ρυθμιζόμενη ανά οργανισμό (7–365). Η καταγραφή μπορεί να απενεργοποιηθεί ανά οργανισμό. - Τι εξαιρείται: Webhooks που εκτελέστηκαν πριν κυκλοφορήσει αυτή η λειτουργία (οι παλαιότερες εργασίες σε ουρά δεν έχουν τα μεταδεδομένα tenant που απαιτούνται για την απόδοσή τους).
events
Η κατεύθυνση Events διαβάζει τον υπάρχοντα πίνακα events - τον ίδιο πίνακα στον οποίο καταλήγει κάθε καταγεγραμμένο συμβάν πελάτη - αντί για μια αποκλειστική ροή παρακολούθησης. Χρησιμοποιούνται δύο συγκεντρωτικά:
| Μετρική | Ερώτημα |
|---|---|
event_count / total_events | count() πάνω σε (organization_id, workspace_id, [event_name], time range). |
unique_users | uniqExact(user_id) με το ίδιο φίλτρο. |
Το scopeEventName προσθέτει έναν όρο event_name = …· η παράλειψή του μετρά όλα τα ονόματα συμβάντων. Παρακολουθείται το πλήθος των αποθηκευμένων συμβάντων - ένα αίτημα που το Joryio αποδέχεται αλλά του οποίου το payload απορρίπτει εμφανίζεται στο Inbound API, όχι εδώ.
Αποκρίσεις σφαλμάτων
| Κατάσταση | Πότε |
|---|---|
400 | Αποτυχία επικύρωσης - λείπει απαιτούμενο πεδίο, αναντιστοιχία mode/op κ.λπ. Το σώμα της απόκρισης απαριθμεί τα προβληματικά πεδία. |
401 | JWT που λείπει ή είναι μη έγκυρο. |
403 | Το JWT είναι έγκυρο αλλά δεν έχει settings:read (λίστα/λήψη/ιστορικό/προεπισκόπηση) ή settings:write (δημιουργία/ενημέρωση/διαγραφή/αναβολή/συνέχιση/αντιγραφή). |
404 | Το ID ειδοποίησης δεν βρέθηκε στον τρέχοντα χώρο εργασίας. |
Δείγμα ενσωμάτωσης
Δημιουργία, προεπισκόπηση και αναβολή μιας ειδοποίησης από ένα shell:
TOKEN=eyJ...
BASE=https://api-eu1.joryio.com/api
# 1) Preview before saving - would it fire right now?
curl -sX POST "$BASE/monitoring/preview" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"direction":"inbound","metric":"calls","codes":["5xx"],"mode":"absolute","op":">","threshold":"100","duration":"5m"}'
# → {"currentValue":42,"displayValue":"42","thresholdLabel":"> 100 in 5m","wouldFire":false}
# 2) Looks good - create the alert.
ALERT_ID=$(curl -sX POST "$BASE/monitoring/alerts" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"5xx error rate","direction":"inbound","metric":"calls","codes":["5xx"],"mode":"absolute","op":">","threshold":"100","duration":"5m","recipients":["[email protected]"]}' \
| jq -r .id)
# 3) Snooze it for 4 hours during a known maintenance window.
curl -sX POST "$BASE/monitoring/alerts/$ALERT_ID/snooze" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"window":"4h"}'