{"id":1581,"date":"2023-04-11T09:13:12","date_gmt":"2023-04-11T07:13:12","guid":{"rendered":"https:\/\/cwiok.pl\/?p=1581"},"modified":"2026-01-04T16:36:51","modified_gmt":"2026-01-04T15:36:51","slug":"szczegolowe-sledzenie-uzytkownika-historia-pixela","status":"publish","type":"post","link":"https:\/\/cwiok.pl\/index.php\/pl\/2023\/04\/11\/szczegolowe-sledzenie-uzytkownika-historia-pixela\/","title":{"rendered":"Szczeg\u00f3\u0142owe \u015bledzenie u\u017cytkownika &#8211; historia pixela"},"content":{"rendered":"<p align=\"justify\">Zawsze czu\u0142em, \u017ce dane dotycz\u0105ce u\u017cycia raportu wyci\u0105gni\u0119te z Power BI to po prostu za ma\u0142o. Dane z \u201eusage report\u201d s\u0105 fajne, ale zagregowane do poziomu dziennego, a Activity logs trzeba przechowywa\u0107, bo znikaj\u0105. Nie da si\u0119 te\u017c wyci\u0105gn\u0105\u0107 np. u\u017cycia slicer\u00f3w. Mo\u017cemy zrobi\u0107 to lepiej!<\/p>\n<p align=\"justify\"><a href=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/pixel.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1577\" src=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/pixel.png\" alt=\"\" width=\"1200\" height=\"628\" srcset=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/pixel.png 1200w, https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/pixel-300x157.png 300w, https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/pixel-1024x536.png 1024w, https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/pixel-768x402.png 768w\" sizes=\"auto, (max-width: 1200px) 100vw, 1200px\" \/><\/a><\/p>\n<p align=\"justify\">Pozw\u00f3l, \u017ce przedstawi\u0119 Ci tracking pixel \u2013 rozwi\u0105zanie znane i nienawidzone w ca\u0142ym internecie. W skr\u00f3cie: dodaj\u0105c URL do obrazka o wielko\u015bci piksela zmuszamy Power BI do wys\u0142ania \u017c\u0105dania GET na adres URL, kt\u00f3ry w pe\u0142ni kontrolujemy. Zbieramy wszystkie parametry i zwracamy obrazek piksela.<\/p>\n<p align=\"justify\">Postawienie serwera WWW, kt\u00f3ry b\u0119dzie to obs\u0142ugiwa\u0142, mo\u017ce by\u0107 kosztowne, ale tutaj mo\u017cemy po prostu wykorzysta\u0107 serverless Logic App w Azure. Jest tanie i skalowalne, daj\u0105c nam pe\u0142n\u0105 kontrol\u0119 nad tym, co robimy z danymi.<\/p>\n<p align=\"justify\"><strong>Konfiguracja storage i zwracanie piksela<\/strong><\/p>\n<p align=\"justify\">Najpierw utw\u00f3rzmy konto storage na Azure. B\u0119dziemy tam zbiera\u0107 wszystkie dane. To naprawd\u0119 najprostsze rozwi\u0105zanie do przechowywania, ale zach\u0119cam do eksploracji SQL Server lub innych us\u0142ug.<\/p>\n<p align=\"justify\"><a href=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/image.png\"><img loading=\"lazy\" decoding=\"async\" style=\"margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;\" title=\"image\" src=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/image_thumb.png\" alt=\"image\" width=\"670\" height=\"229\" border=\"0\" \/><\/a><\/p>\n<p align=\"justify\">Nast\u0119pnie tworz\u0119 prost\u0105 logic app i zaczynam budowa\u0107 workflow. Pomys\u0142 jest prosty: u\u017cyjemy wyzwalacza HTTP, kt\u00f3ry da mi URL z parametrami w \u015brodku. Parametry b\u0119dziemy przekazywa\u0107 przy u\u017cyciu DAX.<\/p>\n<p align=\"justify\"><a href=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/image-1.png\"><img loading=\"lazy\" decoding=\"async\" style=\"border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;\" title=\"image\" src=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/image_thumb-1.png\" alt=\"image\" width=\"484\" height=\"373\" border=\"0\" \/><\/a><\/p>\n<p align=\"justify\">Nast\u0119pnie u\u017cywamy modu\u0142u compose, aby zbudowa\u0107 piksel png:<\/p>\n<p align=\"justify\"><a href=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/image-2.png\"><img loading=\"lazy\" decoding=\"async\" style=\"margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;\" title=\"image\" src=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/image_thumb-2.png\" alt=\"image\" width=\"486\" height=\"164\" border=\"0\" \/><\/a><\/p>\n<p align=\"justify\">`iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAAACnej3aAAAAAXRSTlMAQObYZgAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=`<\/p>\n<p align=\"justify\">to base64 reprezentuj\u0105cy piksel png.<\/p>\n<p align=\"justify\">Druga operacja compose konwertuje base64 na binarny:<\/p>\n<p align=\"justify\"><a href=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/image-3.png\"><img loading=\"lazy\" decoding=\"async\" style=\"border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;\" title=\"image\" src=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/image_thumb-3.png\" alt=\"image\" width=\"477\" height=\"181\" border=\"0\" \/><\/a><\/p>\n<p align=\"justify\">Skopiuj i wklej: `base64ToBinary(outputs(&#8216;Compose&#8217;))`<\/p>\n<p align=\"justify\">Teraz wszystko jest gotowe, by zwr\u00f3ci\u0107 piksel u\u017cytkownikowi. U\u017cywamy modu\u0142u Response. Body to output z Compose 2.<\/p>\n<p align=\"justify\"><a href=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/image-4.png\"><img loading=\"lazy\" decoding=\"async\" style=\"border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;\" title=\"image\" src=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/image_thumb-4.png\" alt=\"image\" width=\"490\" height=\"247\" border=\"0\" \/><\/a><\/p>\n<p align=\"justify\">I to ju\u017c dzia\u0142a! Je\u015bli wejdziesz w URL z wyzwalacza i wkleisz go w przegl\u0105darce, zobaczysz piksel!<\/p>\n<p align=\"justify\"><a href=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/image-5.png\"><img loading=\"lazy\" decoding=\"async\" style=\"margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;\" title=\"image\" src=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/image_thumb-5.png\" alt=\"image\" width=\"670\" height=\"173\" border=\"0\" \/><\/a><\/p>\n<p align=\"justify\">W historii uruchomie\u0144 zobaczysz tak\u017ce testowe warto\u015bci, kt\u00f3re zosta\u0142y podane w URL (zamiast warto\u015bci w nawiasach {}).<\/p>\n<p align=\"justify\"><a href=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/image-6.png\"><img loading=\"lazy\" decoding=\"async\" style=\"border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;\" title=\"image\" src=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/image_thumb-6.png\" alt=\"image\" width=\"648\" height=\"297\" border=\"0\" \/><\/a><\/p>\n<p align=\"justify\"><strong>Zapisywanie danych<\/strong><\/p>\n<p align=\"justify\">Teraz musimy jako\u015b zapisa\u0107 te parametry, a mo\u017ce te\u017c UserAgent, w storage. Ponownie \u2013 jest wiele sposob\u00f3w, ale stworzenie pliku na Blob to prawdopodobnie najprostsze.<\/p>\n<p align=\"justify\">Trzeci modu\u0142 Compose wyci\u0105gnie UserAgent:<\/p>\n<p align=\"justify\"><a href=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/image-7.png\"><img loading=\"lazy\" decoding=\"async\" style=\"margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;\" title=\"image\" src=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/image_thumb-7.png\" alt=\"image\" width=\"564\" height=\"188\" border=\"0\" \/><\/a><\/p>\n<p align=\"justify\">Kod do wklejenia: `triggerOutputs()[&#8216;headers&#8217;][&#8216;User-Agent&#8217;]`<\/p>\n<p align=\"justify\">Nast\u0119pnie modu\u0142 compose b\u0119dzie u\u017cyty do stworzenia prostego wiersza z wszystkimi danymi. Mi\u0119dzy elementami doda\u0142em \u201c|\u201d, kt\u00f3re pos\u0142u\u017c\u0105 jako delimitery.<\/p>\n<p align=\"justify\"><a href=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/image-8.png\"><img loading=\"lazy\" decoding=\"async\" style=\"border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;\" title=\"image\" src=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/image_thumb-8.png\" alt=\"image\" width=\"562\" height=\"197\" border=\"0\" \/><\/a><\/p>\n<p align=\"justify\">Dzi\u0119ki temu mo\u017cemy teraz przej\u015b\u0107 do tworzenia blobu na Blob Storage. Nazwa pliku b\u0119dzie losowa, aby mie\u0107 pewno\u015b\u0107, \u017ce \u017cadne dane nie zostan\u0105 nadpisane. Zawarto\u015b\u0107 pobierana jest z Compose 4.<\/p>\n<p align=\"justify\"><a href=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/image-9.png\"><img loading=\"lazy\" decoding=\"async\" style=\"border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;\" title=\"image\" src=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/image_thumb-9.png\" alt=\"image\" width=\"586\" height=\"320\" border=\"0\" \/><\/a><\/p>\n<p align=\"justify\">Po od\u015bwie\u017ceniu URL w przegl\u0105darce tworzony jest nowy plik:<\/p>\n<p align=\"justify\"><a href=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/image-10.png\"><img loading=\"lazy\" decoding=\"async\" style=\"margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;\" title=\"image\" src=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/image_thumb-10.png\" alt=\"image\" width=\"670\" height=\"148\" border=\"0\" \/><\/a><\/p>\n<p align=\"justify\"><strong>Power BI<\/strong><\/p>\n<p align=\"justify\">Teraz, gdy backend jest gotowy, czas przej\u015b\u0107 do tworzenia raportu. Plan jest prosty. Dwie strony, obie z tym samym parametrem what-if na slicerze. Pixel wyci\u0105gnie email u\u017cytkownika, nazw\u0119 raportu, nazw\u0119 strony i warto\u015b\u0107 slicera. Mo\u017cna to zmieni\u0107 zgodnie z wymaganiami. Jedynym limitem jest DAX, wi\u0119c sprawdzenie, czy slicery s\u0105 u\u017cywane, czy u\u017cytkownicy zaznaczaj\u0105 wiele warto\u015bci \u2013 wszystko to mo\u017ce by\u0107 \u015bledzone!<\/p>\n<p align=\"justify\">Pierwszy krok to stworzenie nowego raportu. U\u017cyjemy &#8220;enter data&#8221; i stworzymy prost\u0105 tabel\u0119. Dodatkowo stworzymy parametr what-if i dodamy slicer na stron\u0119:<\/p>\n<p align=\"justify\"><a href=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/image-11.png\"><img loading=\"lazy\" decoding=\"async\" style=\"margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;\" title=\"image\" src=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/image_thumb-11.png\" alt=\"image\" width=\"670\" height=\"232\" border=\"0\" \/><\/a><\/p>\n<p align=\"justify\">Nast\u0119pnie, u\u017cywaj\u0105c DAX stworzymy URL do Logic App, kt\u00f3r\u0105 wcze\u015bniej przygotowali\u015bmy. URL wyzwalacza znajduje si\u0119 w pierwszym bloku aplikacji:<\/p>\n<p align=\"justify\"><a href=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/image-12.png\"><img loading=\"lazy\" decoding=\"async\" style=\"border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;\" title=\"image\" src=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/image_thumb-12.png\" alt=\"image\" width=\"589\" height=\"157\" border=\"0\" \/><\/a><\/p>\n<p align=\"justify\">U\u017cywaj\u0105c wbudowanych funkcji DAX mo\u017cemy przekaza\u0107 zar\u00f3wno user principal name, jak i warto\u015b\u0107 parametru do URL:<\/p>\n<p align=\"justify\"><a href=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/image-13.png\"><img loading=\"lazy\" decoding=\"async\" style=\"border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;\" title=\"image\" src=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/image_thumb-13.png\" alt=\"image\" width=\"669\" height=\"53\" border=\"0\" \/><\/a><\/p>\n<p align=\"justify\">W \u201cMeasure tools\u201d bardzo wa\u017cne jest ustawienie Data Category na \u201cImage URL\u201d:<\/p>\n<p align=\"justify\"><a href=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/image-14.png\"><img loading=\"lazy\" decoding=\"async\" style=\"border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;\" title=\"image\" src=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/image_thumb-14.png\" alt=\"image\" width=\"373\" height=\"160\" border=\"0\" \/><\/a><\/p>\n<p align=\"justify\">Teraz, gdy dodamy t\u0119 miar\u0119 do tabeli, Power BI wy\u015ble zapytanie do URL i otrzyma piksel. Przeka\u017ce r\u00f3wnie\u017c wszystkie parametry, kt\u00f3re zostan\u0105 zapisane w blob storage.<\/p>\n<p align=\"justify\"><a href=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/image-15.png\"><img loading=\"lazy\" decoding=\"async\" style=\"border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;\" title=\"image\" src=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/image_thumb-15.png\" alt=\"image\" width=\"670\" height=\"137\" border=\"0\" \/><\/a><\/p>\n<p align=\"justify\">Widok ze Storage:<\/p>\n<p align=\"justify\"><a href=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/image-16.png\"><img loading=\"lazy\" decoding=\"async\" style=\"border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;\" title=\"image\" src=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/image_thumb-16.png\" alt=\"image\" width=\"662\" height=\"218\" border=\"0\" \/><\/a><\/p>\n<p align=\"justify\">Obraz b\u0119dzie od\u015bwie\u017cany za ka\u017cdym razem, gdy u\u017cytkownik wejdzie w interakcj\u0119 ze stron\u0105, co naturalnie umo\u017cliwia \u015bledzenie u\u017cycia raportu na du\u017co wy\u017cszym poziomie szczeg\u00f3\u0142owo\u015bci. Mo\u017cliwe jest nawet obliczanie wska\u017anika \u201eBounce rate\u201d \u2013 czyli ilu u\u017cytkownik\u00f3w zamkn\u0119\u0142o raport od razu po otwarciu.<\/p>\n<p align=\"justify\">Wymaga to jednak pewnej konserwacji. Ka\u017cda strona musi mie\u0107 osobn\u0105 miar\u0119 oraz tabel\u0119 z t\u0105 miar\u0105, dodan\u0105 i ukryt\u0105.<\/p>\n<p align=\"justify\"><a href=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/image-18.png\"><img loading=\"lazy\" decoding=\"async\" style=\"display: block; background-image: none;\" title=\"image\" src=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/image_thumb-17.png\" alt=\"image\" width=\"668\" height=\"156\" border=\"0\" \/><\/a><\/p>\n<p align=\"justify\">Jak wida\u0107 w tabeli, mo\u017cna wyci\u0105gn\u0105\u0107 zdecydowanie wi\u0119cej danych o sposobie u\u017cycia raportu. Nie polecam \u015bledzenia warto\u015bci miar, ale u\u017cycie funkcji takich jak `ISFILTERED()` czy `HASONEVALUE()` mo\u017ce da\u0107 cenne informacje o tym, jak raporty s\u0105 u\u017cywane. To rozwi\u0105zanie mo\u017ce by\u0107 postrzegane jako do\u015b\u0107 inwazyjne w niekt\u00f3rych organizacjach, wi\u0119c prosz\u0119 potwierdzi\u0107 podej\u015bcie z biznesem. Poza tym ograniczeniem jest tylko DAX!<\/p>\n<p align=\"justify\">Daj zna\u0107, co s\u0105dzisz,<\/p>\n<p align=\"justify\">Micha\u0142<\/p>\n<p align=\"justify\">\n","protected":false},"excerpt":{"rendered":"<p align=\"justify\">Zawsze czu\u0142em, \u017ce dane dotycz\u0105ce u\u017cycia raportu wyci\u0105gni\u0119te z Power BI to po prostu za ma\u0142o. Dane z \u201eusage report\u201d s\u0105 fajne, ale zagregowane do poziomu dziennego, a Activity logs trzeba przechowywa\u0107, bo znikaj\u0105. Nie da si\u0119 te\u017c wyci\u0105gn\u0105\u0107 np. u\u017cycia slicer\u00f3w. Mo\u017cemy zrobi\u0107 to lepiej!<\/p>\n<p align=\"justify\"><a href=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/pixel.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1577\" src=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/pixel.png\" alt=\"\" width=\"1200\" height=\"628\" srcset=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/pixel.png 1200w, https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/pixel-300x157.png 300w, https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/pixel-1024x536.png 1024w, https:\/\/cwiok.pl\/wp-content\/uploads\/2023\/04\/pixel-768x402.png 768w\" sizes=\"auto, (max-width: 1200px) 100vw, 1200px\" \/><\/a><\/p>\n<div class=\"tech_read_more\"><a href=\"https:\/\/cwiok.pl\/index.php\/pl\/2023\/04\/11\/szczegolowe-sledzenie-uzytkownika-historia-pixela\/\">Read More<\/a><\/div>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1581","post","type-post","status-publish","format-standard","hentry","category-bez-kategorii"],"_links":{"self":[{"href":"https:\/\/cwiok.pl\/index.php\/wp-json\/wp\/v2\/posts\/1581","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cwiok.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cwiok.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cwiok.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cwiok.pl\/index.php\/wp-json\/wp\/v2\/comments?post=1581"}],"version-history":[{"count":2,"href":"https:\/\/cwiok.pl\/index.php\/wp-json\/wp\/v2\/posts\/1581\/revisions"}],"predecessor-version":[{"id":1583,"href":"https:\/\/cwiok.pl\/index.php\/wp-json\/wp\/v2\/posts\/1581\/revisions\/1583"}],"wp:attachment":[{"href":"https:\/\/cwiok.pl\/index.php\/wp-json\/wp\/v2\/media?parent=1581"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cwiok.pl\/index.php\/wp-json\/wp\/v2\/categories?post=1581"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cwiok.pl\/index.php\/wp-json\/wp\/v2\/tags?post=1581"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}