Rydym yn defnyddio pensaernïaeth microwasanaeth yn ein prosiectau. Pan fydd tagfeydd perfformiad yn digwydd, treulir llawer o amser yn monitro a dosrannu boncyffion. Wrth gofnodi amseriadau gweithrediadau unigol i ffeil log, fel arfer mae'n anodd deall beth a arweiniodd at alw'r gweithrediadau hyn, i olrhain dilyniant y gweithredoedd neu newid amser un llawdriniaeth o'i gymharu â'r llall mewn gwahanol wasanaethau.
Er mwyn lleihau llafur llaw, penderfynasom ddefnyddio un o'r offer olrhain. Ynglŷn â sut a pham y gallwch ddefnyddio olrhain a sut y gwnaethom hynny, a bydd yn cael ei drafod yn yr erthygl hon.
Pa broblemau y gellir eu datrys gydag olrhain
Dod o hyd i dagfeydd perfformiad o fewn un gwasanaeth ac yn y goeden weithredu gyfan rhwng yr holl wasanaethau sy'n cymryd rhan. Er enghraifft:
Llawer o alwadau dilynol byr rhwng gwasanaethau, er enghraifft, i geogodio neu i gronfa ddata.
Arosiadau I/O hir, fel trosglwyddiadau rhwydwaith neu ddarlleniadau disg.
Dosrannu data hir.
Llawdriniaethau hir sy'n gofyn am cpu.
Adrannau o god nad oes eu hangen i gael y canlyniad terfynol ac y gellir eu dileu neu eu gohirio.
Deall yn glir ym mha ddilyniant yr hyn a elwir a beth sy'n digwydd pan gyflawnir y llawdriniaeth.
Gellir gweld, er enghraifft, bod y Cais wedi dod i'r gwasanaeth WS -> fe wnaeth y gwasanaeth WS ategu'r data trwy'r gwasanaeth R -> yna anfon cais at y gwasanaeth V -> llwythodd y gwasanaeth V lawer o ddata o'r Gwasanaeth R -> aeth i'r gwasanaeth P -> aeth y gwasanaeth P eto i wasanaeth R -> anwybyddodd gwasanaeth V y canlyniad ac aeth i wasanaeth J -> a dim ond wedyn dychwelodd yr ymateb i wasanaeth WS, wrth barhau i gyfrifo rhywbeth arall yn y cefndir.
Heb olion o'r fath neu ddogfennaeth fanwl ar gyfer y broses gyfan, mae'n anodd iawn deall beth sy'n digwydd wrth edrych ar y cod am y tro cyntaf, ac mae'r cod wedi'i wasgaru ar draws gwahanol wasanaethau ac wedi'i guddio y tu ôl i griw o finiau a rhyngwynebau.
Casglu gwybodaeth am y goeden ddienyddio ar gyfer dadansoddiad gohiriedig dilynol. Ar bob cam gweithredu, gallwch ychwanegu gwybodaeth at yr olrhain sydd ar gael ar y cam hwn ac yna darganfod pa ddata mewnbwn a arweiniodd at senario tebyg. Er enghraifft:
ID Defnyddiwr
Hawliau
Math o ddull a ddewiswyd
Log neu wall gweithredu
Troi olion yn is-set o fetrigau a dadansoddiad pellach sydd eisoes ar ffurf metrigau.
Pa olion all logio. Rhychwant
Wrth olrhain mae cysyniad rhychwant, mae hwn yn analog o un log, i'r consol. Mae gan y sba:
Enw, fel arfer enw y dull a weithredwyd
Enw'r gwasanaeth y cynhyrchwyd y rhychwant ynddo
ID unigryw eich hun
Rhyw fath o wybodaeth feta ar ffurf allwedd/gwerth sydd wedi'i logio i mewn iddo. Er enghraifft, paramedrau dull neu'r dull a ddaeth i ben gyda gwall neu beidio
Amseroedd dechrau a gorffen ar gyfer y rhychwant hwn
ID rhychwant rhiant
Anfonir pob rhychwant at y casglwr rhychwant i'w storio yn y gronfa ddata i'w adolygu'n ddiweddarach cyn gynted ag y bydd wedi cwblhau ei weithredu. Yn y dyfodol, gallwch chi adeiladu coeden o bob rhychwant trwy gysylltu trwy ID rhiant. Wrth ddadansoddi, gallwch ddod o hyd, er enghraifft, yr holl rhychwantau mewn rhai gwasanaethau a gymerodd fwy na pheth amser. Ymhellach, trwy fynd i rychwant penodol, gweler y goeden gyfan uwchben ac o dan y rhychwant hwn.
Opentrace, Jagger a sut y gwnaethom ei roi ar waith ar gyfer ein prosiectau
Mae safon gyffredin llwybr agored, sy'n disgrifio sut a beth y dylid ei gasglu, heb gael ei glymu trwy olrhain i weithrediad penodol mewn unrhyw iaith. Er enghraifft, yn Java, mae'r holl waith gydag olion yn cael ei wneud trwy'r API Opentrace cyffredin, ac oddi tano, er enghraifft, gellir cuddio Jaeger neu weithrediad diofyn gwag nad yw'n gwneud dim.
Rydym yn defnyddio Jaeger fel gweithrediad Opentrace. Mae'n cynnwys sawl cydran:
Mae Jaeger-agent yn asiant lleol sydd fel arfer yn cael ei osod ar bob peiriant ac mae gwasanaethau'n cael eu mewngofnodi iddo ar y porthladd rhagosodedig lleol. Os nad oes asiant, yna mae olion yr holl wasanaethau ar y peiriant hwn fel arfer yn anabl
Jaeger-collector - mae pob asiant yn anfon olion a gasglwyd ato, ac mae'n eu rhoi yn y gronfa ddata a ddewiswyd
Y gronfa ddata yw eu cassandra dewisol, ond rydym yn defnyddio elasticsearch, mae yna weithrediadau ar gyfer cwpl o gronfeydd data eraill a gweithrediad er cof nad yw'n arbed unrhyw beth i ddisg
Mae Jaeger-query yn wasanaeth sy'n mynd i'r gronfa ddata ac yn dychwelyd olion a gasglwyd eisoes i'w dadansoddi
Mae Jaeger-ui yn rhyngwyneb gwe ar gyfer chwilio a gweld olion, mae'n mynd i jaeger-query
Gellir galw cydran ar wahân yn gweithredu jaeger opentrace ar gyfer ieithoedd penodol, a thrwy hynny anfonir rhychwantau at jaeger-agent. Cysylltu Jagger yn Java yn dod i lawr i weithredu'r rhyngwyneb io.opentracing.Tracer, ac ar ôl hynny bydd yr holl olion drwyddo yn hedfan i'r asiant go iawn.
Hefyd ar gyfer cydran y gwanwyn, gallwch chi gysylltu opentracing-spring-cloud-starter a gweithredu gan Jaeger opentracing-spring-jaeger-cloud-starter a fydd yn ffurfweddu olrhain yn awtomatig ar gyfer popeth sy'n mynd trwy'r cydrannau hyn, er enghraifft ceisiadau http i reolwyr, ceisiadau i'r gronfa ddata trwy jdbc, ac ati.
Olion mewngofnodi i Java
Yn rhywle ar y lefel uchaf, rhaid creu'r Rhychwant gyntaf, gellir gwneud hyn yn awtomatig, er enghraifft, gan reolwr y gwanwyn pan dderbynnir cais, neu â llaw os nad oes un. Yna caiff ei drosglwyddo trwy'r Cwmpas isod. Os yw unrhyw un o'r dulliau isod eisiau ychwanegu Rhychwant, mae'n cymryd y rhychwant gweithredol cyfredol o'r Cwmpas, yn creu Rhychwant newydd ac yn dweud mai ei riant yw'r rhychwant gweithredol sy'n deillio o hynny, ac mae'n gwneud y Rhychwant newydd yn weithredol. Wrth alw gwasanaethau allanol, trosglwyddir y rhychwant gweithredol presennol iddynt, ac mae'r gwasanaethau hynny'n creu rhychwantau newydd gan gyfeirio at y rhychwant hwn.
Mae'r holl waith yn mynd trwy enghraifft Tracer, gallwch ei gael trwy'r mecanwaith DI, neu GlobalTracer.get () fel newidyn byd-eang os nad yw'r mecanwaith DI yn gweithio. Yn ddiofyn, os nad yw olrhain wedi'i gychwyn, bydd NoopTracer yn dychwelyd nad yw'n gwneud dim.
Ymhellach, ceir y cwmpas presennol o'r olrhain trwy'r ScopeManager, crëir cwmpas newydd o'r un presennol gyda rhwymiad o'r rhychwant newydd, ac yna mae'r Cwmpas a grëwyd ar gau, sy'n cau'r rhychwant a grëwyd ac yn dychwelyd y Cwmpas blaenorol i y cyflwr gweithredol. Mae cwmpas yn gysylltiedig ag edefyn, felly wrth raglennu aml-edau, rhaid i chi beidio ag anghofio trosglwyddo'r rhychwant gweithredol i edefyn arall, er mwyn actifadu Cwmpas edefyn arall ymhellach gan gyfeirio at y rhychwant hwn.
Ar gyfer rhaglennu aml-edau, mae hefyd TracedExecutorService a deunydd lapio tebyg sy'n anfon y rhychwant presennol yn awtomatig i'r edefyn pan fydd tasgau asyncronig yn cael eu lansio:
private ExecutorService executor = new TracedExecutorService(
Executors.newFixedThreadPool(10), GlobalTracer.get()
);
HttpClient httpClient = new TracingHttpClientBuilder().build();
Problemau a wynebwyd gennym
Nid yw ffa a DI bob amser yn gweithio os na ddefnyddir yr olrheiniwr mewn gwasanaeth neu gydran, felly Autowired Efallai na fydd Tracer yn gweithio a bydd yn rhaid i chi ddefnyddio GlobalTracer.get().
Nid yw anodiadau yn gweithio os nad yw yn gydran neu yn wasanaeth, neu os gelwir y dull o ddull cyfagos o'r un dosbarth. Mae'n rhaid i chi fod yn ofalus i wirio beth sy'n gweithio a defnyddio creu olrhain â llaw os nad yw @Traced yn gweithio. Gallwch hefyd atodi casglwr ychwanegol ar gyfer anodiadau java, yna dylent weithio ym mhobman.
Ceisiwch gydag adnoddau nad yw'n gweithio mewn grwfi, rhaid i chi ddefnyddio ceisiwch yn olaf.
Rhaid i bob gwasanaeth fod â'i enw spring.application.enw ei hun a bydd olion yn cael eu cofnodi oddi tano. Beth mae enw ar wahân ar gyfer y gwerthiant a'r prawf, er mwyn peidio ag ymyrryd â nhw gyda'i gilydd.
Os ydych chi'n defnyddio GlobalTracer a tomcat, yna mae gan bob gwasanaeth sy'n rhedeg yn y tomcat hwn un GlobalTracer, felly bydd ganddyn nhw i gyd yr un enw gwasanaeth.
Wrth ychwanegu olion i ddull, mae angen i chi fod yn siŵr na chaiff ei alw'n aml yn ddolen. Mae angen ychwanegu un olrhain cyffredin ar gyfer pob galwad, sy'n gwarantu cyfanswm yr amser gwaith. Fel arall, bydd llwyth gormodol yn cael ei greu.
Unwaith yn jaeger-ui, gwnaed ceisiadau rhy fawr am nifer fawr o olion, a chan nad oeddent yn aros am ymateb, fe wnaethant hynny eto. O ganlyniad, dechreuodd jaeger-query fwyta llawer o gof ac arafu elastig. Wedi'i helpu trwy ailgychwyn jaeger-query
Tebygol sy'n hidlo olion gyda pheth tebygolrwydd penodol.
Cyfraddiadau sy'n cyfyngu ar nifer yr olion yr eiliad. Gallwch chi ffurfweddu'r gosodiadau hyn ar y cleient, naill ai ar yr jaeger-agent neu ar y casglwr. Nawr rydyn ni'n defnyddio const 1 yn y pentwr prisio, gan nad oes llawer iawn o geisiadau, ond maen nhw'n cymryd amser hir. Yn y dyfodol, os bydd hyn yn rhoi llwyth gormodol ar y system, gallwch ei gyfyngu.
Os ydych chi'n defnyddio cassandra, yna yn ddiofyn dim ond am ddau ddiwrnod y mae'n storio olion. Rydym yn defnyddio elasticsearch ac mae olion yn cael eu storio am byth ac nid ydynt yn cael eu dileu. Mae mynegai ar wahân yn cael ei greu ar gyfer pob diwrnod, er enghraifft jaeger-service-2019-03-04. Yn y dyfodol, mae angen i chi ffurfweddu glanhau awtomatig o hen olion.
Er mwyn gweld yr olion mae angen:
Dewiswch y gwasanaeth rydych chi am hidlo olion ynddo, er enghraifft, tomcat7-default ar gyfer gwasanaeth sy'n rhedeg yn y tomcat ac na all gael ei enw ei hun.
Yna dewiswch y llawdriniaeth, yr egwyl amser a'r amser gweithredu lleiaf, er enghraifft o 10 eiliad, i gymryd dim ond dienyddiadau hir.
Ewch i un o'r olion a gweld beth oedd yn arafu yno.
Hefyd, os yw rhywfaint o ID cais yn hysbys, yna gallwch ddod o hyd i olrhain gan yr id hwn trwy chwiliad tag, os yw'r id hwn wedi'i gofnodi yn y rhychwant olrhain.