Scala์์ ์ถ์ ์ด๋ฒคํธ ๋ด๋ณด๋ด๊ธฐยถ
Snowflake Telemetry API ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ com.snowflake.telemetry.Telemetry
ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ Scala๋ก ์์ฑ๋ ํจ์ ๋๋ ํ๋ก์์ ์ฒ๋ฆฌ๊ธฐ์์ ์ถ์ ์ด๋ฒคํธ๋ฅผ ๋ด๋ณด๋ผ ์ ์์ต๋๋ค. Telemetry
ํด๋์ค๋ Snowflake์ ํฌํจ๋์ด ์์ต๋๋ค.
์ฐธ๊ณ
Snowflake ์๊ฒฉ ๋ถ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ํจ์ ๋๋ ํ๋ก์์ ์ ์คํ ํ๊ฒฝ์ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ถ๊ฐ๋ฉ๋๋ค. ์์ธํ ๋ด์ฉ์ Snowflake ์๊ฒฉ ๋ถ์ ํจํค์ง ์ข ์์ฑ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
Maven์ผ๋ก ์ฝ๋๋ฅผ ํจํค์งํ ๋ Telemetry ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํฌํจํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์๊ฒฉ ๋ถ์ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋๋ก Java ๋ฐ Scala ํ๊ฒฝ ์ค์ ํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ด๋ฒคํธ ํ ์ด๋ธ์์ SELECT ๋ช ๋ น์ ์คํํ์ฌ ์ ์ฅ๋ ์ถ์ ์ด๋ฒคํธ ๋ฐ์ดํฐ์ ์ก์ธ์คํ ์ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ์ถ์ ๋ฐ์ดํฐ ๋ณด๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ฐธ๊ณ
์ถ์ ์ด๋ฒคํธ๋ฅผ ์ถ๊ฐํ ๋ ์ผ๋์ ๋์ด์ผ ํ ์ง์นจ์ ์ถ์ ์ด๋ฒคํธ๋ฅผ ์ถ๊ฐํ๋ ์ผ๋ฐ ์ง์นจ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
Snowflake์์ ๋ก๊น ์ค์ ๋ฐ ๋ฉ์์ง ๊ฒ์์ ๋ํ ์ผ๋ฐ์ ์ธ ์ ๋ณด๋ ํจ์์ ํ๋ก์์ ์ ์ถ์ ์ด๋ฒคํธ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ฝ๋์์ ๋ก๊น ํ๊ธฐ ์ ์ ๋ค์์ ์ํํด์ผ ํฉ๋๋ค.
์ฒ๋ฆฌ๊ธฐ ์ฝ๋์์ ๋ก๊น ๋ ๋ฉ์์ง๋ฅผ ์์งํ๋๋ก ์ด๋ฒคํธ ํ ์ด๋ธ์ ์ค์ ํฉ๋๋ค.
์์ธํ ๋ด์ฉ์ ์ด๋ฒคํธ ํ ์ด๋ธ ๊ฐ์ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ํ๋ ๋ฐ์ดํฐ๊ฐ ์ด๋ฒคํธ ํ ์ด๋ธ์ ์ ์ฅ๋๋๋ก ์ถ์ ์์ค์ ์ค์ ํ๋์ง ํ์ธํฉ๋๋ค.
์์ธํ ๋ด์ฉ์ ๋ก๊น , ๋ฉํธ๋ฆญ ๋ฐ ์ถ์ ์ ์ํ ์์ค ์ค์ ํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์๊ฒฉ ๋ถ์ API์ ๋ํ ์ง์ ์ถ๊ฐํ๊ธฐยถ
Telemetry
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ฒ๋ฆฌ๊ธฐ ์ฝ๋์์ ์คํ ์์ค Snowflake ์๊ฒฉ ๋ถ์ ํจํค์ง ๋ฅผ ๊ฐ์ฉ์ฑ ์๊ฒ ์ค์ ํด์ผ ํฉ๋๋ค.
CREATE PROCEDURE ๋๋ CREATE FUNCTION ๋ฌธ์ PACKAGES ์ ์
com.snowflake:telemetry
ํจํค์ง๋ฅผ ํฌํจํฉ๋๋ค. PACKAGES ์ ์ ํฌํจ๋ Snowflake ์๊ฒฉ ๋ถ์ API๋ฅผ ์ฝ๋์ ์ฌ์ฉํ ์ ์๋๋ก ํฉ๋๋ค.๋ค์ ์์ ์ ์ฝ๋์์๋ PACKAGES ์ ์ ์ฌ์ฉํ์ฌ ์๊ฒฉ ๋ถ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ Snowpark ๋ผ์ด๋ธ๋ฌ๋ฆฌ(Scala๋ก ์์ฑ๋ ์ ์ฅ ํ๋ก์์ ์ ํ์ํจ โ ์์ธํ ๋ด์ฉ์ SQL์ ์ฌ์ฉํ์ฌ ์์ฑ๋ ์ ์ฅ ํ๋ก์์ ์ ๋ํ Scala ์ฒ๋ฆฌ๊ธฐ ์์ฑํ๊ธฐ ์ฐธ์กฐ)๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
CREATE OR REPLACE PROCEDURE myproc(...) RETURNS ... LANGUAGE SCALA ... PACKAGES = ('com.snowflake:snowpark:latest', 'com.snowflake:telemetry:latest') ...
์ฒ๋ฆฌ๊ธฐ ์ฝ๋์์
com.snowflake.telemetry
ํจํค์ง๋ฅผ ๊ฐ์ ธ์ต๋๋ค.import com.snowflake.telemetry.Telemetry
์ถ์ ์ด๋ฒคํธ ์ถ๊ฐํ๊ธฐยถ
Telemetry.addEvent
๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ ์ด๋ฒคํธ ์ด๋ฆ์ ์ ๋ฌํ์ฌ ์ถ์ ์ด๋ฒคํธ๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์ ํ์ ์ผ๋ก ํน์ฑ(ํค-๊ฐ ํ์ด)์ ์ด๋ฒคํธ์ ์ฐ๊ฒฐํ ์๋ ์์ต๋๋ค.
addEvent
๋ฉ์๋์๋ ๋ค์ ์๋ช
์ด ์์ต๋๋ค.
public static void addEvent(String name)
public static void addEvent(String name, Attributes attributes)
๋ค์ ์์ ์ ์ฝ๋๋ testEvent
๋ผ๋ ์ด๋ฒคํธ๋ฅผ ์ถ๊ฐํ์ฌ ์ด๋ฒคํธ์ key
๋ฐ result
๋ผ๋ ๋ ๊ฐ์ง ํน์ฑ๊ณผ ์ฐ๊ฒฐํฉ๋๋ค.
// Adding an event without attributes.
Telemetry.addEvent("testEvent")
// Adding an event with attributes.
Attributes eventAttributes = Attributes.of(
AttributeKey.stringKey("key"), "run",
AttributeKey.longKey("result"), Long.valueOf(123))
Telemetry.addEvent("testEventWithAttributes", eventAttributes)
์ด๋ฌํ ์ด๋ฒคํธ๋ฅผ ์ถ๊ฐํ๋ฉด ์ด๋ฒคํธ ํ ์ด๋ธ์ ๋ ๊ฐ์ ํ์ด ์๊ธฐ๋๋ฐ, RECORD ์ด์ ๊ฐ์ด ๊ฐ๊ฐ ๋ค๋ฆ ๋๋ค.
{
"name": "testEvent"
}
{
"name": "testEventWithAttributes"
}
testEventWithAttributes
์ด๋ฒคํธ ํ์ RECORD_ATTRIBUTES ์ด์ ๋ค์ ํน์ฑ์ ํฌํจํฉ๋๋ค.
{
"key": "run",
"result": 123
}
๋ฒ์ ํน์ฑ ์ถ๊ฐํ๊ธฐยถ
Telemetry.setSpanAttribute
๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ๋ฒ์์ ์ฐ๊ฒฐ๋ ํน์ฑ(ํค-๊ฐ ํ์ด)์ ์ค์ ํ ์ ์์ต๋๋ค.
setSpanAttribute
๋ฉ์๋์๋ ๋ค์ ์๋ช
์ด ์์ต๋๋ค.
public static void setSpanAttribute(String key, boolean value)
public static void setSpanAttribute(String key, long value)
public static void setSpanAttribute(String key, double value)
public static void setSpanAttribute(String key, String value)
๋ฒ์์ ๋ํ ์์ธํ ๋ด์ฉ์ Snowflake๊ฐ ์ถ์ ์ด๋ฒคํธ๋ฅผ ํ์ํ๋ ๋ฐฉ๋ฒ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
๋ค์ ์์ ์ ์ฝ๋๋ 4๊ฐ์ง ํน์ฑ์ ๋ง๋ค๊ณ ํด๋น ๊ฐ์ ์ค์ ํฉ๋๋ค.
// Setting span attributes.
Telemetry.setSpanAttribute("example.boolean", true)
Telemetry.setSpanAttribute("example.long", 2L)
Telemetry.setSpanAttribute("example.double", 2.5)
Telemetry.setSpanAttribute("example.string", "testAttribute")
์ด๋ฌํ ํน์ฑ์ ์ค์ ํ๋ฉด ์ด๋ฒคํธ ํ ์ด๋ธ์ RECORD_ATTRIBUTES ์ด์ ๋ค์ ๋ด์ฉ์ด ํ์๋ฉ๋๋ค.
{
"example.boolean": true,
"example.long": 2,
"example.double": 2.5,
"example.string": "testAttribute"
}
์ฌ์ฉ์ ์ง์ ๋ฒ์ ์ถ๊ฐํ๊ธฐยถ
Snowflake์์ ์์ฑ๋ ๊ธฐ๋ณธ ๋ฒ์์ ๋ณ๋๋ก ์ฌ์ฉ์ ์ง์ ๋ฒ์๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์ฌ์ฉ์ ์ง์ ๋ฒ์์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ถ์ ์ ์ฌ์ฉ์ ์ง์ ๋ฒ์ ์ถ๊ฐํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
๋ค์ ์์ ์ ์ฝ๋๋ OpenTelemetry API ๋ฐ OpenTelemetry context propagation API ๋ฅผ ์ฌ์ฉํ์ฌ ์ my.span
๋ฒ์๋ฅผ ์์ฑํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ ๋ฒ์์ ์ด๋ฒคํธ๋ฅผ ์ถ๊ฐํฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก, ์ด ์ฝ๋๋ ๋ฒ์๋ฅผ ์ข
๋ฃํ์ฌ ์ด๋ฒคํธ ํ
์ด๋ธ์ ํด๋น ๋ฒ์์ ์ด๋ฒคํธ ๋ฐ์ดํฐ๊ฐ ์บก์ฒ๋๋๋ก ํฉ๋๋ค. ์ฝ๋์์ Span.end
๋ฉ์๋๋ฅผ ํธ์ถํ์ง ์์ผ๋ฉด ์ด๋ฒคํธ ํ
์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ์บก์ฒ๋์ง ์์ต๋๋ค.
CREATE OR REPLACE FUNCTION testScalaUserSpans(x VARCHAR) RETURNS VARCHAR
LANGUAGE SCALA
RUNTIME_VERSION = 2.12
PACKAGES = ('com.snowflake:telemetry:latest')
HANDLER = 'TestScalaClass.run'
AS
$$
class TestScalaClass {
import com.snowflake.telemetry.Telemetry
import io.opentelemetry.api.GlobalOpenTelemetry
import io.opentelemetry.api.trace.Tracer
import io.opentelemetry.api.trace.Span
import io.opentelemetry.context.Scope
def run(x: String): String = {
val tracer: Tracer = GlobalOpenTelemetry.getTracerProvider().get("my.tracer")
val span: Span = tracer.spanBuilder("my.span").startSpan()
span.addEvent("test event from scala")
span.end()
return x
}
}
$$;
์ยถ
์ ์ฅ ํ๋ก์์ ์์ ยถ
CREATE OR REPLACE PROCEDURE do_tracing()
RETURNS STRING
LANGUAGE SCALA
RUNTIME_VERSION = '2.12'
PACKAGES=('com.snowflake:snowpark:latest', 'com.snowflake:telemetry:latest')
HANDLER = 'ProcedureHandler.run'
AS
$$
import com.snowflake.snowpark_java.Session
import com.snowflake.telemetry.Telemetry
import io.opentelemetry.api.common.AttributeKey
import io.opentelemetry.api.common.Attributes
class ProcedureHandler {
def run(session: Session): String = {
// Set span attribute.
Telemetry.setSpanAttribute("example.proc.do_tracing", "begin")
// Add an event without attributes.
Telemetry.addEvent("run_method_start")
// Add an event with attributes.
val eventAttributes: Attributes = Attributes.of(
AttributeKey.stringKey("example.method.name"), "run")
Telemetry.addEvent("event_with_attributes", eventAttributes)
// Set span attribute.
Telemetry.setSpanAttribute("example.proc.do_tracing", "complete")
return "SUCCESS"
}
}
$$;