JavaScript์์ ์ถ์ ์ด๋ฒคํธ ๋ด๋ณด๋ด๊ธฐยถ
Snowflake JavaScript API ์ snowflake
ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ JavaScript๋ก ์์ฑ๋ ํจ์ ๋๋ ํ๋ก์์ ์ฒ๋ฆฌ๊ธฐ์์ ์ถ์ ์ด๋ฒคํธ๋ฅผ ๋ด๋ณด๋ผ ์ ์์ต๋๋ค. JavaScript API๋ JavaScript ์ฒ๋ฆฌ๊ธฐ ์ฝ๋์์ ์ด๋ฏธ ์ ๊ณต๋ฉ๋๋ค.
์ถ์ ์ด๋ฒคํธ๋ฅผ ๋ด๋ณด๋ด๊ธฐ ์ ์ ์ํ๋ ๋ฐ์ดํฐ๊ฐ ์ด๋ฒคํธ ํ ์ด๋ธ์ ์ ์ฅ๋๋๋ก ์ถ์ ์์ค์ ์ค์ ํ๋์ง ํ์ธํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ ๋ก๊น , ๋ฉํธ๋ฆญ ๋ฐ ์ถ์ ์ ์ํ ์์ค ์ค์ ํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ฐธ๊ณ
์ถ์ ์ด๋ฒคํธ ๋ด๋ณด๋ด๊ธฐ๋ฅผ ์์ํ๋ ค๋ฉด ๋จผ์ ์ด๋ฒคํธ ํ ์ด๋ธ์ ์ค์ ํด์ผ ํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ ์ด๋ฒคํธ ํ ์ด๋ธ ๊ฐ์ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ด๋ฒคํธ ํ ์ด๋ธ์์ SELECT ๋ช ๋ น์ ์คํํ์ฌ ์ ์ฅ๋ ์ถ์ ์ด๋ฒคํธ ๋ฐ์ดํฐ์ ์ก์ธ์คํ ์ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ์ถ์ ๋ฐ์ดํฐ ๋ณด๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
Snowflake์์ ๋ก๊น ์ค์ ๋ฐ ๋ฉ์์ง ๊ฒ์์ ๋ํ ์ผ๋ฐ์ ์ธ ์ ๋ณด๋ ํจ์์ ํ๋ก์์ ์ ์ถ์ ์ด๋ฒคํธ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ฐธ๊ณ
์ถ์ ์ด๋ฒคํธ๋ฅผ ์ถ๊ฐํ ๋ ์ผ๋์ ๋์ด์ผ ํ ์ง์นจ์ ์ถ์ ์ด๋ฒคํธ๋ฅผ ์ถ๊ฐํ๋ ์ผ๋ฐ ์ง์นจ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ถ์ ์ด๋ฒคํธ ์ถ๊ฐํ๊ธฐยถ
snowflake.addEvent
ํจ์๋ฅผ ํธ์ถํ๊ณ ์ด๋ฒคํธ ์ด๋ฆ์ ์ ๋ฌํ์ฌ ์ถ์ ์ด๋ฒคํธ๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์ ํ์ ์ผ๋ก ํน์ฑ(ํค-๊ฐ ํ์ด)์ ์ด๋ฒคํธ์ ์ฐ๊ฒฐํ ์๋ ์์ต๋๋ค.
addEvent
๋ฉ์๋๋ ๋ค์ ํ์์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
snowflake.addEvent(name [, { key:value [, key:value] } ] );
๋ค์ ์์ ์ ์ฒ๋ฆฌ๊ธฐ ์ฝ๋์์๋ name_a
์ name_b
์ ๋ ์ด๋ฒคํธ๊ฐ ์ถ๊ฐ๋ฉ๋๋ค. ์ด ์ฝ๋์์ name_b
๋ฅผ ์ฌ์ฉํ๋ฉด score
์ pass
์ ๋ ๊ฐ์ง ํน์ฑ๋ ์ถ๊ฐ๋ฉ๋๋ค.
create procedure PI_JS()
returns double
language javascript
as
$$
snowflake.addEvent('name_a'); // add an event without attributes
snowflake.addEvent('name_b', {'score': 89, 'pass': true});
return 3.14;
$$
;
์ด๋ฌํ ํน์ฑ์ ์ค์ ํ๋ฉด ์ด๋ฒคํธ ํ ์ด๋ธ์ ๋ ๊ฐ์ ํ์ด ์๊ธฐ๋๋ฐ, RECORD ์ด์ ๊ฐ์ด ๊ฐ๊ฐ ๋ค๋ฆ ๋๋ค.
{
"name": "name_a"
}
{
"name": "name_b"
}
name_b
์ด๋ฒคํธ ํ์ RECORD_ATTRIBUTES ์ด์ ๋ค์ ํน์ฑ์ ํฌํจํฉ๋๋ค.
{
"score": 89,
"pass": true
}
๋ฒ์ ํน์ฑ ์ถ๊ฐํ๊ธฐยถ
snowflake.setSpanAttribute
ํจ์๋ฅผ ํธ์ถํ์ฌ ๋ฒ์์ ์ฐ๊ฒฐ๋ ํน์ฑ(ํค-๊ฐ ํ์ด)์ ์ค์ ํ ์ ์์ต๋๋ค.
setSpanAttribute
ํจ์๋ ๋ค์ ํ์์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
snowflake.setSpanAttribute(key, value);
๋ฒ์์ ๋ํ ์์ธํ ๋ด์ฉ์ Snowflake๊ฐ ์ถ์ ์ด๋ฒคํธ๋ฅผ ํ์ํ๋ ๋ฐฉ๋ฒ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
๋ค์ ์์ ์ ์ฝ๋๋ 4๊ฐ์ง ํน์ฑ์ ๋ง๋ค๊ณ ํด๋น ๊ฐ์ ์ค์ ํฉ๋๋ค.
// Setting span attributes.
snowflake.setSpanAttribute("example.boolean", true);
snowflake.setSpanAttribute("example.long", 2L);
snowflake.setSpanAttribute("example.double", 2.5);
snowflake.setSpanAttribute("example.string", "testAttribute");
์ด๋ฌํ ํน์ฑ์ ์ค์ ํ๋ฉด ์ด๋ฒคํธ ํ ์ด๋ธ์ RECORD_ATTRIBUTES ์ด์ ๋ค์ ๋ด์ฉ์ด ํ์๋ฉ๋๋ค.
{
"example.boolean": true,
"example.long": 2,
"example.double": 2.5,
"example.string": "testAttribute"
}
์ฌ์ฉ์ ์ง์ ๋ฒ์ ์ถ๊ฐํ๊ธฐยถ
Snowflake์์ ์์ฑ๋ ๊ธฐ๋ณธ ๋ฒ์์ ๋ณ๋๋ก ์ฌ์ฉ์ ์ง์ ๋ฒ์๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์ฌ์ฉ์ ์ง์ ๋ฒ์์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ถ์ ์ ์ฌ์ฉ์ ์ง์ ๋ฒ์ ์ถ๊ฐํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
๋ค์ ์์ ์ ์ฝ๋๋ OpenTelemetry API ๋ฅผ ์ฌ์ฉํ์ฌ ์ example_custom_span
๋ฒ์๋ฅผ ์์ฑํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ด๋ฒคํธ์ ํน์ฑ์ ์ ๋ฒ์์ ์ถ๊ฐํฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก, ์ด ์ฝ๋๋ ๋ฒ์๋ฅผ ์ข
๋ฃํ์ฌ ์ด๋ฒคํธ ํ
์ด๋ธ์ ํด๋น ๋ฒ์์ ์ด๋ฒคํธ ๋ฐ์ดํฐ๊ฐ ์บก์ฒ๋๋๋ก ํฉ๋๋ค. ์ฝ๋์์ Span.end
๋ฉ์๋๋ฅผ ํธ์ถํ์ง ์์ผ๋ฉด ์ด๋ฒคํธ ํ
์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ์บก์ฒ๋์ง ์์ต๋๋ค.
CREATE OR REPLACE FUNCTION javascript_custom_span()
RETURNS STRING
LANGUAGE JAVASCRIPT
AS
$$
const { trace } = opentelemetry;
const tracer = trace.getTracer("example_tracer");
// Alternatively, const tracer = opentelemetry.trace.getTracer("example_tracer");
tracer.startActiveSpan("example_custom_span", (span) => {
span.addEvent("testEventWithAttributes");
span.setAttribute("testAttribute", "value");
span.end();
});
$$;