SharePoint-hely megfigyelése az Application Insights segítségével

Az Application Insights monitorozza az alkalmazások rendelkezésre állását, teljesítményét és használatát. Ez a cikk bemutatja, hogyan állíthatja be egy SharePoint-webhelyhez.

Megjegyzés

Biztonsági okokból nem adhatja hozzá közvetlenül a cikkben leírt szkriptet a SharePoint modern felhasználói felületének weblapjaihoz. Alternatív megoldásként a SharePoint-keretrendszer (SPFx) használatával létrehozhat egy egyéni bővítményt, amellyel telepítheti az Application Insightsot a SharePoint-webhelyekre.

Application Insights-erőforrás létrehozása

Az Azure Portalon hozzon létre egy új Application Insights-erőforrást. Az Alkalmazás típusa mezőben válassza a ASP.NET lehetőséget.

Képernyőkép a Tulajdonságok kiválasztásáról, a kulcs kiválasztásáról és a Ctrl+C billentyűkombinációról.

A megnyíló ablak az a hely, ahol megtekintheti az alkalmazás teljesítmény- és használati adatait. Amikor legközelebb bejelentkezik az Azure-ba, megjelenik egy csempe a kezdőképernyőn . Másik lehetőségként válassza a Tallózás lehetőséget a kereséshez.

A szkript hozzáadása a weblapokhoz

Az alábbi jelenlegi kódrészlet verziószáma "5": . A verzió kódolva van a kódrészletben a következőként sv:"#": . Az aktuális verzió a GitHubon is elérhető.

<!-- 
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>

Megjegyzés

A SharePoint URL-címe más modulformátumot "...\ai.2.gbl.min.js" használ (jegyezze fel a további .gbl.). Ez az alternatív modulformátum szükséges a szkriptek betöltésének sorrendje által okozott problémák elkerüléséhez. A probléma miatt az SDK nem inicializálódik, és a telemetriai események elvesztéséhez vezet.

A problémát az okozza requireJS , hogy az SDK előtt betöltött és inicializált.

Szúrja be a szkriptet minden <követni kívánt oldal /head> címkéje elé. Ha a webhelye rendelkezik főoldallal, a szkriptet elhelyezheti ott. Egy ASP.NET MVC-projektben például a következőt kell elhelyeznie View\Shared\_Layout.cshtml: .

A szkript tartalmazza a kialakítási kulcsot, amely a telemetriát az Application Insights-erőforrásra irányítja.

Kód hozzáadása webhely lapjaihoz

A kódot hozzáadhatja a főoldalhoz vagy az egyes oldalakhoz.

Főoldal

Ha szerkesztheti a webhely főoldalát, a webhely minden oldalához biztosíthatja a figyelést.

Nézze meg a főoldalt, és szerkessze a SharePoint Designer vagy bármely más szerkesztő használatával.

Képernyőkép, amely bemutatja, hogyan szerkesztheti a főoldalt a SharePoint Designer vagy egy másik szerkesztő használatával.

Adja hozzá a kódot a címke elé.

Képernyőkép a kód webhelylapra való felvételének helyéről.

Megjegyzés

2025. március 31-én megszűnik az eszközkulcsalapú betöltés támogatása. A rendszerállapotkulcs-betöltés továbbra is működni fog, de a továbbiakban nem biztosítunk frissítéseket vagy támogatást a funkcióhoz. Váltsa át a kapcsolati sztringeket az új képességek kihasználásához.

Különálló oldalak

Adott számú lap figyeléséhez adja hozzá a szkriptet egyesével a lapokhoz.

Szúrjon be egy kijelzőt, és ágyazza bele a kódrészletet.

Képernyőkép a szkript hozzáadásáról korlátozott számú oldal figyeléséhez.

Alkalmazás adatainak megtekintése

Helyezze ismét üzembe alkalmazását.

Térjen vissza az alkalmazáspanelre a Azure Portal.

Az első események megjelennek a Keresés nézetben.

Képernyőkép az alkalmazásban megtekinthető új adatokról.

Ha további adatokat vár, válassza a Frissítés néhány másodperc után lehetőséget.

A felhasználói azonosító rögzítése

A szabványos weblapkódrészlet nem rögzíti a SharePoint felhasználói azonosítóját, de ezt kis módosítással megteheti.

  1. Másolja ki az alkalmazás eszközkulcsát az Application Insights Essentials legördülő listájából.

    Képernyőkép az alkalmazás rendszerállapotának az Application Insights Essentials legördülő menüjéből történő másolásáról.

  2. A következő kódrészletben cserélje le a rendszerállapotkulcsot a következő kódrészletre XXXX .

  3. Ágyazza be a szkriptet a SharePoint alkalmazásába annak a kódrészletnek a helyére, amelyet a portálról töltött le.

    
    
    <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> 
    
    
    

Következő lépések