Skip to main content

Minimalist rhythm processor (beta)

Project description

Cadence

A rhythm analysis toolkit, gathering multiple parsing engines:

  • Prosodic for fast English and Finnish metrical scansion.
  • Cadence itself for slower but exhaustive, MaxEnt-able metrical scansion.

Quickstart

Install

1. Install python package

# install from github
pip install -U git+https://github.com/quadrismegistus/cadence

2. Insteall espeak (TTS)

Install espeak, free TTS software, to 'sound out' unknown words. See here for all downloads. For Mac or Linux, you can use:

apt-get install espeak     # linux
brew install espeak        # mac

Load texts

sonnetXIV = """Not from the stars do I my judgement pluck;
And yet methinks I have astronomy,
But not to tell of good or evil luck,
Of plagues, of dearths, or seasons' quality;
Nor can I fortune to brief minutes tell,
Pointing to each his thunder, rain and wind,
Or say with princes if it shall go well
By oft predict that I in heaven find:
But from thine eyes my knowledge I derive,
And constant stars in them I read such art
As 'truth and beauty shall together thrive,
If from thyself, to store thou wouldst convert';
    Or else of thee this I prognosticate:
    'Thy end is truth's and beauty's doom and date.'
"""

melville="""Is it that by its indefiniteness it shadows forth the heartless voids and immensities of the universe, and thus stabs us from behind with the thought of annihilation, when beholding the white depths of the milky way? Or is it, that as in essence whiteness is not so much a colour as the visible absence of colour; and at the same time the concrete of all colours; is it for these reasons that there is such a dumb blankness, full of meaning, in a wide landscape of snows: a colourless, all-colour of atheism from which we shrink?"""
# this should work following installation
import cadence as cd
# These are identical
sonnet = cd.Text(sonnetXIV, verse=True)
sonnet = cd.Text(sonnetXIV, linebreaks=True, phrasebreaks=False)
sonnet = cd.Poem(sonnetXIV)
# So are these
para = cd.Text(melville, prose=True)
para = cd.Text(melville, linebreaks=False, phrasebreaks=True)
para = cd.Prose(melville)

Syllabify

# scansion by syllable
sonnet.scan()
Iterating over line scansions [x1]: 100%|██████████| 14/14 [00:00<00:00, 56.28it/s]

is_funcword is_heavy is_light is_peak is_stressed is_syll is_trough is_unstressed line_num_syll prom_strength prom_stress prom_weight
stanza_i line_i linepart_i line_str word_i word_str word_ipa_i word_ipa syll_i syll_str syll_ipa syll_stress syll_weight
1 1 1 Not from the stars do I my judgement pluck; 1 Not 1 'nɑt 1 Not 'nɑt P H 1 1 0 0 1 1 0 0 10 NaN 1.0 1
2 nɑt 1 Not nɑt U H 1 1 0 0 0 1 0 1 10 NaN 0.0 1
2 from 1 frʌm 1 from frʌm U H 1 1 0 0 0 1 0 1 10 NaN 0.0 1
3 the 1 ðə 1 the ðə U L 1 0 1 0 0 1 0 1 10 NaN 0.0 0
4 stars 1 'stɑrz 1 stars 'stɑrz P H 0 1 0 0 1 1 0 0 10 NaN 1.0 1
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
14 1 'Thy end is truth's and beauty's doom and date.' 6 beauty's 1 'bjʉː.tɪz 1 beau 'bjʉː P L 0 0 1 1 1 1 0 0 10 1.0 1.0 0
2 ty's tɪz U H 0 1 0 0 0 1 1 1 10 0.0 0.0 1
7 doom 1 'duːm 1 doom 'duːm P H 0 1 0 0 1 1 0 0 10 NaN 1.0 1
8 and 1 ænd 1 and ænd U H 1 1 0 0 0 1 0 1 10 NaN 0.0 1
9 date.' 1 'deɪt 1 date.' 'deɪt P H 0 1 0 0 1 1 0 0 10 NaN 1.0 1

156 rows × 12 columns

para.scan()
Iterating over line scansions [x1]: 100%|██████████| 11/11 [00:00<00:00, 54.91it/s]
is_funcword is_heavy is_light is_peak is_stressed is_syll is_trough is_unstressed line_num_syll prom_strength prom_stress prom_weight
stanza_i line_i linepart_i line_str word_i word_str word_ipa_i word_ipa syll_i syll_str syll_ipa syll_stress syll_weight
1 1 1 Is it that by its indefiniteness it shadows forth the heartless voids and immensities of the universe, 1 Is 1 ɪz 1 Is ɪz U H 1 1 0 0 0 1 0 1 28 NaN 0.0 1
2 it 1 ɪt 1 it ɪt U H 1 1 0 0 0 1 0 1 28 NaN 0.0 1
3 that 1 'ðæt 1 that 'ðæt P H 1 1 0 0 1 1 0 0 28 NaN 1.0 1
2 ðət 1 that ðət U H 1 1 0 0 0 1 0 1 28 NaN 0.0 1
4 by 1 baɪ 1 by baɪ U L 1 0 1 0 0 1 0 1 28 NaN 0.0 0
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
2 8 all-colour of atheism from which we shrink? 4 from 1 frʌm 1 from frʌm U H 1 1 0 0 0 1 0 1 12 NaN 0.0 1
5 which 1 'wɪʧ 1 which 'wɪʧ P H 1 1 0 0 1 1 0 0 12 NaN 1.0 1
2 wɪʧ 1 which wɪʧ U H 1 1 0 0 0 1 0 1 12 NaN 0.0 1
6 we 1 wiː 1 we wiː U L 1 0 1 0 0 1 0 1 12 NaN 0.0 0
7 shrink? 1 'ʃrɪŋk 1 shrink? 'ʃrɪŋk P H 0 1 0 0 1 1 0 0 12 NaN 1.0 1

152 rows × 12 columns

Parse text

# Parse lines (verse)
sonnet.parse()

Not fróm the stárs do Í my júdgement plúck;

And yét methínks I háve astróno,

But nót to téll of góod or évil lúck,

Of plágues, of déarths, or séason qúali;

Nor cán I fórtune brief mínutes téll,

Póinting to éach his thúnder, ráin and wínd,

Or sáy with prínces íf it sháll go wéll

By óft predíct that Í in héaven fínd:

But fróm thine éyes my knówledge Í deríve,

And cónstant stárs in thém I réad such árt

As 'trúth and béauty sháll togéther thríve,

If fróm thysélf, to stóre thou wóuldst convért';

Or élse of thée this Í prognósticáte:

'Thy énd is trúth's and béauty's dóom and dáte.'

# Parse sentences (prose)
para.parse()

Ís it thát by íts indéfiníteness it shádows fórth the héartless vóids and imménsitíes of the úniver, and thús stábs us fróm behínd with the thóught of anhition, whén behólding thé white dépths of the lky wáy?

Or ís it, thát as in éssence whíteness is nót so múch a cólour ás the vísible ábsence of cólour; and át the sáme tíme the cóncrete óf all cólours; ís it fór these réasons thát there ís such á dumb blánkness, fúll of méaning, ín a wíde landscápe of snóws: a cólourless, all-colour óf atheísm from whích we shrínk?

# get parse data as dataframe
sonnet.parses()                  # plausible (unbounded) parses
sonnet.unbounded_parses()        # same as above
sonnet.all_parses()              # all parses, plausible or no
sonnet.best_parses()             # only top ranking parse per line
*total *s/unstressed *w-res *w/stressed *clash *f-res *w/peak *lapse is_funcword is_heavy is_light is_peak is_s is_stressed is_syll is_trough is_unstressed is_w line_num_syll parse_num_pos parse_num_syll parse_rank_dense parse_rank_min prom_strength prom_stress prom_weight
stanza_i line_i linepart_i line_str parse_rank parse_str parse parse_i combo_stress combo_ipa combo_i parse_is_bounded parse_bounded_by
1 1 1 Not from the stars do I my judgement pluck; 1 not FROM* the STARS do I* my JUDGE ment PLUCK; w s w s w s w s w s 1 U U U P U U U P U P nɑt frʌm ðə 'stɑrz duː aɪ maɪ 'ʤʌʤ.mənt 'plʌk 1 False 2.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 6 6 4 1 5 3 10 1 7 5 10 10 19 1 1 1.0 3.0 6
2 1 And yet methinks I have astronomy, 1 and YET me THINKS i HAVE as TRON o MY,* w s w s w s w s w s 0 U P U P U P U P U U ænd 'jɛt mi.'θɪŋks aɪ 'hæv ə.'strɑ.nʌ.miː 0 False 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 3 4 6 2 5 4 10 3 6 5 10 10 19 1 1 2.0 4.0 4
3 1 But not to tell of good or evil luck, 1 but NOT to TELL of GOOD or EV il LUCK, w s w s w s w s w s 0 U P U P U P U P U P bət 'nɑt tuː 'tɛl ʌv 'gʊd ɔːr 'iː.vəl 'lək 0 False 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5 8 2 1 5 5 10 1 5 5 10 10 19 1 1 1.0 5.0 8
4 1 Of plagues, of dearths, or seasons' quality; 1 of PLAGUES, of DEARTHS, or SEA son QUAL i TY;* w s w s w s w s w s 0 U P U P U P U P U U ʌv 'pleɪgz ʌv 'dəːθs ɔːr 'siː.zənz 'kwɑ.lə.tiː 0 False 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 3 6 4 2 5 4 10 2 6 5 10 10 19 1 1 2.0 4.0 6
5 1 Nor can I fortune to brief minutes tell, 1 nor CAN* i FOR tune TO* brief* MIN utes TELL, w s w s w s w s w s 0 U U U P U U P P U P nɔːr kæn aɪ 'fɔːr.ʧən tuː 'briːf 'mɪ.nʌts 'tɛl 0 False 3.0 2.0 0.0 1.0 0.0 0.0 0.0 0.0 4 7 3 2 5 4 10 2 6 5 10 10 19 1 1 2.0 4.0 7
6 1 Pointing to each his thunder, rain and wind, 1 POINT ing.to* EACH his THUN der, RAIN and WIND, s w w s w s w s w s 0 P U U P U P U P U P 'pɔɪn.tɪŋ tuː 'iːʧ hɪz 'θʌn.dɛː 'reɪn ænd 'waɪnd 0 False 2.0 0.0 0.0 0.0 0.0 2.0 0.0 0.0 4 8 2 2 5 5 10 2 5 5 10 9 19 1 1 2.0 5.0 8
7 1 Or say with princes if it shall go well 1 or SAY with PRI nces IF* it SHALL go* WELL w s w s w s w s w s 0 U P U P U U U P P P ɔːr 'seɪ wɪð 'prɪn.səz ɪf ɪt 'ʃæl 'goʊ 'wɛl 0 False 2.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 4 8 2 1 5 5 10 1 5 5 10 10 19 1 1 1.0 5.0 8
8 1 By oft predict that I in heaven find: 1 by OFT pre DICT that I* in HEAV en FIND: w s w s w s w s w s 0 U P U P U U U P U P baɪ 'ɔːft prɪ.'dɪkt ðət aɪ ɪn 'hɛ.vən 'faɪnd 0 False 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 4 6 4 2 5 4 10 2 6 5 10 10 19 1 1 2.0 4.0 6
9 1 But from thine eyes my knowledge I derive, 1 but FROM* thine EYES my KNOWL edge I* de RIVE, w s w s w s w s w s 0 U U U P U P U U U P bət frʌm ðaɪn 'aɪz maɪ 'nɑ.ləʤ aɪ dɛː.'aɪv 0 False 2.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 5 6 4 2 5 3 10 2 7 5 10 10 19 1 1 2.0 3.0 6
10 1 And constant stars in them I read such art 1 and CON stant STARS in THEM* i READ such ART w s w s w s w s w s 0 U P U P U U U P U P ænd 'kɑn.stənt 'stɑrz ɪn ðɛm aɪ 'rɛd səʧ 'ɑrt 0 False 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 5 9 1 1 5 4 10 1 6 5 10 10 19 1 1 1.0 4.0 9
11 1 As 'truth and beauty shall together thrive, 1 as 'TRUTH and BEAU ty SHALL to GETH er THRIVE, w s w s w s w s w s 0 U P U P U P U P U P æz 'truːθ ænd 'bjuː.tiː 'ʃæl tʌ.'gɛ.ðɛː 'θraɪv 0 False 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2 5 5 2 5 5 10 3 5 5 10 10 19 1 1 2.0 5.0 5
12 1 If from thyself, to store thou wouldst convert'; 1 if FROM* thy SELF, to STORE thou WOULDST con VERT'; w s w s w s w s w s 0 U U U P U P U P U P ɪf frʌm θaɪ.'sɛlf tuː 'stɔːr ðaʊ 'wʊədst kən.'vɛːt 0 False 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 4 7 3 2 5 4 10 2 6 5 10 10 19 1 1 2.0 4.0 7
13 1 Or else of thee this I prognosticate: 1 or ELSE of THEE* this I* prog* NOS ti CATE: w s w s w s w s w s 0 U P U U U U S P U S ɔːr 'ɛls ʌv ðiː ðɪs aɪ `prɑg.'nɑ.stə.`keɪt 0 False 3.0 2.0 0.0 1.0 0.0 0.0 0.0 0.0 5 6 4 2 5 4 10 2 6 5 10 10 19 1 1 2.0 3.0 6
14 1 'Thy end is truth's and beauty's doom and date.' 1 'thy END is TRUTH'S and BEAU ty's DOOM and DATE.' w s w s w s w s w s 0 U P U P U P U P U P ðaɪ 'ɛnd ɪz 'truːθs ænd 'bjʉː.tɪz 'duːm ænd 'deɪt 0 False 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4 8 2 1 5 5 10 1 5 5 10 10 19 1 1 1.0 5.0 8
# any of the above can return syllable level data as well
sonnet.all_parses(by_syll=True)
sonnet.best_parses(by_syll=True)
sonnet.best_parses(by_syll=True).query('line_i==1') # first line
*total *s/unstressed *w-res *w/stressed *clash *f-res *w/peak *lapse is_funcword is_heavy is_light is_peak is_s is_stressed is_syll is_trough is_unstressed is_w line_num_syll parse_num_pos parse_num_syll prom_strength prom_stress prom_weight
stanza_i line_i linepart_i line_str parse_rank parse_str parse parse_i combo_stress combo_ipa combo_i parse_is_bounded parse_bounded_by parse_pos_i parse_pos word_i word_str word_ipa_i word_ipa syll_i syll_str syll_ipa syll_stress syll_weight parse_syll_i parse_syll
1 1 1 Not from the stars do I my judgement pluck; 1 not FROM* the STARS do I* my JUDGE ment PLUCK; w s w s w s w s w s 1 U U U P U U U P U P nɑt frʌm ðə 'stɑrz duː aɪ maɪ 'ʤʌʤ.mənt 'plʌk 1 False 0 w 1 Not 2 nɑt 1 Not nɑt U H 1 w 0.0 0.0 0.0 0.0 NaN 0.0 0.0 NaN 1 1 0 0 0 0 1 0 1 1 10 10 19 NaN 0.0 1
1 s 2 from 1 frʌm 1 from frʌm U H 1 s 1.0 1.0 0.0 0.0 NaN 0.0 0.0 NaN 1 1 0 0 1 0 1 0 1 0 10 10 19 NaN 0.0 1
2 w 3 the 1 ðə 1 the ðə U L 1 w 0.0 0.0 0.0 0.0 NaN 0.0 0.0 NaN 1 0 1 0 0 0 1 0 1 1 10 10 19 NaN 0.0 0
3 s 4 stars 1 'stɑrz 1 stars 'stɑrz P H 1 s 0.0 0.0 0.0 0.0 NaN 0.0 0.0 NaN 0 1 0 0 1 1 1 0 0 0 10 10 19 NaN 1.0 1
4 w 5 do 2 duː 1 do duː U L 1 w 0.0 0.0 0.0 0.0 NaN 0.0 0.0 NaN 1 0 1 0 0 0 1 0 1 1 10 10 19 NaN 0.0 0
5 s 6 I 1 1 I U L 1 s 1.0 1.0 0.0 0.0 NaN 0.0 0.0 NaN 1 0 1 0 1 0 1 0 1 0 10 10 19 NaN 0.0 0
6 w 7 my 1 maɪ 1 my maɪ U L 1 w 0.0 0.0 0.0 0.0 NaN 0.0 0.0 NaN 1 0 1 0 0 0 1 0 1 1 10 10 19 NaN 0.0 0
7 s 8 judgement 1 'ʤʌʤ.mənt 1 judge 'ʤʌʤ P H 1 s 0.0 0.0 0.0 0.0 NaN 0.0 0.0 NaN 0 1 0 1 1 1 1 0 0 0 10 10 19 1.0 1.0 1
8 w 8 judgement 1 'ʤʌʤ.mənt 2 ment mənt U H 1 w 0.0 0.0 0.0 0.0 NaN 0.0 0.0 NaN 0 1 0 0 0 0 1 1 1 1 10 10 19 0.0 0.0 1
9 s 9 pluck; 1 'plʌk 1 pluck; 'plʌk P H 1 s 0.0 0.0 0.0 0.0 NaN 0.0 0.0 NaN 0 1 0 0 1 1 1 0 0 0 10 10 19 NaN 1.0 1
# Best prose parses
para.best_parses()
*total *s/unstressed *w-res *w/stressed *clash *f-res *w/peak *lapse is_funcword is_heavy is_light is_peak is_s is_stressed is_syll is_trough is_unstressed is_w line_num_syll parse_num_pos parse_num_syll parse_rank_dense parse_rank_min prom_strength prom_stress prom_weight
stanza_i line_i linepart_i line_str parse_rank parse_str parse parse_i combo_stress combo_ipa combo_i parse_is_bounded parse_bounded_by
1 1 1 Is it that by its indefiniteness it shadows forth the heartless voids and immensities of the universe, 1 is.it* THAT by ITS* in DEF i NITE.NESS* it SHAD ows* FORTH the HEART less VOIDS and IM.MEN* si TIES.OF* the UNI ver SE, w w s w s w s w s s w s w s w s w s w s s w s s w s w s 40 U U P U U U P U U U U P S P U P U P U U P U U U U P U S ɪz ɪt 'ðæt baɪ ɪts ɪn.'dɛ.fɪ.nʌt.nʌs ɪt 'ʃæ.`doʊz 'fɔːrθ ðə 'hɑrt.ləs 'vɔɪdz ænd ɪ.'mɛn.sɪ.tɪz ʌv ðə 'juː.nʌ.`vɛːs 0 False 16.0 7.0 4.0 1.0 0.0 4.0 0.0 0.0 10 18 10 6 15 10 28 7 18 13 28 24 55 6 66 6.0 9.0 18
2 and thus stabs us from behind with the thought of annihilation, 1 AND* thus* STABS us FROM* be HIND with THE* thought* OF* an NI hi LA tion, s w s w s w s w s w s w s w s w 4 U P P U U U P U U P U U S U P U ænd 'ðʌs 'stæbz əs frʌm bɪ.'haɪnd wɪð ðə 'θɔːt ʌv ə.`naɪ.ə.'leɪ.ʃən 0 False 6.0 4.0 0.0 2.0 0.0 0.0 0.0 0.0 6 10 6 3 8 6 16 4 10 8 16 16 31 1 1 3.0 5.5 10
3 when beholding the white depths of the milky way? 1 WHEN be HOLD ing THE* white* DEPTHS of.the* MI lky WAY? s w s w s w s w w s w s 0 P U P U U P P U U P U P 'wɛn bɪ.'hoʊl.dɪŋ ðə 'waɪt 'dɛpθs ʌv ðə 'mɪl.kiː 'weɪ 0 False 4.0 1.0 0.0 1.0 0.0 2.0 0.0 0.0 4 7 5 2 6 6 12 3 6 6 12 11 23 1 1 2.0 6.0 7
2 1 Or is it, 1 or IS* it, w s w 0 U U U ɔːr ɪz ɪt 0 False 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 3 3 0 0 1 0 3 0 3 2 3 3 5 1 1 0.0 0.0 3
2 that as in essence whiteness is not so much a colour as the visible absence of colour; 1 that AS* in ESS ence WHITE ness.is* NOT so MUCH a COL our AS* the VIS i BLE* ab* SENCE* of COL our; w s w s w s w w s w s w s w s w s w s w s w s w 16 U U U P U P U U P U P U P U U U P U U P U U P U ðət æz ɪn 'ɛ.səns 'waɪt.nəs ɪz 'nɑt soʊ 'mʌʧ eɪ 'kʌ.lʌ æz ðə 'vɪ.zʌ.bəl 'æb.səns ʌv 'kʌ.lʌ 2 False 8.0 4.0 0.0 1.0 0.0 2.0 1.0 0.0 10 14 10 6 11 8 24 6 16 13 24 23 47 1 1 6.0 8.0 14
3 and at the same time the concrete of all colours; 1 and AT the SAME.TIME* the CON crete OF* all COLO urs; w s w s s w s w s w s w 0 U P U P P U P U U U P U ænd 'æt ðə 'seɪm 'taɪm ðə 'kɑn.kriːt ʌv ɔːl 'kʌ.lʌz 0 False 3.0 1.0 0.0 0.0 0.0 2.0 0.0 0.0 7 9 3 2 6 5 12 2 7 6 12 11 23 1 1 2.0 5.0 9
4 is it for these reasons that there is such a dumb blankness, 1 IS* it FOR* these REA sons THAT there IS* such A* dumb* BLANK ness, s w s w s w s w s w s w s w 0 U U U U P U P U U U U P P U ɪz ɪt fɔːr ðiːz 'riː.zənz 'ðæt ðɛr ɪz səʧ eɪ 'dəm 'blæŋk.nʌs 0 False 5.0 4.0 0.0 1.0 0.0 0.0 0.0 0.0 9 12 2 2 7 4 14 2 10 7 14 14 27 1 1 2.0 4.0 12
5 full of meaning, 1 FULL of MEAN ing, s w s w 0 P U P U 'fʊl ʌv 'miː.nɪŋ 0 False 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1 3 1 1 2 2 4 1 2 2 4 4 7 1 1 1.0 2.0 3
6 in a wide landscape of snows: 1 IN a WIDE land* SCAPE of SNOWS: s w s w s w s 0 P U P P S U P 'ɪn eɪ 'waɪd 'lænd.`skeɪp ʌv 'snoʊz 0 False 2.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 3 6 1 1 4 5 7 1 2 3 7 7 13 1 1 1.0 4.5 6
7 a colourless, 1 a COLOUR le SS,* w s w s 0 U P U U eɪ 'kʌ.lʌ.lʌs 0 False 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1 1 3 1 2 1 4 1 3 2 4 4 7 1 1 1.0 1.0 1
8 all-colour of atheism from which we shrink? 1 al L- colour OF* athe I sm.from* WHICH we SHRINK? w s w s w s w w s w s 0 U P U U U P U U P U P ɔːl.'kʌ.lʌ ʌv ə.'θaɪ.səm frʌm 'wɪʧ wiː 'ʃrɪŋk 0 False 3.0 1.0 0.0 0.0 0.0 2.0 0.0 0.0 4 6 5 2 5 4 11 4 7 6 12 10 21 1 1 2.0 4.0 6

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cadences-0.3.0.tar.gz (1.1 MB view hashes)

Uploaded Source

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page