Share
Embed
my new error
sadnessOjisan
March 19, 2023
Transcript
43 slides
-
My New Error… It is my new era. 1 Nikkei
Inc. Yuta Ide(@sadnessOjisan) YAPC::Kyoto 2023 -
ࣗݾհ { “໊લ”: “Yuta Ide”, “ॴଐ”: “ຊܦࡁ৽ฉࣾ”, “ࣄ”: [“Frontend”, “CDN
Edge”, “BFF Server”] } 2 -
ࢲͱ Try Catch • 2022/10/01 - 2022/12/31 ͷ̏ϲ݄ؒɺΞϥʔτࢹͷࣄ ͚ͩΛ͢Δ •
ࢲͷνʔϜ̏̌ݸ͍ۙϨϙδτϦ͕Քಇ͍ͯ͠ΔϚΠΫϩαʔϏεڥͰɺ ֤αʔϏε͕ग़ྗ͢ΔΤϥʔϩά͕ Slack ʹ࿈ܞ͞ΕΔ • ΤϥʔϋϯυϦϯά͕ෆेͳαʔϏε͔Βͷग़ྗʹ·͞ΕΔ 5 -
Nikkei Tech Talk Ͱͷհ • Nikkei Tech Talk ܦͷΤϯδχΞ৫ ͷษڧձ
• #3 ͷϑϩϯτΤϯυճͰΞϥʔτվળͷ औΓΈΛհ 6 https://speakerdeck.com/sadnessojisan/jian-shi- senaakansi-wu-da-zhi-dakeniookamitutena -
Nikkei Tech Talk Ͱͷհ • Nikkei Tech Talk ܦͷΤϯδχΞ৫ ͷษڧձ
• #3 ͷϑϩϯτΤϯυճͰΞϥʔτվળͷ औΓΈΛհ 7 https://speakerdeck.com/sadnessojisan/jian-shi- senaakansi-wu-da-zhi-dakeniookamitutena ΦΦΧϛ -
ΦΦΧϛগͷରॲΛհͨ͠ • લऀෆࡏͰՔಇதͷαʔϏε܈͕SlackͷΞϥʔτνϟϯωϧΛຒΊਚ͘͠ ͍ͯͨ • ۓٸͷ͍Τϥʔ͕ଟ͘ɺʮͲ͏ͤۓٸ͍͔Βݟͳ͍͍ͯ͘ʯͱ͍ ͏ΦΦΧϛগ͕ਂࠁͩͬͨ • ̏ϲ݄͔͚ͯमਖ਼ͨۤ͠ಆͷه͕ઌͷεϥΠυ •
Ξϥʔτͷऩू • Ξϥʔτϩά͕Ͳ͔͜Βൃ͍ͯ͠Δ͔ίʔυϨϕϧͰ͍͔͚Δ • ΞϥʔτͷઃఆΛݟ͢ 8 -
ݸਓϒϩάͰͷհ - My new error… - • ʮ͜͏͍͏ΤϥʔϋϯυϦϯάΛ͢Ε ࢹ͍͢͠ʯͱ͍ͬͨςΫχοΫͷ հ
• Result • Custom Error • Error Cause • Sentry 9 https://blog.ojisan.io/my-new-error/ -
ݸਓϒϩάͰͷհ - Sentry SDK શཧղ - • Sentry SDKͷΈʹ͍ͭͯ •
Sentry ઃఆ߲͕ͱͯଟ͍͕ɺ Sentry ͷΈΛΕԿΛઃఆ͖͢ ͔͢͜͠ݟ͑ͯ͘Δ 10 https://blog.ojisan.io/sentry-sdk-kanzen-rikai/ -
ࠓͷొஃͰ͍ͨ͜͠ͱ • Nikkei Tech Talk: ෛ࠴ฦࡁ׆ಈͰͷΞϥʔτվળͷటष͍औΓΈΛհ • ϒϩά: ΤϥʔϋϯυϦϯάͷͨΊͷཧٕज़తͳςΫχοΫΛհ •
YAPC: ཧΛݱ࣮ͷطଘͷΞϓϦέʔγϣϯʹద༻͢Δ࣮ફʹϑΥʔΧε 11 -
Ͳ͏͍͏πʔϧΛ͍͍͑ͷ͔ • PagerDuty: Φϯίʔϧ • StatusCake: ֓ܗࢹ • Sentry: ϩΪϯάɺΞϥʔτ
• GCP / AWS: උ͚͑ͷϩάج൫ 17 -
Ͳ͏͍͏πʔϧΛ͍͍͑ͷ͔ • PagerDuty: Φϯίʔϧ • StatusCake: ֓ܗࢹ • Sentry: ϩΪϯάɺΞϥʔτ
• GCP / AWS: උ͚͑ͷϩάج൫ • Datadog: ϩάج൫ɺαʔϏεލ͍ͩ౷߹ɺΫΤϦ͕͍͢͠ 18 -
Ͳ͏͍͏πʔϧΛ͍͍͑ͷ͔ • PagerDuty: Φϯίʔϧ • StatusCake: ֓ܗࢹ • Sentry: ϩΪϯάɺΞϥʔτ
• GCP / AWS: උ͚͑ͷϩάج൫ • Datadog: ϩάج൫ɺαʔϏεލ͍ͩ౷߹ɺΫΤϦ͕͍͢͠ • Kibana: ݕࡧɺϏδϡΞϥΠζ 19 -
πʔϧʹΑΔใ൙ཞ • πʔϧͷׂ͕ඃ͍ͬͯΔ • Datadog cloud monitoring ΞϥʔτͰ͖Δ •
ͱ͍͑ɺతΛܾΊ͍ͯΔͷͰ͋Εݸผʹ͞·͟·ͳπʔϧΛಋೖ͢ Δ͜ͱࣗମྑ͍ͱ͞Ε͍ͯΔ • ͔͠͠ɺͦͷલఏͷڞ༗͕ෆेͩͱใ൙ཞ͕ൃੜ͢Δ • ʮ͜͏͍͏ো͕ى͖ͨͱ͖ԿΛݟΕ͍͍Ͱ͔͢ʁʯ 20 -
ͳͥࢹ্͕ख͍͔͘ͳ͍͔ • ࣮ͷ: πʔϧͷྗΛൃشͰ͖͍ͯͳ͍ • ৫ͷ: ӡ༻ϧʔςΟϯͷઃܭ͕Ͱ͖͍ͯͳ͍ • ՔಇϦιʔεͷௐ •
ผҊ݅ͱͷ༏ઌॱҐͷௐ 23 ·࣮ͣͷʹऔΓΉ -
ΤϥʔϋϯυϦϯάΛΕͳ͍ͨΊʹResultܕͷಋೖ • JS Ͱྫ֎ͷཧ try catch Ͱߦ ͏ • ͔͠͠Ͳͷ͕ؔྫ֎Λ͛Δ͔
ΛΒͳ͍ͱ try Λ͚Εͳ͍ • νʔϜ։ൃϥΠϒϥϦͷར༻ͳ Ͳɺ͕ࣗ࡞͍ͬͯͳ͍ίʔυΛ ݺͼग़͢ͱ͖ʹ͚ͭΕ͕ൃੜ͢ Δ 24 -
ΤϥʔϋϯυϦϯάΛΕͳ͍ͨΊʹResultܕͷಋೖ • ޭɾࣦഊΛ Result ͱ͍͏ܕͰද ݱ • type Result<T, E>
= { _tag: “success”, val: T} | {_tag: “err”, val: E } • TS ڥͰݺͼग़͠ଆʹޭ͔ࣦ ഊ͔ͷ֬ೝΛڧ੍ͤ͞ΒΕΔͷ ͰɺΤϥʔϋϯυϦϯάͷ͠Ε Λ͛Δ 25 -
Result ܕʹৼΓΔ͜ͱຊʹଥͳͷ͔ • ΦϒδΣΫτͷੜͱݕূਖ਼ৗܥʹ͓͍ͯʢແࢹͰ͖Δ΄ͲʹඍʑͨΔ ͷ͚ͩͲʣແବͳίετͰͳ͍͔ • ྻɺΦϒδΣΫτɺMapʹΞΫηεͨ͠ͱ͖ͷϋϯυϦϯάʹ Result ͕ ग़ͯ͘ΔͷͰͳ͍͔
• const a = [1]; const b = a[0]; ઈରʹ͕ೖ͍ͬͯΔ b Λ number ͱ͍ͯ͠ ͨͯ͘ܕ্Ͱ undefined, ྫ֎Λ͛ͨ͘ͳΒͳ͍Ͱ͔͢ʁ • ͦͦݴޠػೳͰͳ͍ͷʹཔΔͱຊདྷͷτϨʔε͕ෆਖ਼֬ʹͳΔͷͰ ͳ͍͔ 26 -
ϝϦοτʹΛ͚ͯ Resultܕ ͷಋೖͱ౿ΈΔ • ܦͷಛੑ্SSR͕ඞਢͰɺ෦తͳࢴ໘ੜʹ ࣦഊͨ͠ͱ͖ʹରԠ͍͢͠ • ৽ฉهࣄͷೖߘͱͯࣗ༝͕ߴ͘ɺΞϓϦ έʔγϣϯͷͲ͔͜Βྫ֎͕ඈΜͰ͘Δͷ͔༧ଌ Ͱ͖ͳ͍
• ༗ࣝऀʢRustaceanʣʹΑΔϋϯζΦϯ߈ུΨΠ υͷڞ༗ • Fastly C@E ͷಋೖͰ Rust ʹ׳Εͳ͍ͱ͍͚ͳ͍ • ଞνʔϜʹScalaͱKotlinͷൊ͕͋ΓɺResultܕࣗ ମʹର͢Δݟ͋Δ 27 https://hack.nikkei.com/blog/advent20221201/ -
ҰԠσϝϦοτʹΛ͚Δͱ • ΦϒδΣΫτͷੜͱݕূਖ਼ৗܥʹ͓͍ͯʢແࢹͰ͖Δ΄ͲʹඍʑͨΔͷ͚ͩ ͲʣແବͳίετͰͳ͍͔ => ແࢹɺύϑΥʔϚϯε͕ʹͳΔͳΒݦࡏԽ͔ͯ͠Βରࡦ͢Δ • ྻɺΦϒδΣΫτɺMapʹΞΫηεͨ͠ͱ͖ͷϋϯυϦϯάʹ Result
͕ग़ͯ͘Δͷ Ͱͳ͍͔ => ։ൃऀ͕ઈରʹ҆શͱ͍ͬͯΔͷͰ͋Εྫ֎Λ͛ΔɻྻʹΛ٧Ίͨޙʹऔ Γग़ͯͦ͠ͷͷ࣮ࡏΛݕূʢܕݕࠪ௨ͨ͢Ίʹʣͨ͠ͱ͖ɺྫ֎্͕͕ΔΘ͚͕ͳ͍ • ͦͦݴޠػೳͰͳ͍ͷʹཔΔͱຊདྷͷτϨʔε͕ෆਖ਼֬ʹͳΔͷͰͳ͍͔ • ؆୯ͳίϯϏωʔλ͚ͩΛ͏Α͏ʹ͠ɺ࠷ѱΘͣʹ۪ͳίʔυΛॻ͍ͯڐ༰ • functional programming ʹد͍ͤͨΘ͚Ͱͳ͍ 28 -
ResultܕΛಋೖ͢ΔʹίϯϏωʔλඞཁ • ResultͷΛ͏ͨΊʹຖճ Result Λ֎͢ඞཁ͕͋ΔɻϝϯυΫαΠ • map: Result ͷ val
ʹؔΛద༻Ͱ͖Δɻmap(Result<T, E>, T->U) Result<U , E> ͱͳΔɻmap(getUserResult, (user) => encUserId(user)); • flatMap: Result ͷ val ʹ Result Λฦؔ͢Λద༻Ͱ͖ΔɻResult<T, Result<T, E>> ͕ Result<T, E> ͱͳΔɻflatMap(getUserResult, (user) => getBoughtItemsByUser(user)); • Result Λฦؔ͢ಉ࢜ͷ߹͕༰қʹͳΓɺResultΛͨ͘͞ΜͬͯϢʔ βʔͷॻ͖ຯมΘΒͳ͍ɻ 29 -
ίϯϏωʔλͷ࣮ΛϥΠϒϥϦʹͤΔ • ίϯϏωʔλΛࣗୡͰ༻ҙ͢ΔͷେมͳͷͰ option-t ͱ͍͏ϥΠϒϥϦ Λ࠾༻ • https://github.com/option-t/option-t • A
toolkit of Nullable/Option/Result type implementation in ECMAScript. Their APIs are inspired by Rust's `Option<T>` and `Result<T, E>`. • Rust ͷυΩϡϝϯτͰֶΔ͜ͱ͕େ͖ͳΞυόϯςʔδ 30 -
Τϥʔʹ໊લΛׂΓৼΔ • SentryͰ Issue ͷλΠτϧ͕ҰཡͰදࣔͰ ͖ɺͦͷλΠτϧͰूܭͰ͖Δ • λΠτϧͷཻωʔϛϯά͕େࣄ • λΠτϧ
Error.prototype.name Ͱ੍ޚͰ͖Δ • new Error(‘msg’).name = “MyError” • ͱ͢ΔͷΊΜͲ͍͘͞ͷͰɺͦͷ໊લΛ࣋ͬ ͨ Custom Error Λఆ͓ٛͯ͘͠ͷ͕ৗ 31 ԿͷΤϥʔ͔͔Βͳ͍ʂ -
σόοά͍͢͠ϝλใΛϝοηʔδʹೖΕΔ • SentryͰ Error.prototype.message ͷ༰͕ ϩάʹݱΕΔ • ΤϥʔΛੳ͢Δͱ͖ͷώϯτΛ message ʹ
ೖΕ͓ͯ͘ • ݺͼग़͞ΕΔؔͷҾ • ϢʔβʔτʔΫϯݸਓใͳͲग़ྗ͠ͳ ͍Α͏ʹҙ • SentryʹݶΒͣʮϩάʹग़ྗ͖͢Կ͔ʯ Λҙࣝ͢Δͱྑ͍ 32 ԿͷΤϥʔ͔͔Βͳ͍ʂ -
ϩάϨϕϧΛ͍͚Δ • Sentry log, warn, error ͱ͍ͬͨϩάϨϕϧͷ͍͚͕Ͱ͖ΔɻϑΟϧλͯ͠ݕࡧ͠ ͨΓɺϨϕϧ͝ͱʹΞϥʔτΛઃఆͰ͖Δɻ • ͳΜͰ͔ΜͰΤϥʔʹͤͣɺϩάϨϕϧΛ͍͚ΔͱΦΦΧϛগΛݮΒͤΔ
• error: ҟৗ͕ى͖ͨͱ͖ʹ͏ • warn: ݺΕͯخ͘͠ͳ͍ॲཧ͕ݺΕͨͱ͖ʹ͏ɻdeprecated ͳ API ΛݺΕͨ ࣌retryͷ࣮ߦͳͲ • Info: ϨεϙϯεͳͲͰ֬ೝͰ͖ͳͯ͘ʹݟ͑ΔܗͰ֬ೝͰ͖ͳ͍͕ɺ࣮ߦ͞Εͨܗ Λ͢ͱ͖ʹ͏ɻಛघͳΤϯυϙΠϯτͷݺͼग़͠application cache͕miss͠ ͨͱ͖ͳͲ 33 -
ϩΨʔͷϥούʔΛ࡞Δ • console.log, info, warn, error Λͦͷ··Θ ͳ͍ • ΫϥυڥͰ
sentry ҰॹʹݺΕΔΑ ͏ͳϥούʔؔΛ࡞Δ 34 -
ϊΠζͷ੍Λ͍ͨ͠ • ΞϥʔτUI͔Β ignore Ͱ͖Δ • ͔͠͠ҟͳΔURL͔Βಉ͡Τϥʔ͕ग़ͨ߹ɺҟͳΔΤϥʔͱͯ͠ѻΘΕͯ ignore ͯ͠৽͘͠ಉ͡Τϥʔ͕௨͞ΕΔ •
ͦͦ Sentry ʹૹΒͳ͍Α͏ʹ͍ͨ͠ɻinit ͷ option Ͱ͋Δఔ੍ޚͰ͖ Δɻhttps://docs.sentry.io/platforms/javascript/configuration/filtering/ • ignoreErrors: send ͠ͳ͍ΤϥʔΛએݴͰ͖Δ • denyUrls: ֎෦ϞδϡʔϧʹΑΔΤϥʔΛsend͠ͳ͍ 36 -
ιʔεϚοϓΛग़ྗ͢Δ • SentryͰ source map Λૹ৴͢Δ͜ͱͰ minify ͞ΕͨίʔυͷΤϥʔΛɺਓ ͕ؒಡΊΔܗʹͯ͘͠ΕΔ •
Sentry͕Ϗϧυπʔϧ͚ϓϥάΠϯΛఏڙ͓ͯ͠ΓɺͦΕΛར༻͢Δ͜ͱͰ sourcemap Λૹ৴Ͱ͖Δ • webpack, nextjs • sentry-cli ͷઃఆ͕ඞཁ • Source map Λૹ৴ޙɺͭ·ΓϏϧυޙσϓϩΠલͷλΠϛϯάͰιʔε ίʔυ͔Β sourcemap Λফ͢͜ͱΛਪ 37 -
Error Cause Λ͏ • ྫ֎Λcatchͯ͠٧Ί͢ͱͦͷྫ֎ ใ͕ࣦΘΕͯ͠·͏ • catch અͰΧελϜΤϥʔΛ࡞ͬͯ Result.Error
Λ࡞Δͱ͖ʹɺݩͷΤ ϥʔ͕ࣦΘΕͯ͠·͏͕͋ͬͨ • Error.prototype.cause Λ͏͜ͱ ͰɺݩͷΤϥʔΛ৽͍͠Τϥʔʹੵ ΊΔ 38 -
Node.js ΛΞοϓσʔτ͢Δ • Error Cause ES2022, Node.js 16.9 ͔Βͷػೳ
• ࣌ฐࣾͷଟ͘ͷ Node.js ͷόʔδϣϯ 16.9ະຬ • 16, 18 ͷΞοϓσʔτ࡞ۀΛνʔϜϝΠτ͕Ξϥʔτվળͱฒߦͯ͠ߦ͏ • gyp-error ͱᛀΊͬ͜͢Δຖ 39