Slide 1

Slide 1 text

࣮࿥ʂ։ൃظؒ਺೥ͷ αʔϏεͷ׬੒ؒࡍʹ DPOUFYUରԠΛͿͪࠐΉ LBNBLVSBHP   !BDJEMFNPOɹ@

Slide 2

Slide 2 text

͜Μʹͪ͸ʙ w ໘ന๏ਓΧϠοΫιʔγϟϧήʔϜࣄۀ෦
 ήʔϜٕݚϦʔμʔ
 ֤ϓϩδΣΫτΛԣஅͰαϙʔτ͢ΔνʔϜ  w ීஈ͸ओʹ(Pॻ͍ͨΓ1FSMॻ͍ͨΓ
 ௚ۙ͸$Λॻ͍͍ͯΔ 6OJUZ 
 &NBDT೿͚ͩͬͨͲ࠷ۙ74$PEF࢖ͬͯΔ w ח૔ࡏॅ Ո͔Β͜ͷձ৔·Ͱెา෼ !BDJEMFNPO

Slide 3

Slide 3 text

ࣄͷ࢝·Γ w ͋Β͢͡ w ɹɹɹΑ͍ͭ͠΋ͷΑ͏ʹෛՙࢼݧ͢Δͧ w ɹɹɹ"8493BZͰ෼ࢄτϨʔγϯάͩ ਺೥͔͚ͯ։ൃͨ͠(PͷαʔόϓϩάϥϜ͕ͦΖͦΖ
 αʔϏεΠϯ͢Δ͜ͱʹΊͰ͍ͨͰ͢Ͷʙ

Slide 4

Slide 4 text

93BZͰ෼ࢄτϨʔγϯά w ૊௕ !GVKJXBSB ͷ:"1$5PLZPͷൃදͳͲͰ͓ͳ͡Έ IUUQTTQFBLFSEFDLDPNGVKJXBSBZBQDUPLZP  w ΧϠοΫͰ͸ࡢ೥͔Βෛՙࢼݧ΍ຊ൪؀ڥͷௐࠪʹ"8493BZΛ ར༻͍ͯ͠Δ w ૊௕͕࠷ॳʹೖΕͨࣄྫ͸1FSM͕ͩͬͨɺࠓճ͸(PϓϩμΫτ
 (PͳΒ"84͕4%,Λग़͍ͯ͠ΔͷͰࣗલͰϥΠϒϥϦ࡞ΔΈ͍ͨ ͳ͜ͱ͠ͳͯ͘΋େৎ෉͜Ε͸উͬͨͳʜʜ ϑϥάͷཱͭԻ

Slide 5

Slide 5 text

93BZ͸ԿΛ͢Δ͔ w 8FCαʔϏεʹ͓͚Δ͔͔࣌ؒΔཁૉͷՄࢹԽ w جຊతʹ֎෦*0 σʔλϕʔεɺ,74ɺ)551ͳͲʜ ͕͔࣌ؒ ͔Δॲཧ w ηάϝϯτΛ࡞ͬͯ։࢝࣌ؒͱ
 ऴྃ࣌ؒɺΤϥʔͳͲΛه࿥ͯ͠ૹΔ w "84͞ΜʹૹΓ͚ͭΔͱ͍͍ײ͡ʹ
 ՄࢹԽͯ͘͠ΕΔˠ͜Μͳײ͡ˠ

Slide 6

Slide 6 text

93BZ4%,GPS(Pͷ৔߹ DPOUFYUͷҾ͖ճ͠Ͱ࣮ݱ

Slide 7

Slide 7 text

͜Μͳײ͡ w YSBZ$BQUVSFʹDUYͱ࣮ߦ͍ͨ͠ॲཧΛแΜͩؔ਺Λ౉͢ͱɺ $BQUVSF͕։࢝࣌ࠁͱऴྃ࣌ࠁΛDUYʹه࿥ͯ͘͠ΕΔ
 93BZ)551ΫϥΠΞϯτͳͲ͸಺෦Ͱ͜ΕΛ΍͍ͬͯΔ func criticalSection(ctx context.Context) { //this is an example of a subsegment xray.Capture(ctx, "GameModel.saveGame", func(ctx1 context.Context) error { var err error section.Lock() result := someLockedResource.Go() section.Unlock() xray.AddMetadata(ctx1, "ResourceResult", result) }) } IUUQTEPDTBXTBNB[PODPNKB@KQYSBZMBUFTUEFWHVJEFYSBZTELHPTVCTFHNFOUTIUNM

Slide 8

Slide 8 text

ͳΔ΄Ͳʜ w 93BZ4%,GPS(PΛ࢖͏ʹ͸DPOUFYU$POUFYU͕ඞཁ w ͜ͷϓϩδΣΫτ͸DPOUFYUᴈ໌ظʹ։ൃ͕ελʔτͨ͠ͷͰɺ%# ΞΫηε΍3FEJTૢ࡞ͷ෦෼ʹDPOUFYUΛར༻͍ͯ͠ͳ͍ w ϦϑΝΫλϦϯάͯ͠DPOUFYUΛҾ͖ճ͍ͯ͘͠ඞཁ͕͋Δͳʜ

Slide 9

Slide 9 text

DPOUFYUҾ͖ճ͠ϦϑΝΫλ w 3FEJT w SFEJHPΛར༻͍ͯͯ͠ɺࣗલͷ3FEJT$MJFOUͰXSBQ͍ͯͨ͠ ͷͰͦͷҾ਺ʹDPOUFYU$POUFYUΛ௥Ճ
 SFEJHP͸3FEJT$MVTUFSඇରԠͳͷͰޙʹHPSFEJTʹೖΕସ͑ͨ  w 3FEJTͷ13 — w 'MVFOU-PHHFS w ͜Ε΋ࣗલͰXSBQͯͨ͠ͷͰҾ਺ʹDPOUFYU$POUFYUΛ௥Ճ w 'MVFOU-PHHFSͷ13 —

Slide 10

Slide 10 text

ͦͷ΄͔ w )551ϦΫΤετ w ֎෦಺෦ؔ܎ͳ͘93BZ4%,ͷ)551$MJFOUʹࠩ͠ସ͑ w "84ͷ֤छαʔϏε w 4244$MPVE4FBSDIͳͲͳͲ͸93BZ4%,ͰXSBQ ͯ͠ద༻Ͱ͖ΔΑ͏ʹͳ͍ͬͯΔ w ͜ͷลΛϞϩϞϩద༻ͯ͠ —

Slide 11

Slide 11 text

͜͜·Ͱ͸!LPOCPJͷ࢓ࣄ ϝϧϖΠʹస৬͍ͯͬͯ͠͠·ͬͨʜ

Slide 12

Slide 12 text

Ұ൪෺ྔ͋Γͦ͏ͳ %#ΞΫηεͷͱ͜Ζ͕ ·ͩ࢒͍ͬͯΔ

Slide 13

Slide 13 text

ਓൈ͚ͯϓϩδΣΫτଆ͸େ๩͠ Θͨ͠ͷग़൪ͩ@

Slide 14

Slide 14 text

%#ΞΫηεͷDPOUFYUରԠ w HPSN HJUIVCDPNKJO[IVHPSN Λར༻ͯͨ͠ w ͦ΋ͦ΋HPSN͕DPOUFYUରԠ͍ͯ͠ͳ͍ w W@EFWϒϥϯνͰDPOUFYUରԠ։ൃͯ͠Δ͚Ͳఀ଺த w ʜͱ͸͍͑93BZ࢖͏ͷʹ%#ΞΫηεݟΒΕͳ͍ͷ͸ࠔΔ w ͍Ζ͍Ζௐࠪͯ͠Έͨ

Slide 15

Slide 15 text

93BZ4%,͕༻ҙͯ͠Δ΋ͷ w 42-ͷτϨʔεʹ͍ͭͯͷυΩϡϝϯτ͕৴͡ΒΕͳ͍͘Β͍ബ͍ w ΄Μͱʹ͜Ε͔͠ॻ͍ͯͳ͍

Slide 16

Slide 16 text

93BZ4%,͕༻ҙͯ͠Δ΋ͷ w ॻ͍ͯ͋Δ͜ͱʮ͓·͑ΒͨͿΜsql.OpenͰ%#ϓʔϧ࡞ͬͯΔ Αͳ ͦΕΛxray.SQLʹ͢Ε͹͍͍͚ͩͩͥʯ w ͳΔ΄Ͳ΍ͬͯΈͨˠίϯύΠϧΤϥʔ w γάωνϟΛ֬ೝˠ໭Γ஋TRM%#͡Όͳͯ͘YSBZ%#ͩʜ package xray func SQL(driver, dsn string) (*DB, error)

Slide 17

Slide 17 text

YSBZ%#ͩ w HPSN͸42-$PNNPOͱ͍͏TRM%#ͷίϯςΩετͳ͠ϝιο υΛΠϯλϑΣʔεԽ͍ͯ͠Δ w YSBZ%#͸શ෦DUY෇͖ͰTRM%#ͷDUYϝιουΛ࣮૷͍ͯ͠Δ w ͭ·ΓΠϯλϑΣʔε͕ద߹͠ͳ͍ʜ type SQLCommon interface { Exec(query string, args ...interface{}) (sql.Result, error) Prepare(query string) (*sql.Stmt, error) Query(query string, args ...interface{}) (*sql.Rows, error) QueryRow(query string, args ...interface{}) *sql.Row } package xray func (db *DB) Exec(ctx context.Context, query string, args ...interface{}) (sql.Result, error) func (db *DB) Prepare(ctx context.Context, query string) (*Stmt, error) func (db *DB) Query(ctx context.Context, query string, args ...interface{}) (*sql.Rows, error) func (db *DB) QueryRow(ctx context.Context, query string, args ...interface{}) *sql.Row HPSN YSBZ

Slide 18

Slide 18 text

ཧ૝ͱݱ࣮ w HPSNʹ౉͢TRM%#తͳԿ͔ʹࡉ޻Λͯ͠ɺHPSNΛXSBQͨ͠ϓ ϩδΣΫτͷ%#ΞΫηεΦϒδΣΫτ͔ΒͦͷDUYΛ஫ೖ͍ͨ͠ w ͱʹ͔͍͘Ζ͍Ζ΍ͬͯΈ·͕ͨ͠ɺͰ͖·ͤΜͰͨ͠
 HPSN͕DPOUFYUରԠͯ͠ͳ͍ͷͰҾ͖ճ͕͠HPSNͰ෼அ͞Εͯ ͠·ͬͯ౉ͤͳ͍ʜΧελϜύϥϝʔλΛ౉͢ํ๏΋༻ҙ͞Εͯͳ͍
 &YFD2VFSZͷBSHTͷ࠷ॳʹDUY౉ͯ͠ϥούʔ͕෼཭͢Δࠇຐ๏Έ͍ͨͳ΍ͭ΋ࢼ͚ͨ͠Ͳͪΐͬͱແཧ͕͋ͬͨ
 ͋ͱɺTUSVDUͷϝϯόʹDUY࣋ͨͤΔํࣜ͸TRM%#΍HPSN͕දݱ͢Δ΋ͷ͸ίωΫγϣϯϓʔϧͰ͋ͬͯίωΫγϣϯ Ͱ͸ͳ͍ʜͱ͍͏͜ͱ͔ΒHPSPVUJOFTBGFʹͳΒͳ͍ͷͰ΍ͬͯ͸͍͚ͳ͍Ϡπ

Slide 19

Slide 19 text

ଥڠͨ͠ํ਑ w %#ΞΫηε෦෼͕DPOUFYUରԠͯ͠ྫ͑͹EFBEMJOFͱ͔DBODFM ͰΫΤϦதஅͰ͖ΔΑ͏ʹ͢Δͷ͸ʜఘΊΔ w HPSNΛXSBQͨ͠΋ͷΛ࡞ͬͯDUY͕౉ΔΑ͏ʹͯ͠ɺ93BZͷ $BQUVSF͚ͩ͸ͪΌΜͱ͢Δ

Slide 20

Slide 20 text

(PSNͷϥούΛ࡞ͬͯ࢓ࠐΉ w ಋೖखॱͱͯ͠͸͜Μͳ͔Μ͡ HPSN%#ͷϝιουͷ͏ͪ࢖ͬͯΔ΍ͭΛશ෦ಉ͡γάωνϟ Ͱఆٛͯ͠ɺ·ͣ͸ίϯύΠϧΛ௨͢ த਎͸HPSNΛݺͿ͚ͩ  ࣍ʹϥούͷୈҰҾ਺ʹશ෦ctx context.ContextΛ௥Ճ͢Δ (PSNΛݺͼग़ͯ͠Δ෦෼Ͱຊ౰ʹେྔͷίϯύΠϧΤϥʔ͕Ͱ ΔͷͰɺͦΕΛશ෦௚͢ 93BZͷ$BQUVSFΛϥούʔʹ࢓ࠐΉ w ͱʹ͔͕͘େมͳ΍ͭͰ͢

Slide 21

Slide 21 text

࣮ࡍͷ࡞ۀ

Slide 22

Slide 22 text

ࣗಈੜ੒ܥͷରԠ w ϦϦʔε௚લͷ͍·DUYೖΕͳ͔ͬͨΒ͍ΘΏΔٕज़తෛ࠴͕υΧʔϯͱͳ ΔΑͶʜΈ͍ͨͳ͜ͱΛ13ίϝϯτʹॻ͍͍ͯͨ w ࣗಈੜ੒ܥ͸େͨۤ͠࿑ͯ͠ͳ͍͚ͲɺEJGG͸  — 

Slide 23

Slide 23 text

࢒Γͷ࡞ۀ w ͱʹ͔͘%#ݺͼग़͕͠େྔʹ͋ΔͷͰςΩετஔ׵ͳͲ΋ۦ࢖ͭͭ͠ ͣͬͱϦϑΝΫλϦϯάͯ͠ςετΛճ͍ͯͨ͠ w ౰࣌ͷϝϞʹΑΔͱɺ$SFBUF%FMFUF&YFD'JOE'JSTU 3BX4BWFͷछͷϝιου͕߹ܭՕॴͰݺ͹Ε͍ͯΔ w Օॴશ෦खͰ௚ͯ͠ɺ͞Βʹݺͼग़͠ݩ͕DUY࣋ͬͯͳ͔ͬͨ Βͦ͜·ͰDUYΛҾ͖ճͨ͢Ίʹݺͼग़͠ݩΛ૎ͬͯDUY͕ग़ͯ͘Δ· ͰୈҰҾ਺ʹDUY௥Ճ͢Δ࡞ۀ w ͞Βʹɺςετ΋શ෦context.Background()ͯ͠౉͢࡞ۀ͕ඞཁ

Slide 24

Slide 24 text

్தܦաͷ༷ࢠ w ҙ֎ͱͭΒ͘ͳͦ͞͏ʹݟ͑Δͷ͸ɺࣗ෼͕ϦϑΝΫλϦϯάେ޷͖ ਓ͔ؒͩΒ ๨೥ձ͔Βؼ͖ͬͯͯਲͬ෷͍ͳ͕ΒϦϑΝΫλϦϯά͢Δఔ౓ʹ͸େ޷͖

Slide 25

Slide 25 text

िؒ൒͔͔ͬͯແࣄ׬ྃ w HPSNΛXSBQ͢Δ࡞ۀͷຊਞϒϥϯν͸  —  w ͜ΕͰҰ൪͕͔͔࣌ؒΔͱ͜Ζ͸͓ΘͬͨͷͰɺ93BZͷ$BQUVSF Λ࢓ࠐΜͰ͍͘

Slide 26

Slide 26 text

ϥούʔʹ$BQUVSFΛ௥Ճ w 93BZͷ$BQUVSFΛͦΕͧΕͷϝιουͰ΍Δ w ͜ͷํࣜͰ͸HPSN͕࣮ࡍʹ࣮ߦ͢Δ42-ΛऔΓग़ͤͳ͍ͨΊɺ୅ΘΓ ʹݺͼग़͠ͷҾ਺ͱίʔϧελοΫΛه࿥ // Exec ͩΑ func (g *GormDB) Exec(ctx context.Context, sql string, values ...interface{}) *GormDB { if seg := xray.GetSegment(ctx); seg == nil { return g.wrap(g.db.Exec(sql, values...)) } var res *GormDB tmp := []interface{}{sql} tmp = append(tmp, values...) caller := traceCaller("Exec", tmp...) xray.Capture(ctx, g.name, func(ctx context.Context) error { g.recordSQL(ctx, caller) res = g.wrap(g.db.Exec(sql, values...)) return res.Error }) return res } 93BZະ࢖༻࣌ 93BZ࢖༻࣌

Slide 27

Slide 27 text

த਎ w ίʔϧελοΫͱ42-ͷBSHTΛه࿥ w ه࿥෦෼͸93BZ4%,ͷxray.DB.populate()Λࢀߟʹ func traceCaller(name string, args ...interface{}) string { pc, _, line, _ := runtime.Caller(2) f := runtime.FuncForPC(pc) return fmt.Sprintf("from %s(Line %d): %s(%s) ", f.Name(), line, name, argsString(args...)) } func (g *GormDB) recordSQL(ctx context.Context, info string) { seg := xray.GetSegment(ctx) typ := "master" if g.slave { typ = "slave" } seg.Lock() seg.Namespace = "remote" seg.GetSQL().ConnectionString = g.name seg.GetSQL().DatabaseType = typ seg.GetSQL().SanitizedQuery = info seg.Unlock() }

Slide 28

Slide 28 text

ແࣄ93BZରԠ׬ྃ w 93BZ4%,GPS(PͷYSBZ42-Λ࢖ͬͨͱ͖ͷΑ͏ʹ͸ߦ͔ͳ ͔͕ͬͨɺ࠷௿ݶ͔͔ͬͨ࣌ؒͱݺͼग़͍ͯ͠Δ৔ॴ಺༰͸Έ͑Δ Α͏ʹͳͬͨɻ͜ͷ13 — w ࠓ΋ແࣄຊ൪؀ڥͰ93BZͷτϨʔε͕ಈ͍͍ͯ·͢

Slide 29

Slide 29 text

DPOUFYUʹ͍ͭͯ ͦͷଞͷ࿩୊

Slide 30

Slide 30 text

ΫϥΠΞϯτ੾அʹΑΔDBODFM w ΫϥΠΞϯτཁҼͳͷͰཧ༝͸Θ͔Βͳ͍͚ͲɺεϚϗΞϓϦͰ͸ͨ ·ʹඵͱ͔ͰϦΫΤετΛΩϟϯηϧ͢ΔΫϥΠΞϯτ͕͍Δ w %#ίϛοτޙͷϩάॻ͍ͯΔͱ͖ʹΫϥΠΞϯτཁҼͷDPOUFYU DBODFM͕ൃੜ͢Δ͜ͱ͕͋ͬͯɺࠔΔ w IUUQ4FSWFS͔ΒΩϟϯηϧ͞Εͳ͍΄͏͕͏Ε͍͠

Slide 31

Slide 31 text

ΫϥΠΞϯτ੾அʹΑΔDBODFM w ͦ΋ͦ΋ႈ౳ͳ࡞Γͷ"1*ʹͳ͍ͬͯΕ͹ɺαʔόʹϦΫΤετ͕དྷ ͨΒΫϥΠΞϯτʹؔ܎ͳ͘૸Γ͖ͬͨ΄͏͕Α͍ w SFRSFR8JUI$POUFYU OFX$UY Ͱࠩ͠ସ͑Ͱ͖Δ w ϦΫΤετࣗମͷλΠϜΞ΢τ͸ඞཁͳͷͰɺSFRͷDUYΛܧঝͤͣ ʹDPOUFYU#BDLHSPVOE Ͱ৽͍͠ίϯςΩετΛ࡞ͬͯλΠϜ Ξ΢τΛઃఆ͢Δ w 4FSWFSΛ(SBDFGVMʹTIVUEPXO͢Δͷ͸ϦΫΤετλΠϜΞ ΢τ෼͘Β͍଴ͯ͹৽͍͠ϦΫΤετड͚෇͚ͳ͍ͷͰେৎ෉

Slide 32

Slide 32 text

·ͱΊ

Slide 33

Slide 33 text

·ͱΊײ૝ w ઌԆ͹͍ͯ͠͠Δͱޙ͔ΒϦϑΝΫλϦϯά͢Δίετ͕͍͢͝ࣄʹ ͳΔͷͰͬ͞͞ͱDPOUFYUରԠͨ͠΄͏͕Α͍ w ࠓ͔Β։ൃΛ࢝ΊΔͳΒɺ࢖͍ͬͯΔ%#03.΍3FEJTΞΫηεͳ Ͳͷύοέʔδ͸DPOUFYUରԠ͍ͯ͠Δ΋ͷΛબͿ΂͖
 ٕज़બఆͷ༏ઌ౓ͱ͔ͯ͠ͳΓߴ͍ͱ͜ΖʹҐஔ͚ͮΔ΂͖  w ઃܭํ਑ͱͯ͠ɺ ͨͱ͑ͦΕΛ࣮૷͢Δͱ͖͸࢖ͬͯͳͯ͘΋ ϩ δοΫతʹ֎෦ͷ*0͕͋Δ΋ͷ͸DPOUFYUΛ౉͓ͯ͘͠ͱΑ͍
 ͦ͏ͳΔͱ'MVFOUEͰϩάऔΔՄೳੑ͕͋Δͱ͜Ζ͸શ෦౉ͦ͏ʜͱͳΔ͚Ͳͦ͏͍͏΋Μͩ

Slide 34

Slide 34 text

ิ଍ ͕࣌ؒ͋Ε͹

Slide 35

Slide 35 text

ิ଍ w YSBZ42-ͱDPOUFYUඇରԠ03.ͷ૬ੑʹ͍ͭͯɺ13ʹϝϞ͕ ͋ΔͷͰͦΕΛҾ༻

Slide 36

Slide 36 text

ิ଍ ͖ͭͮ w HPSN͔Β࣮ߦ͢Δੜͷ42-ΛऔΓग़ͯ͠93BZʹه࿥Ͱ͖ͳ͍ཧ༝ w ิ଍͢ΔͱɺXSBQ͍ͯ͠ΔͷͰHPSNͷ࣮ମΛݺ͹ͳ͍ͱ8)&3&ͷ৚݅Λ૊Έཱ ͯͯ͘Εͳ͍ͷͰɺ࣮ମΛݺͿલʹه࿥Ͱ͖ͳ͍
 ࣮ମΛݺΜͩ͋ͱʹ஌Δํ๏͸ίʔϧόοΫͳΜ͚ͩͲͦΕʹDUY౉͢ํ๏͕ͳ͍ʜ