cub-e.net

just coding...

Dynamics CRM ve Application Insights Entegrasyonu

Bircok Microsft Azure servisini Dynamics CRM ile entegre edebilmekteyiz. Bunlardan en guzel orneklerden birisi Application Insights ve Dynamics CRM birlikteligi. Bu makalede bu Application Insights ile Dynamics CRM'i nasil konusturacagimizi gorecegiz. Oncelikle Application Insights'in ne olduguyla baslayalim isterseniz. 
Visual Studio Application Insight bir telemetri servisidir yani bir sistemi detayli olarak incelemek sitediginizde ona veri gonderdginiz ve bu verileri detaylari bir sekilde grafikler ve tablolar halinde izlediginiz sonucunda rapolar alarak sisteminizin durumu hakkinda bilgiler edindiginiz bir hizmettir. Kisacasi size sisteminizin saglikli calisip calismadigi hakkinda olceklenebilir bilgiler vermektedir.
Dynamics CRM ise bir web tabanli uygulama oldugundan IIS uzerinde olusan web sayfasi goruntuleme taleplerini bunlarin suresini ve bu taleplerin kimden geldigini, hangi sayfalara bakildigini detayli olarak Application Insights'a aktarabiliriz.
Hadi baslayalim.

Azure icinde Application Insights kaynagi olusturalim

Azure hesabiniz yoksa bu adresten olusturabilirsiniz. Sisteme giris yaptiktan sonra Browse'a tikladiktan sonra Application Insights'i secenegini ile olusturma penceresini aciyoruz burada tek dikkat etmeniz gereken nokta Application Type seceneginde Asp.Net'i secmeniz gerekmekte. Gerekli bilgileri doldurdukran sonra Create dugmesiyle kendi Application Insights'inizi olusturabilirsiniz.



Bu noktadan sonra ekrandaki grafiklere tiklayarak her bir grafik bolumunun icinde o bolume nasil veri atabileceginize dair ornekler yer almakta.


JavaScript ile CRM icerisinden veri gonderelim

Dynamics CRM'i acip Ayarlar(Settings)>Ozellestirme(Customization)>Customize the System(Sistemi Ozellestir) bolumunden yeni Web Resource(Web Kaynagi) ekliyoruz.


Ben asagidaki kod parcasini kullaniyorum bu kod parcasi ile CRM icerisinden kullaniciyi ve islem yapilan entity'i(nesne) parametre olarak gonderiyorum.

var UserName;
var Alias;
var serverUrl;

function Getinfo() {
    var context;
    var UserID;
    var ODataPath;
    var selectFields = "$select=DomainName,FullName";

    context = Xrm.Page.context;
    serverUrl = context.getClientUrl();
    UserID = context.getUserId();
    ODataPath = serverUrl + "/XRMServices/2011/OrganizationData.svc";

    var retrieveUserReq = new XMLHttpRequest();
    retrieveUserReq.open("GET", ODataPath + "/SystemUserSet(guid'" + UserID + "')?" + selectFields, false);
    retrieveUserReq.setRequestHeader("Accept", "application/json");
    retrieveUserReq.setRequestHeader("Content-Type", "application/json; charset=utf-8");
    retrieveUserReq.onreadystatechange = function () {
        retrieveUserReqCallBack(this);
    };
    retrieveUserReq.send();
}

function retrieveUserReqCallBack(retrieveUserReq) {
    if (retrieveUserReq.readyState == 4 /* complete */) {
        if (retrieveUserReq.status == 200) {
            var retrievedUser = JSON.parse(retrieveUserReq.responseText).d;
            if (retrievedUser.FullName != null) {
                UserName = retrievedUser.FullName;
                Alias = retrievedUser.DomainName;
            }
        }
    }
}

function captureTelemetry() {
    var appInsights = window.appInsights || function (config) {
        function s(config) { t[config] = function () { var i = arguments; t.queue.push(function () { t[config].apply(t, i) }) } } var t = { config: config }, r = document, f = window, e = "script", o = r.createElement(e), i, u; for (o.src = config.url || "//az416426.vo.msecnd.net/scripts/a/ai.0.js", r.getElementsByTagName(e)[0].parentNode.appendChild(o), t.cookie = r.cookie, t.queue = [], i = ["Event", "Exception", "Metric", "PageView", "Trace"]; i.length;) s("track" + i.pop()); return config.disableExceptionTracking || (i = "onerror", s("_" + i), u = f[i], f[i] = function (config, r, f, e, o) { var s = u && u(config, r, f, e, o); return s !== !0 && t["_" + i](config, r, f, e, o), s }), t
    }({
        instrumentationKey: "Burayi degistirin"
    });

    window.appInsights = appInsights;
    appInsights.trackPageView(Xrm.Page.data.entity.getEntityName(), serverUrl, { User: Xrm.Page.context.getUserName(), DomainName: Alias });
    appInsights.trackEvent(Xrm.Page.data.entity.getEntityName());
}

function startPoint() {
    Getinfo();
    captureTelemetry();
}

Kodun icerisindeki "instrumentationKey: "Burayi degistirin"" bolumundeki instrumentationKey "Essentials" altinda bulabilirsiniz. 

Ben yukaridaki kodu Account(Firma) ve Contact(Contact) entity'lerinin onLoad event'lerine yerlestirdim.


Bunu yapmak icin form uzerindeki uc noktaya tikiiyoruz ve form duzenleyicisini aciyoruz. Form duzenleyicisi uzerinden Form Ozelliklerini aciyoruz ve biraz once eklemis oldugumuz js web kaynagini buradan seciyoruz ve ekliyoruz.


Yapmis oldugumuz degisiklikleri kaydedip formu yayinliyoruz,
Artik form her acildiginda  Application Insights'e veriler gidecektir. Benim demo sistemimden elde ettigim ekran goruntuleri asagidaki gibidir. AppInsights'a ilk girdigimde asagida goruldugu gibi bir ekran bizi karsilamakta. Sirasiyla bu kutucuklara tiklafdigimda detayli bilgileri almaktayim.


Request ve Response zamanlarini;

Kullanicinin sayfalari ne zaman hangi cihazdan cagirdigi ve yuklenme surelerini;


hangi formlarin ne kadar cagrildigini;


ve metadata bilgilerine;


yukarida goruldugu gibi ulasabilmekteyim. Bunun haricinde formlarda olusan hatalari ve kullanici detaylarini(geolocation gibi) da almaktayim. 

Application Insights hakkinda daha fazla bilgiye buradan ulasabilirsiniz.
Loading