์‚ฌ์šฉ์ž์˜ ํŽธ์˜๋ฅผ ์œ„ํ•ด ์ œ๊ณต๋˜๋Š” ๊ธฐ๊ณ„ ๋ฒˆ์—ญ์ž…๋‹ˆ๋‹ค.

์˜๋ฌธ๋ณธ๊ณผ ๋ฒˆ์—ญ๋ณธ์ด ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์˜๋ฌธ๋ณธ์ด ์šฐ์„ ํ•ฉ๋‹ˆ๋‹ค. ๋ณด๋‹ค ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ด ํŽ˜์ด์ง€๋ฅผ ๋ฐฉ๋ฌธํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋ฌธ์ œ ์‹ ๊ณ 

addPageAction

ํ†ต์‚ฌ๋ก 

newrelic.addPageAction(string $name[, JSON object $attributes])

์ด๋ฆ„ ๋ฐ ์„ ํƒ์  ์†์„ฑ๊ณผ ํ•จ๊ป˜ ๋ธŒ๋ผ์šฐ์ € PageAction ์ด๋ฒคํŠธ๋ฅผ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค.

์š”๊ตฌ ์‚ฌํ•ญ

  • Browser Pro ๋˜๋Š” Pro+SPA ์—์ด์ „ํŠธ(v593 ์ด์ƒ)

  • npm์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ € ์—์ด์ „ํŠธ๋ฅผ ์„ค์น˜ํ•˜๋Š” ๊ฒฝ์šฐ BrowserAgent ํด๋ž˜์Šค๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•  ๋•Œ generic_events ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. features ๋ฐฐ์—ด์— ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    import { GenericEvents } from '@newrelic/browser-agent/features/generic_events';
    const options = {
    info: { ... },
    loader_config: { ... },
    init: { ... },
    features: [
    GenericEvents
    ]
    }

    ์ž์„ธํ•œ ๋‚ด์šฉ์€ npm ๋ธŒ๋ผ์šฐ์ € ์„ค์น˜ ์„ค๋ช…์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์„ค๋ช…

์ด API ํ˜ธ์ถœ์€ ์‚ฌ์šฉ์ž ์ •์˜ ์ด๋ฆ„ ๋ฐ ์„ ํƒ์  ์†์„ฑ์ด ํฌํ•จ๋œ ๋ธŒ๋ผ์šฐ์ € PageAction ์ด๋ฒคํŠธ ๋ฅผ ์—ฌ๋Ÿฌ ๊ธฐ๋ณธ ์†์„ฑ ๊ณผ ํ•จ๊ป˜๋Œ€์‹œ๋ณด๋“œ ๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์ด๋Š” ๊ตฌ๋… ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๊ฑฐ๋‚˜ ์ž์Šต์„œ์— ์•ก์„ธ์Šคํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ๋ธŒ๋ผ์šฐ์ € ์—์ด์ „ํŠธ์—์„œ ์ž๋™์œผ๋กœ ์ถ”์ ํ•˜์ง€ ์•Š๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ถ”์ ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • PageAction ์ด๋ฒคํŠธ๋Š” ๋ธŒ๋ผ์šฐ์ €๋‹น 30์ดˆ ์ˆ˜์ง‘ ์ฃผ๊ธฐ๋‹น ์ตœ๋Œ€ 120๊ฐœ์˜ ์ด๋ฒคํŠธ๋กœ 30์ดˆ๋งˆ๋‹ค ์ „์†ก๋ฉ๋‹ˆ๋‹ค.
  • 120๊ฐœ ์ด๋ฒคํŠธ ์ œํ•œ์— ๋„๋‹ฌํ•˜๋ฉด ํ•ด๋‹น ์ˆ˜ํ™• ์ฃผ๊ธฐ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ด๋ฒคํŠธ๊ฐ€ ์บก์ฒ˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

๋งค๊ฐœ๋ณ€์ˆ˜

์„ค๋ช…

$name

๋ˆ

ํ•„์ˆ˜์˜. ์ž‘์—…์˜ ์ด๋ฆ„ ๋˜๋Š” ๋ฒ”์ฃผ์ž…๋‹ˆ๋‹ค. actionName ์†์„ฑ์œผ๋กœ ๋ณด๊ณ ๋ฉ๋‹ˆ๋‹ค.

์†์„ฑ์ด๋‚˜ ๊ฐ’์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•  ๋•Œ ์˜ˆ์•ฝ๋œ NRQL ๋‹จ์–ด ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

$attributes

JSON ๊ฐ์ฒด

์„ ํƒ ๊ณผ๋ชฉ. ํ•˜๋‚˜ ์ด์ƒ์˜ ํ‚ค/๊ฐ’ ์Œ์ด ์žˆ๋Š” JSON ๊ฐ์ฒด. ์˜ˆ: {key:"value"} . ํ‚ค๋Š” ์ง€์ •๋œ ๊ฐ’๊ณผ ํ•จ๊ป˜ ์ž์ฒด PageAction ์†์„ฑ์œผ๋กœ ๋ณด๊ณ ๋ฉ๋‹ˆ๋‹ค.

์†์„ฑ/๊ฐ’์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•  ๋•Œ ์˜ˆ์•ฝ๋œ NRQL ๋‹จ์–ด ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

์˜ˆ

์ด ์˜ˆ์—์„œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ Try Me ๋งํฌ๋ฅผ ์„ ํƒํ•  ๋•Œ๋งˆ๋‹ค PageAction ์ด๋ฒคํŠธ๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ๋Š” clickedTryMe ์˜ actionName ์œผ๋กœ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.

<a href="/demo" id="try-me">Try Me!</a>
<script>
document.getElementById('try-me').addEventListener('click', function (e) {
newrelic.addPageAction('clickedTryMe');
});
</script>

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‹ค์Œ NRQL ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ๋„ ํ•˜๊ธฐ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•œ ํšŸ์ˆ˜๋ฅผ ์ฟผ๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SELECT count(*) FROM PageAction WHERE actionName = 'clickedTryMe' SINCE 1 hour ago

์ด ์˜ˆ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํด๋ž˜์Šค๊ฐ€ copy-text ์ธ ์š”์†Œ๋ฅผ ํด๋ฆญํ•  ๋•Œ PageAction ์ด๋ฒคํŠธ๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค. actionName ์€ copy-text-button ์ด๊ณ  ๊ฐ’์€ ๊ฒฐ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” success ๋ฐ error ๋ผ๋Š” ๋ฉ”์„œ๋“œ์— ํ•ด๋‹นํ•˜๋Š” Result ์ด๋ผ๋Š” ๋‹ค๋ฅธ ์†์„ฑ์œผ๋กœ ๋ณด๊ณ ๋ฉ๋‹ˆ๋‹ค.

$('.copy-text').click(function() {
var clipboard = new Clipboard('.copy-text');
clipboard.on('success', function(event) {
// Do stuff
// Report data to New Relic
if (typeof newrelic == 'object') {
newrelic.addPageAction('copy-text-button', { result: 'success' });
}
});
clipboard.on('error', function(event) {
// Do stuff
// Report data to New Relic
if (typeof newrelic == 'object') {
newrelic.addPageAction('copy-text-button', { result: 'error' });
}
});
});

๊ทธ๋Ÿฐ ๋‹ค์Œ ์ฟผ๋ฆฌ ์ž‘์„ฑ๊ธฐ์—์„œ ํŒŒ์ด ์ฐจํŠธ๋ฅผ ๋งŒ๋“ค์–ด ์ง€๋‚œ 30์ผ ๋™์•ˆ ์„ฑ๊ณต๊ณผ ์˜ค๋ฅ˜๋กœ ์ด์–ด์ง„ ๋ฒ„ํŠผ ํด๋ฆญ ์ˆ˜๋ฅผ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SELECT count(*) AS 'Clicks' FROM PageAction WHERE actionName = 'copy-text-button' FACET result SINCE 30 days ago

๋˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด ์ง€๋‚œ 30์ผ ๋™์•ˆ ๊ฐ€์žฅ ๋งŽ์€ ๋ณต์‚ฌ ๋ฒ„ํŠผ ํด๋ฆญ์ด ๋ฐœ์ƒํ•œ ํŽ˜์ด์ง€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SELECT count(*) AS 'Clicks' FROM PageAction WHERE actionName = 'copy-text-button' FACET currentUrl SINCE 30 days ago

์บก์ฒ˜ ์–‘์‹ ์ž…๋ ฅ

์ด ์˜ˆ๋Š” Signup ์ด๋ผ๋Š” ์–‘์‹์—์„œ ์‚ฌ์šฉ์ž ์ž…๋ ฅ(์ด๋ฉ”์ผ ์ฃผ์†Œ)์„ ์บก์ฒ˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ๋Š” userSignup ์˜ actionName ์œผ๋กœ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.

<form action="/signup" id="myform">
<input id="email" name="email" />
<input type="submit" value="Signup" />
</form>
<script type="text/javascript">
document.getElementById('myform').addEventListener('submit', function (e) {
var email = e.target.elements['email'].value;
newrelic.addPageAction('userSignup', { email: email });
});
</script>

๊ทธ๋Ÿฌ๋ฉด ๋‹ค์Œ NRQL ์ฟผ๋ฆฌ๋กœ ์ˆ˜์ง‘ํ•œ ์ด๋ฉ”์ผ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SELECT uniques(email) FROM PageAction WHERE actionName = 'userSignup' SINCE 1 hour ago