[{"data":1,"prerenderedAt":188},["ShallowReactive",2],{"docs-\u002Fdocs\u002Fhow-it-works\u002Finternals":3,"docs-navigation":113},{"id":4,"title":5,"body":6,"description":104,"extension":105,"meta":106,"navTitle":107,"navigation":108,"path":109,"seo":110,"stem":111,"__hash__":112},"docs\u002Fdocs\u002F2.how-it-works\u002F2.internals.md","How it's built internally",{"type":7,"value":8,"toc":100},"minimark",[9,13],[10,11,12],"p",{},"For anyone evaluating this beyond the quick start:",[14,15,16,41,55,69,79,85],"ul",{},[17,18,19,23,24,28,29,32,33,36,37,40],"li",{},[20,21,22],"strong",{},"Ingestion"," is entirely in-process: an ",[25,26,27],"code",{},"ILoggerProvider",", an\n",[25,30,31],{},"ActivityListener",", and a ",[25,34,35],{},"MeterListener",", each writing into a bounded\nper-signal ",[25,38,39],{},"Channel\u003CT>"," (capacity 20,000, drop-on-full). A single hosted\nservice drains all three, batches writes (up to 500 records or every\nsecond, whichever comes first), and persists them.",[17,42,43,46,47,50,51,54],{},[20,44,45],{},"Storage"," is a thin interface (",[25,48,49],{},"INafasIngestionWriter","\u002F\n",[25,52,53],{},"INafasQueryStore",") with two concrete implementations, SQLite and SQL\nServer. No ORM, parameterized SQL, schema created and migrated at\nstartup.",[17,56,57,60,61,64,65,68],{},[20,58,59],{},"Alert evaluation"," (",[25,62,63],{},"NafasAlertEvaluationHostedService",") is a polling\n",[25,66,67],{},"BackgroundService"," reusing the same query layer the dashboard's KPI\nviews use, tracking one open-incident-per-rule at a time.",[17,70,71,74,75,78],{},[20,72,73],{},"Real-time delivery"," to the browser is an in-process pub\u002Fsub\n(",[25,76,77],{},"NafasLiveFeed",") fed by the ingestion writer and alert evaluator, read\nby the dashboard's SSE endpoints. Nothing here is a polling query.",[17,80,81,84],{},[20,82,83],{},"The dashboard UI"," is a Vue 3 + Vite SPA (PrimeVue, Pinia, Chart.js,\nvue-i18n for English\u002FPersian), built ahead of time and embedded directly\ninto the assembly as embedded resources. A consumer installing the\npackage gets the whole UI with no separate static-file deployment step,\nand no Node.js runtime on the host machine.",[17,86,87,88,91,92,95,96,99],{},"The whole API surface is a small hand-rolled router rather than ASP.NET\nCore's ",[25,89,90],{},"IEndpointRouteBuilder",", because endpoint routing has been\n",[25,93,94],{},"FrameworkReference","-only since ASP.NET Core 3.0 and is unavailable to a\n",[25,97,98],{},"netstandard2.x"," class library.",{"title":101,"searchDepth":102,"depth":102,"links":103},"",2,[],"A tour of the internals for anyone evaluating Nafas beyond the quick start.","md",{},"Internals",true,"\u002Fdocs\u002Fhow-it-works\u002Finternals",{"title":5,"description":104},"docs\u002F2.how-it-works\u002F2.internals","JTrrrTIwvoDfOPg0pwIEDh5OeLJaQafEdviW6IAha8E",[114],{"title":115,"path":116,"stem":117,"children":118},"Docs","\u002Fdocs","docs",[119,122,140,150,163,176,184],{"title":120,"path":116,"stem":121},"Documentation","docs\u002Findex",{"title":123,"path":124,"stem":125,"children":126,"page":139},"Getting Started","\u002Fdocs\u002Fgetting-started","docs\u002F1.getting-started",[127,131,135],{"title":128,"path":129,"stem":130},"Why Nafas","\u002Fdocs\u002Fgetting-started\u002Fwhy-nafas","docs\u002F1.getting-started\u002F1.why-nafas",{"title":132,"path":133,"stem":134},"Quick start","\u002Fdocs\u002Fgetting-started\u002Fquick-start","docs\u002F1.getting-started\u002F2.quick-start",{"title":136,"path":137,"stem":138},"Requirements","\u002Fdocs\u002Fgetting-started\u002Frequirements","docs\u002F1.getting-started\u002F3.requirements",false,{"title":141,"path":142,"stem":143,"children":144,"page":139},"How It Works","\u002Fdocs\u002Fhow-it-works","docs\u002F2.how-it-works",[145,149],{"title":146,"path":147,"stem":148},"What gets captured, and how","\u002Fdocs\u002Fhow-it-works\u002Fwhat-gets-captured","docs\u002F2.how-it-works\u002F1.what-gets-captured",{"title":5,"path":109,"stem":111},{"title":151,"path":152,"stem":153,"children":154,"page":139},"Configuration","\u002Fdocs\u002Fconfiguration","docs\u002F3.configuration",[155,159],{"title":156,"path":157,"stem":158},"Configuration options","\u002Fdocs\u002Fconfiguration\u002Foptions","docs\u002F3.configuration\u002F1.options",{"title":160,"path":161,"stem":162},"Security","\u002Fdocs\u002Fconfiguration\u002Fsecurity","docs\u002F3.configuration\u002F2.security",{"title":164,"path":165,"stem":166,"children":167,"page":139},"Deployment","\u002Fdocs\u002Fdeployment","docs\u002F4.deployment",[168,172],{"title":169,"path":170,"stem":171},"Multi-instance deployments","\u002Fdocs\u002Fdeployment\u002Fmulti-instance","docs\u002F4.deployment\u002F1.multi-instance",{"title":173,"path":174,"stem":175},"Desktop and other non-ASP.NET Core apps","\u002Fdocs\u002Fdeployment\u002Fdesktop-apps","docs\u002F4.deployment\u002F2.desktop-apps",{"title":177,"path":178,"stem":179,"children":180,"page":139},"Alerting","\u002Fdocs\u002Falerting","docs\u002F5.alerting",[181],{"title":177,"path":182,"stem":183},"\u002Fdocs\u002Falerting\u002Falert-rules","docs\u002F5.alerting\u002F1.alert-rules",{"title":185,"path":186,"stem":187},"Contributing","\u002Fdocs\u002Fcontributing","docs\u002F6.contributing",1789842022089]