Monitorowanie witryny programu SharePoint za pomocą usługi Application Insights

Usługa Application Insights monitoruje dostępność, wydajność i użycie aplikacji. W tym artykule pokazano, jak skonfigurować ją dla witryny programu SharePoint.

Uwaga

Ze względu na obawy dotyczące zabezpieczeń nie można bezpośrednio dodać skryptu opisanego w tym artykule do stron internetowych w nowoczesnym środowisku użytkownika programu SharePoint. Alternatywnie możesz użyć SharePoint Framework (SPFx) do utworzenia rozszerzenia niestandardowego, którego można użyć do zainstalowania usługi Application Insights w witrynach programu SharePoint.

Tworzenie zasobu usługi Application Insights

W witrynie Azure Portal utwórz nowy zasób usługi Application Insights. W polu Typ aplikacji wybierz pozycję ASP.NET.

Zrzut ekranu przedstawiający wybieranie pozycji Właściwości, wybieranie klawisza i wybieranie klawisza Ctrl+C.

Otwarte okno to miejsce, w którym są wyświetlane dane dotyczące wydajności i użycia aplikacji. Następnym razem, gdy zalogujesz się do platformy Azure, zostanie wyświetlony kafelek na ekranie startowym . Alternatywnie wybierz pozycję Przeglądaj , aby go znaleźć.

Dodawanie skryptu do stron internetowych

Poniższy bieżący fragment kodu to wersja "5". Wersja jest zakodowana w fragmencie kodu jako sv:"#". Bieżąca wersja jest również dostępna w usłudze GitHub.

<!-- 
To collect user behavior analytics tools about your application, 
insert the following script into each page you want to track.
Place this code immediately before the closing </head> tag,
and before any other scripts. Your first data will appear 
automatically in just a few seconds.
-->
<script type="text/javascript">
!function(T,l,y){var S=T.location,k="script",D="instrumentationKey",C="ingestionendpoint",I="disableExceptionTracking",E="ai.device.",b="toLowerCase",w="crossOrigin",N="POST",e="appInsightsSDK",t=y.name||"appInsights";(y.name||T[e])&&(T[e]=t);var n=T[t]||function(d){var g=!1,f=!1,m={initialize:!0,queue:[],sv:"5",version:2,config:d};function v(e,t){var n={},a="Browser";return n[E+"id"]=a[b](),n[E+"type"]=a,n["ai.operation.name"]=S&&S.pathname||"_unknown_",n["ai.internal.sdkVersion"]="javascript:snippet_"+(m.sv||m.version),{time:function(){var e=new Date;function t(e){var t=""+e;return 1===t.length&&(t="0"+t),t}return e.getUTCFullYear()+"-"+t(1+e.getUTCMonth())+"-"+t(e.getUTCDate())+"T"+t(e.getUTCHours())+":"+t(e.getUTCMinutes())+":"+t(e.getUTCSeconds())+"."+((e.getUTCMilliseconds()/1e3).toFixed(3)+"").slice(2,5)+"Z"}(),iKey:e,name:"Microsoft.ApplicationInsights."+e.replace(/-/g,"")+"."+t,sampleRate:100,tags:n,data:{baseData:{ver:2}}}}var h=d.url||y.src;if(h){function a(e){var t,n,a,i,r,o,s,c,u,p,l;g=!0,m.queue=[],f||(f=!0,t=h,s=function(){var e={},t=d.connectionString;if(t)for(var n=t.split(";"),a=0;a<n.length;a++){var i=n[a].split("=");2===i.length&&(e[i[0][b]()]=i[1])}if(!e[C]){var r=e.endpointsuffix,o=r?e.location:null;e[C]="https://"+(o?o+".":"")+"dc."+(r||"services.visualstudio.com")}return e}(),c=s[D]||d[D]||"",u=s[C],p=u?u+"/v2/track":d.endpointUrl,(l=[]).push((n="SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details)",a=t,i=p,(o=(r=v(c,"Exception")).data).baseType="ExceptionData",o.baseData.exceptions=[{typeName:"SDKLoadFailed",message:n.replace(/\./g,"-"),hasFullStack:!1,stack:n+"\nSnippet failed to load ["+a+"] -- Telemetry is disabled\nHelp Link: https://go.microsoft.com/fwlink/?linkid=2128109\nHost: "+(S&&S.pathname||"_unknown_")+"\nEndpoint: "+i,parsedStack:[]}],r)),l.push(function(e,t,n,a){var i=v(c,"Message"),r=i.data;r.baseType="MessageData";var o=r.baseData;return o.message='AI (Internal): 99 message:"'+("SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details) ("+n+")").replace(/\"/g,"")+'"',o.properties={endpoint:a},i}(0,0,t,p)),function(e,t){if(JSON){var n=T.fetch;if(n&&!y.useXhr)n(t,{method:N,body:JSON.stringify(e),mode:"cors"});else if(XMLHttpRequest){var a=new XMLHttpRequest;a.open(N,t),a.setRequestHeader("Content-type","application/json"),a.send(JSON.stringify(e))}}}(l,p))}function i(e,t){f||setTimeout(function(){!t&&m.core||a()},500)}var e=function(){var n=l.createElement(k);n.src=h;var e=y[w];return!e&&""!==e||"undefined"==n[w]||(n[w]=e),n.onload=i,n.onerror=a,n.onreadystatechange=function(e,t){"loaded"!==n.readyState&&"complete"!==n.readyState||i(0,t)},n}();y.ld<0?l.getElementsByTagName("head")[0].appendChild(e):setTimeout(function(){l.getElementsByTagName(k)[0].parentNode.appendChild(e)},y.ld||0)}try{m.cookie=l.cookie}catch(p){}function t(e){for(;e.length;)!function(t){m[t]=function(){var e=arguments;g||m.queue.push(function(){m[t].apply(m,e)})}}(e.pop())}var n="track",r="TrackPage",o="TrackEvent";t([n+"Event",n+"PageView",n+"Exception",n+"Trace",n+"DependencyData",n+"Metric",n+"PageViewPerformance","start"+r,"stop"+r,"start"+o,"stop"+o,"addTelemetryInitializer","setAuthenticatedUserContext","clearAuthenticatedUserContext","flush"]),m.SeverityLevel={Verbose:0,Information:1,Warning:2,Error:3,Critical:4};var s=(d.extensionConfig||{}).ApplicationInsightsAnalytics||{};if(!0!==d[I]&&!0!==s[I]){var c="onerror";t(["_"+c]);var u=T[c];T[c]=function(e,t,n,a,i){var r=u&&u(e,t,n,a,i);return!0!==r&&m["_"+c]({message:e,url:t,lineNumber:n,columnNumber:a,error:i}),r},d.autoExceptionInstrumented=!0}return m}(y.cfg);function a(){y.onInit&&y.onInit(n)}(T[t]=n).queue&&0===n.queue.length?(n.queue.push(a),n.trackPageView({})):a()}(window,document,{
src: "https://js.monitor.azure.com/scripts/b/ai.2.gbl.min.js", // The SDK URL Source
// name: "appInsights", // Global SDK Instance name defaults to "appInsights" when not supplied
// ld: 0, // Defines the load delay (in ms) before attempting to load the sdk. -1 = block page load and add to head. (default) = 0ms load after timeout,
// useXhr: 1, // Use XHR instead of fetch to report failures (if available),
crossOrigin: "anonymous", // When supplied this will add the provided value as the cross origin attribute on the script tag
// onInit: null, // Once the application insights instance has loaded and initialized this callback function will be called with 1 argument -- the sdk instance (DO NOT ADD anything to the sdk.queue -- As they won't get called)
cfg: { // Application Insights Configuration
  instrumentationKey:"INSTRUMENTATION_KEY"
}});
</script>

Uwaga

Adres URL programu SharePoint używa innego formatu "...\ai.2.gbl.min.js" modułu (zwróć uwagę na dodatkowy .gblformat ). Ten alternatywny format modułu jest wymagany, aby uniknąć problemu spowodowanego kolejnością ładowania skryptów. Problem powoduje niepowodzenie inicjowania zestawu SDK i powoduje utratę zdarzeń telemetrii.

Problem jest spowodowany requireJS załadowaniem i zainicjowaniem go przed zestawem SDK.

Wstaw skrypt przed tagiem </head> każdej strony, którą chcesz śledzić. Jeśli witryna internetowa ma stronę główną, możesz umieścić tam skrypt. Na przykład w projekcie ASP.NET MVC należy umieścić go w View\Shared\_Layout.cshtmlpliku .

Skrypt zawiera klucz instrumentacji, który kieruje dane telemetryczne do zasobu usługi Application Insights.

Dodawanie kodu do stron witryny

Możesz dodać kod do strony głównej lub poszczególnych stron.

Strona główna

Jeśli możesz edytować stronę główną witryny, możesz zapewnić monitorowanie każdej strony w witrynie.

Zapoznaj się ze stroną główną i edytuj ją przy użyciu programu SharePoint Designer lub dowolnego innego edytora.

Zrzut ekranu przedstawiający sposób edytowania strony głównej przy użyciu programu SharePoint Designer lub innego edytora.

Dodaj kod przed tagiem .

Zrzut ekranu przedstawiający miejsce dodawania kodu do strony witryny.

Uwaga

31 marca 2025 r. zostanie zakończone świadczenie pomocy technicznej dla pozyskiwania klucza instrumentacji. Pozyskiwanie klucza instrumentacji będzie nadal działać, ale nie udostępnimy już aktualizacji ani obsługi funkcji. Przejście do parametrów połączenia w celu skorzystania z nowych możliwości.

Poszczególne strony

Aby monitorować ograniczony zestaw stron, dodaj skrypt oddzielnie do każdej strony.

Wstaw składnik Web Part i osadź w nim fragment kodu.

Zrzut ekranu przedstawiający dodawanie skryptu do monitorowania ograniczonego zestawu stron.

Wyświetlanie danych aplikacji

Ponownie wdróż aplikację.

Wróć do okienka aplikacji w Azure Portal.

Pierwsze zdarzenia są wyświetlane w obszarze Wyszukaj.

Zrzut ekranu przedstawiający nowe dane, które można wyświetlić w aplikacji.

Wybierz pozycję Odśwież po kilku sekundach, jeśli oczekujesz większej ilości danych.

Przechwytywanie identyfikatora użytkownika

Standardowy fragment kodu strony internetowej nie przechwytuje identyfikatora użytkownika z programu SharePoint, ale można to zrobić przy użyciu niewielkiej modyfikacji.

  1. Skopiuj klucz instrumentacji aplikacji z listy rozwijanej Essentials w usłudze Application Insights.

    Zrzut ekranu przedstawiający kopiowanie instrumentacji aplikacji z listy rozwijanej Essentials w usłudze Application Insights.

  2. Zastąp klucz instrumentacji dla XXXX elementu w poniższym fragmencie kodu.

  3. Osadź skrypt w aplikacji programu SharePoint zamiast fragmentu kodu pobranego z portalu.

    
    
    <SharePoint:ScriptLink ID="ScriptLink1" name="SP.js" runat="server" localizable="false" loadafterui="true" /> 
    <SharePoint:ScriptLink ID="ScriptLink2" name="SP.UserProfiles.js" runat="server" localizable="false" loadafterui="true" /> 
    
    <script type="text/javascript"> 
    var personProperties; 
    
    // Ensure that the SP.UserProfiles.js file is loaded before the custom code runs. 
    SP.SOD.executeOrDelayUntilScriptLoaded(getUserProperties, 'SP.UserProfiles.js'); 
    
    function getUserProperties() { 
        // Get the current client context and PeopleManager instance. 
        var clientContext = new SP.ClientContext.get_current(); 
        var peopleManager = new SP.UserProfiles.PeopleManager(clientContext); 
    
        // Get user properties for the target user. 
        // To get the PersonProperties object for the current user, use the 
        // getMyProperties method. 
    
        personProperties = peopleManager.getMyProperties(); 
    
        // Load the PersonProperties object and send the request. 
        clientContext.load(personProperties); 
        clientContext.executeQueryAsync(onRequestSuccess, onRequestFail); 
    } 
    
    // This function runs if the executeQueryAsync call succeeds. 
    function onRequestSuccess() { 
    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:"XXXX"
        });
        window.appInsights=appInsights;
        appInsights.trackPageView(document.title,window.location.href, {User: personProperties.get_displayName()});
    } 
    
    // This function runs if the executeQueryAsync call fails. 
    function onRequestFail(sender, args) { 
    } 
    </script> 
    
    
    

Następne kroki