/** Ċ Ġ* ĠAdapt ed Ġfrom Ġhttps :// github . com / zen sum / ktor - health - check Ċ Ġ*/ Ċ package Ġmob i . water dog . rest . template . health check Ċ Ċ import Ġio . ktor . application . Application Call Pipeline Ċ import Ġio . ktor . application . Application Feature Ċ import Ġio . ktor . application . call Ċ import Ġio . ktor . http . ContentType Ċ import Ġio . ktor . request . path Ċ import Ġio . ktor . response . respond Text Ċ import Ġio . ktor . util . Attribute Key Ċ Ċ // ĠA Ġcheck Ġis Ġa Ġnull ary Ġfunction Ġreturning Ċ // Ġa Ġboolean Ġindicating Ġthe Ġsuccess Ġof Ġthe Ġcheck . Ċ private Ġtype alias ĠCheck Ġ= Ġsuspend Ġ() Ġ-> ĠBoolean Ċ Ċ // ĠA Ġcheck map Ġis Ġsimply Ġa Ġmap Ġof Ġnames Ġto ĠCheck Ġfunctions . Ċ private Ġtype alias ĠCheck Map Ġ= ĠMutable Map < String , ĠCheck > Ċ Ċ // ĠA ĠCheck Map Ġcan Ġbe Ġconverted Ġto Ġa Ġfunction Ġreturning Ċ // Ġresults Ġfor Ġeach Ġof Ġthe Ġchecks . Ċ private Ġfun ĠCheck Map . to Function (): Ġsuspend Ġ() Ġ-> ĠMap < String , ĠBoolean > Ġ= Ġ{ ĊĠĠĠ Ġmap Values Ġ{ Ġit . value () Ġ} Ċ } Ċ Ċ // ĠWe Ġuse Ġa Ġversion Ġof ĠKubernetes Ġrecommendations : Ġli ven ess Ġand Ġread iness Ċ private Ġconst Ġval ĠLI VE _ CHECK _ URL Ġ= Ġ" li ven ess " Ċ private Ġconst Ġval ĠREAD Y _ CHECK _ URL Ġ= Ġ" read iness " Ċ Ċ private Ġfun Ġnormalize URL ( url : ĠString ) Ġ= Ġurl . trim ('/ '). also Ġ{ ĊĠĠĠ Ġrequire ( url . trim ('/ '). isNotBlank ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" The Ġpassed Ġin ĠURL Ġmust Ġbe Ġmore Ġthan Ġone " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġcharacter Ġnot Ġcounting Ġa Ġleading Ġslash " ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠHealth Ġprivate Ġconstructor ( private Ġval Ġcfg : ĠConfiguration ) Ġ{ ĊĠĠĠ Ġfun Ġadd Interceptor ( pipeline : ĠApplication Call Pipeline ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchecks Ġ= Ġcfg . get Check sWith Functions () ĊĠĠĠĠĠĠĠ Ġif Ġ( checks . isEmpty ()) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġlengths Ġ= Ġchecks . keys . map Ġ{ Ġit . length Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmax L Ġ= Ġlengths . max OrNull () !! ĊĠĠĠĠĠĠĠ Ġval Ġmin L Ġ= Ġlengths . min OrNull () !! ĊĠĠĠĠĠĠĠ Ġpipeline . intercept ( Application Call Pipeline . Call ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġcall . request . path (). trim ('/') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( path . length Ġ> Ġmax L Ġ|| Ġpath . length Ġ< Ġmin L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ intercept ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcheck Ġ= Ġchecks [ path ] Ġ?: Ġreturn @ intercept ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( status , Ġjson ) Ġ= Ġhealth Check ( check ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond Text ( json , ĠContentType . Application . Json , Ġstatus ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠConfiguration Ġinternal Ġconstructor () Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġchecks : ĠMutable Map < String , ĠCheck Map > Ġ= Ġmutable Map Of () ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġno Live Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġno Ready Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġget Check sWith Functions () Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchecks . map Values Ġ{ Ġ(_, Ġv ) Ġ-> Ġv . to Function () Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġensure Disable Un amb iguous ( url : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchecks [ url ]?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAssertionError ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Cannot Ġdisable Ġa Ġcheck Ġwhich Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" has Ġbeen Ġassigned Ġfunctions " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCalling Ġthis Ġdisables Ġthe Ġdefault Ġlive Ġcheck Ġon Ġ/ li ven ess ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġdisable Live Check () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġno Live Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġensure Disable Un amb iguous ( LI VE _ CHECK _ URL ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCalling Ġthis Ġdisabled Ġthe Ġdefault Ġready Ġcheck Ġon Ġ/ read iness ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġdisable Ready Check () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġno Ready Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġensure Disable Un amb iguous ( READY _ CHECK _ URL ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠAdds Ġa Ġcheck Ġfunction Ġto Ġa Ġcustom Ġcheck Ġliving Ġat Ġthe Ġspecified ĠURL ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġadd Check To Url ( url : ĠString , Ġname : ĠString , Ġcheck : ĠCheck ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġurl Check : ĠCheck Map Ġ= Ġchecks . get Or Put ( normalize URL ( url ), Ġ{ Ġmutable Map Of () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġurl Check [ name ] Ġ= Ġcheck ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠAdd Ġa Ġhealth Ġcheck Ġgiving Ġit Ġa Ġname ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġlive Check ( name : ĠString , Ġcheck : ĠCheck ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Check To Url ( LI VE _ CHECK _ URL , Ġname , Ġcheck ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠAdd Ġa Ġready Ġcheck Ġgiving Ġit Ġa Ġname ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġready Check ( name : ĠString , Ġcheck : ĠCheck ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Check To Url ( READY _ CHECK _ URL , Ġname , Ġcheck ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġensure Well Known () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! no Live ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchecks [ READY _ CHECK _ URL ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! no Ready ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchecks [ LI VE _ CHECK _ URL ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject ĠFeature Ġ: ĠApplication Feature < Application Call Pipeline , ĠConfiguration , ĠHealth > Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġkey Ġ= ĠAttribute Key < Health >(" Health ") ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinstall ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline : ĠApplication Call Pipeline , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfigure : ĠConfiguration . () Ġ-> ĠUnit ĊĠĠĠĠĠĠĠ Ġ) Ġ= ĠHealth ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConfiguration () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply ( configure ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ Ġensure Well Known () Ġ} ĊĠĠĠĠĠĠĠ Ġ). apply Ġ{ Ġadd Interceptor ( pipeline ) Ġ} ĊĠĠĠ Ġ} Ċ } Ċ