Delen via


Probleemoplossing met Azure Diagnostics

In dit artikel worden informatie over probleemoplossing beschreven die relevant is voor het gebruik van Azure Diagnostics. Zie het overzicht van Azure Diagnostics voor meer informatie over Diagnostische gegevens.

Logische onderdelen

De onderdelen zijn:

  • Diagnostische invoegtoepassing startprogramma (DiagnosticsPluginLauncher.exe):hiermee wordt de extensie Diagnostische gegevens gestart. Het fungeert als het ingangspuntproces.
  • Diagnostische invoegtoepassing (DiagnosticsPlugin.exe):hiermee configureert, start en beheert u de levensduur van de bewakingsagent. Het is het belangrijkste proces dat wordt gestart door het startprogramma.
  • Bewakingsagent (MonAgent*.exe processen): bewaakt, verzamelt en draagt de diagnostische gegevens over.

Logboek-/artefactpaden

De volgende paden leiden tot enkele belangrijke logboeken en artefacten. In dit artikel verwijzen we naar deze informatie.

Azure Cloud Services

Artefact Pad
Azure Diagnostics-configuratiebestand %SystemDrive%\Packages\Plugins\Microsoft.Azure.Diagnostics.PaaSDiagnostics<version>\Config.txt
Logboekbestanden C:\Logs\Plugins\Microsoft.Azure.Diagnostics.PaaSDiagnostics<version>\
Lokaal archief voor diagnostische gegevens C:\Resources\Directory<CloudServiceDeploymentID>.<RoleName>. DiagnosticStore\WAD0107\Tables
Configuratiebestand voor agent bewaken C:\Resources\Directory<CloudServiceDeploymentID>.<RoleName>. DiagnosticStore\WAD0107\Configuration\MaConfig.xml
Azure Diagnostics-extensiepakket %SystemDrive%\Packages\Plugins\Microsoft.Azure.Diagnostics.PaaSDiagnostics<version>
Pad naar hulpprogramma voor logboekverzameling %SystemDrive%\Packages\GuestAgent\
MonAgentHost-logboekbestand C:\Resources\Directory<CloudServiceDeploymentID>.<RoleName>. DiagnosticStore\WAD0107\Configuration\MonAgentHost.<>seq_num.log

Virtuele machines

Artefact Pad
Azure Diagnostics-configuratiebestand C:\Packages\Plugins\Microsoft.Azure.Diagnostics.IaaSDiagnostics<version>\RuntimeSettings
Logboekbestanden C:\WindowsAzure\Logs\Plugins\Microsoft.Azure.Diagnostics.IaaSDiagnostics<DiagnosticsVersion>\
Lokaal archief voor diagnostische gegevens C:\WindowsAzure\Logs\Plugins\Microsoft.Azure.Diagnostics.IaaSDiagnostics<DiagnosticsVersion>\WAD0107\Tables
Configuratiebestand voor agent bewaken C:\WindowsAzure\Logs\Plugins\Microsoft.Azure.Diagnostics.IaaSDiagnostics<DiagnosticsVersion>\WAD0107\Configuration\MaConfig.xml
Statusbestand C:\Packages\Plugins\Microsoft.Azure.Diagnostics.IaaSDiagnostics<version>\Status
Azure Diagnostics-extensiepakket C:\Packages\Plugins\Microsoft.Azure.Diagnostics.IaaSDiagnostics<DiagnosticsVersion>
Pad naar hulpprogramma voor logboekverzameling C:\WindowsAzure\Logs\WaAppAgent.log
MonAgentHost-logboekbestand C:\WindowsAzure\Logs\Plugins\Microsoft.Azure.Diagnostics.IaaSDiagnostics<DiagnosticsVersion>\WAD0107\Configuration\MonAgentHost.<>seq_num.log

Metrische gegevens worden niet weergegeven in de Azure-portal

Diagnostische gegevens bieden metrische gegevens die kunnen worden weergegeven in Azure Portal. Als u problemen ondervindt met het zien van de gegevens in de portal, controleert u de WADMetrics\* tabel in het opslagaccount voor diagnostische gegevens om te zien of de bijbehorende metrische records aanwezig zijn en controleert u of de resourceprovider Microsoft.Insights is geregistreerd.

Hier is de PartitionKey tabel de resource-id, virtuele machine of virtuele-machineschaalset. RowKey is de naam van de metrische waarde. Dit wordt ook wel de naam van de prestatiemeteritem genoemd.

Als de resource-id onjuist is, controleert>u resource-id voor diagnostische configuratiegegevens>om te zien of de resource-id juist is ingesteld.

Als er geen gegevens zijn voor de specifieke metrische gegevens, controleert u De diagnostische configuratie>performanceCounter om te zien of de metrische waarde (prestatiemeteritem) is opgenomen. De volgende tellers worden standaard ingeschakeld:

  • \Processor(_Total)% processortijd
  • \Memory\Available Bytes
  • \ASP.NET Applications(Total)\Requests/Sec
  • \ASP.NET toepassingen(totaal)\Fouten totaal per seconde
  • \ASP.NET\Aanvragen in wachtrij
  • \ASP.NET\Aanvragen geweigerd
  • \Processor(w3wp)% processortijd
  • \Process(w3wp)\Privébytes
  • \Process(WaIISHost)% processortijd
  • \Process(WaIISHost)\Privébytes
  • \Process(WaWorkerHost)% processortijd
  • \Process(WaWorkerHost)\Privébytes
  • \Memory\Page Faults/sec
  • .NET CLR Memory(Global)% tijd in GC
  • \LogicalDisk(C:)\Schijf schrijven bytes per seconde
  • \LogicalDisk(C:)\Schijf lezen bytes per seconde
  • \LogicalDisk(D:)\Schijf schrijven bytes per seconde
  • \LogicalDisk(D:)\Schijf lezen bytes per seconde

Als de configuratie juist is ingesteld, maar u de metrische gegevens nog steeds niet kunt zien, gebruikt u de volgende richtlijnen om problemen op te lossen.

Azure Diagnostics start niet

Zie de DiagnosticsPluginLauncher.log - en DiagnosticsPlugin.log-bestanden op de locatie van de logboekbestanden die eerder zijn opgegeven voor informatie over waarom Diagnostische gegevens niet kunnen worden gestart.

Als deze logboeken aangeven Monitoring Agent not reporting success after launch, betekent dit dat er een fout is opgetreden bij het starten van MonAgentHost.exe. Bekijk de logboeken op de locatie die wordt aangegeven voor het MonAgentHost logboekbestand in de vorige sectie Virtuele machines.

De laatste regel van de logboekbestanden bevat de afsluitcode.

DiagnosticsPluginLauncher.exe Information: 0 : [4/16/2016 6:24:15 AM] DiagnosticPlugin exited with code 0

Als u een negatieve afsluitcode vindt, raadpleegt u de afsluitcodetabel in de sectie Verwijzingen.

Diagnostische gegevens worden niet geregistreerd bij Azure Storage

Bepaal of geen van de gegevens wordt weergegeven of of sommige van de gegevens worden weergegeven.

Diagnostische infrastructuurlogboeken

Diagnostische gegevens registreren alle fouten in de logboeken van de diagnostische infrastructuur. Zorg ervoor dat u het vastleggen van diagnostische infrastructuurlogboeken in uw configuratie hebt ingeschakeld. Vervolgens kunt u snel zoeken naar relevante fouten die worden weergegeven in de DiagnosticInfrastructureLogsTable tabel in uw geconfigureerde opslagaccount.

Er worden geen gegevens weergegeven

De meest voorkomende reden dat gebeurtenisgegevens helemaal niet worden weergegeven, is dat de gegevens van het opslagaccount onjuist zijn gedefinieerd.

Oplossing: Corrigeer de configuratie van diagnostische gegevens en installeer diagnostische gegevens opnieuw.

Als het opslagaccount correct is geconfigureerd, controleert u externe toegang tot de computer en controleert u of DiagnosticsPlugin.exe en MonAgentCore.exe worden uitgevoerd. Als ze niet worden uitgevoerd, volgt u de stappen in Azure Diagnostics niet.

Als de processen worden uitgevoerd, gaat u naar Wordt gegevens lokaal vastgelegd? en volgt u de instructies daar.

Als er nog steeds een probleem is, probeert u het volgende te doen:

  1. Verwijder de agent.
  2. Verwijder de map C:\WindowsAzure\Logs\Plugins\Microsoft.Azure.Diagnostics.IaaSDiagnostics.
  3. Installeer de agent opnieuw.

Een deel van de gegevens ontbreekt

Als u gegevens krijgt, maar niet alle, betekent dit dat de pijplijn voor het verzamelen/overdragen van gegevens correct is ingesteld. Volg de subsecties hier om het probleem te beperken.

Is de verzameling geconfigureerd?

De configuratie diagnostische gegevens bevat instructies voor een bepaald type gegevens dat moet worden verzameld. Controleer uw configuratie om te controleren of u alleen op zoek bent naar gegevens die u voor de verzameling hebt geconfigureerd.

Genereert de host gegevens?

  • Prestatiemeteritems: Open perfmon en controleer de teller.
  • Traceer logboeken: Externe toegang tot de VIRTUELE machine en voeg een TextWriterTraceListener toe aan het configuratiebestand van de app. Zie Trace-listeners maken en initialiseren om de tekstlistener in te stellen. Zorg ervoor dat het <trace> element <trace autoflush="true">. Als u geen traceringslogboeken ziet die worden gegenereerd, raadpleegt u de sectie 'Meer informatie over ontbrekende traceerlogboeken'.
  • EtW-traceringen (Event Tracing for Windows): Externe toegang tot de VM en installeer het Hulpprogramma PerfView. Voer in PerfView de opdracht File>User Command>Listen etwprovder1>etwprovider2 uit, enzovoort. De opdracht Listen is hoofdlettergevoelig en er kunnen geen spaties zijn tussen de door komma's gescheiden lijst met ETW-providers. Als de opdracht niet kan worden uitgevoerd, selecteert u Logboek rechtsonder in het hulpprogramma PerfView om te zien wat er is geprobeerd uit te voeren en wat het resultaat was. Ervan uitgaande dat de invoer juist is, wordt er een nieuw venster geopend. Binnen een paar seconden ziet u ETW-traceringen.
  • Gebeurtenislogboeken: Externe toegang tot de VIRTUELE machine. Open Logboeken en zorg ervoor dat de gebeurtenissen bestaan.

Worden gegevens lokaal vastgelegd?

Controleer vervolgens of de gegevens lokaal worden vastgelegd. De gegevens worden lokaal opgeslagen in *.tsf-bestanden in het lokale archief voor diagnostische gegevens. Verschillende soorten logboeken worden verzameld in verschillende .tsf-bestanden. De namen zijn vergelijkbaar met de tabelnamen in Azure Storage.

Prestatiemeteritems worden bijvoorbeeld verzameld in PerformanceCountersTable.tsf. Gebeurtenislogboeken worden verzameld in WindowsEventLogsTable.tsf. Gebruik de instructies in de sectie Lokale logboekextractie om de lokale verzamelingsbestanden te openen en te controleren of deze worden verzameld op schijf.

Als u geen logboeken ziet die lokaal worden verzameld en al hebt gecontroleerd of de host gegevens genereert, hebt u waarschijnlijk een configuratieprobleem. Controleer uw configuratie zorgvuldig.

Controleer ook de configuratie die is gegenereerd voor MonitoringAgent MaConfig.xml. Controleer of er een sectie is waarin de relevante logboekbron wordt beschreven. Controleer vervolgens of deze niet verloren gaat in de vertaling tussen de configuratie van diagnostische gegevens en de configuratie van de bewakingsagent.

Worden gegevens overgedragen?

Als u hebt gecontroleerd of de gegevens lokaal worden vastgelegd, maar u deze nog steeds niet ziet in uw opslagaccount, voert u de volgende stappen uit:

  • Controleer of u een correct opslagaccount hebt opgegeven en of u geen sleutels voor het opgegeven opslagaccount hebt geïmplementeerd. Voor Azure Cloud Services worden gebruikers soms niet bijgewerkt useDevelopmentStorage=true.
  • Controleer of het opgegeven opslagaccount juist is. Zorg ervoor dat u geen netwerkbeperkingen hebt om te voorkomen dat de onderdelen openbare opslageindpunten bereiken. Een manier om dat te doen, is externe toegang tot de computer en proberen om zelf iets naar hetzelfde opslagaccount te schrijven.
  • Ten slotte kunt u bekijken welke fouten worden gerapporteerd door de bewakingsagent. De bewakingsagent schrijft de logboeken in maeventtable.tsf, die zich in het lokale archief bevindt voor diagnostische gegevens. Volg de instructies in de sectie Lokale logboekextractie om dit bestand te openen. Probeer vervolgens te bepalen of er fouten zijn errors die duiden op het lezen van lokale bestanden naar de opslag.

Logboeken vastleggen en archiveren

Als u denkt aan contact opnemen met ondersteuning, kan het eerste zijn dat ze u vragen om logboeken van uw computer te verzamelen. U kunt tijd besparen door dat zelf te doen. Voer het CollectGuestLogs.exe hulpprogramma uit op het hulpprogramma voor logboekverzameling. Er wordt een .zip-bestand gegenereerd met alle relevante Azure-logboeken in dezelfde map.

Er zijn geen diagnostische gegevenstabellen gevonden

De tabellen in Azure Storage met ETW-gebeurtenissen worden benoemd met behulp van de volgende code:

        if (String.IsNullOrEmpty(eventDestination)) {
            if (e == "DefaultEvents")
                tableName = "WADDefault" + MD5(provider);
            else
                tableName = "WADEvent" + MD5(provider) + eventId;
        }
        else
            tableName = "WAD" + eventDestination;

Hier volgt een voorbeeld:

        <EtwEventSourceProviderConfiguration provider="prov1">
          <Event id="1" />
          <Event id="2" eventDestination="dest1" />
          <DefaultEvents />
        </EtwEventSourceProviderConfiguration>
        <EtwEventSourceProviderConfiguration provider="prov2">
          <DefaultEvents eventDestination="dest2" />
        </EtwEventSourceProviderConfiguration>
"EtwEventSourceProviderConfiguration": [
    {
        "provider": "prov1",
        "Event": [
            {
                "id": 1
            },
            {
                "id": 2,
                "eventDestination": "dest1"
            }
        ],
        "DefaultEvents": {
            "eventDestination": "DefaultEventDestination",
            "sinks": ""
        }
    },
    {
        "provider": "prov2",
        "DefaultEvents": {
            "eventDestination": "dest2"
        }
    }
]

Met deze code worden vier tabellen gegenereerd:

Gebeurtenis Tabelnaam
provider="prov1" <Gebeurtenis-id="1" /> WADEvent+MD5("prov1")+"1"
provider="prov1" <Event id="2" eventDestination="dest1" /> WADdest1
provider="prov1" <DefaultEvents /> WADDefault+MD5("prov1")
provider="prov2" <DefaultEvents eventDestination="dest2" /> WADdest2

Verwijzingen

Bekijk de volgende verwijzingen

Configuratie van diagnostische extensie controleren

De eenvoudigste manier om de configuratie van uw extensie te controleren, is door naar Azure Resource Explorer te gaan. Ga vervolgens naar de virtuele machine of cloudservice waar de diagnostische extensie (IaaSDiagnostics/PaaDiagnostics) zich bevindt.

U kunt ook extern bureaublad gebruiken op de computer en het configuratiebestand voor diagnostische gegevens bekijken dat wordt beschreven in de sectie Pad voor logboekartefacten.

Zoek in beide gevallen naar Microsoft.Azure.Diagnostics en het veld xmlCfg of WadCfg.

Als u op een virtuele machine zoekt en het veld WadCfg aanwezig is, betekent dit dat de configuratie de JSON-indeling heeft. Als het xmlCfg-veld aanwezig is, betekent dit dat de configuratie zich in XML bevindt en base64 is gecodeerd. U moet deze decoderen om de XML te zien die door Diagnostische gegevens is geladen.

Als u voor de cloudservicerol de configuratie van de schijf kiest, worden de gegevens met base64 gecodeerd. U moet deze decoderen om de XML te zien die door Diagnostische gegevens is geladen.

Afsluitcodes voor Azure Diagnostics-invoegtoepassing

De invoegtoepassing retourneert de volgende afsluitcodes:

Afsluitcode Beschrijving
0 Geslaagd.
-1 Algemene fout.
-2 Kan het RCF-bestand niet laden.

Deze interne fout mag alleen optreden als het startprogramma voor de gastagent handmatig onjuist wordt aangeroepen op de virtuele machine.

-3 Kan het configuratiebestand Diagnostische gegevens niet laden.

Oplossing: veroorzaakt door een configuratiebestand dat geen schemavalidatie doorgeeft. De oplossing is om een configuratiebestand te bieden dat voldoet aan het schema.

-4 Een ander exemplaar van de diagnostische gegevens van de bewakingsagent maakt al gebruik van de lokale resourcemap.

Oplossing: Geef een andere waarde op voor LocalResourceDirectory.

-6 Het startprogramma voor de gastagent heeft geprobeerd diagnostische gegevens te starten met een ongeldige opdrachtregel.

Deze interne fout mag alleen optreden als het startprogramma voor de gastagent handmatig onjuist wordt aangeroepen op de virtuele machine.

-10 De invoegtoepassing Diagnostische gegevens is afgesloten met een niet-verwerkte uitzondering.
-11 De gastagent kan het proces dat verantwoordelijk is voor het starten en bewaken van de bewakingsagent niet maken.

Oplossing: Controleer of er voldoende systeembronnen beschikbaar zijn om nieuwe processen te starten.

-101 Ongeldige argumenten bij het aanroepen van de diagnostische invoegtoepassing.

Deze interne fout mag alleen optreden als het startprogramma voor de gastagent handmatig onjuist wordt aangeroepen op de virtuele machine.

-102 Het invoegtoepassingsproces kan zichzelf niet initialiseren.

Oplossing: Controleer of er voldoende systeembronnen beschikbaar zijn om nieuwe processen te starten.

-103 Het invoegtoepassingsproces kan zichzelf niet initialiseren. Het logboekobject kan niet worden gemaakt.

Oplossing: Controleer of er voldoende systeembronnen beschikbaar zijn om nieuwe processen te starten.

-104 Kan het rcf-bestand dat is opgegeven door de gastagent niet laden.

Deze interne fout mag alleen optreden als het startprogramma voor de gastagent handmatig onjuist wordt aangeroepen op de virtuele machine.

-105 De invoegtoepassing Diagnostische gegevens kan het configuratiebestand Diagnostische gegevens niet openen.

Deze interne fout mag alleen optreden als de invoegtoepassing Diagnostische gegevens handmatig wordt aangeroepen op de virtuele machine.

-106 Kan het configuratiebestand Diagnostische gegevens niet lezen.

Dit wordt veroorzaakt door een configuratiebestand dat geen schemavalidatie doorgeeft.

Oplossing: Geef een configuratiebestand op dat voldoet aan het schema. Zie Configuratie van diagnostische extensie controleren voor meer informatie.

-107 De resourcemap die aan de bewakingsagent wordt doorgegeven, is ongeldig.

Deze interne fout mag alleen optreden als de bewakingsagent handmatig wordt aangeroepen op de virtuele machine.

-108 Kan het configuratiebestand Diagnostische gegevens niet converteren naar het configuratiebestand van de bewakingsagent.

Deze interne fout mag alleen optreden als de invoegtoepassing Diagnostische gegevens handmatig wordt aangeroepen met een ongeldig configuratiebestand.

-110 Algemene diagnoseconfiguratiefout.

Deze interne fout mag alleen optreden als de invoegtoepassing Diagnostische gegevens handmatig wordt aangeroepen met een ongeldig configuratiebestand.

-111 Kan de bewakingsagent niet starten.

Oplossing: Controleer of er voldoende systeembronnen beschikbaar zijn.

-112 Algemene fout.

Lokale logboekextractie

De bewakingsagent verzamelt logboeken en artefacten als .tsf bestanden. Het .tsf bestand kan niet worden gelezen, maar u kunt het als volgt converteren:.csv

<Azure diagnostics extension package>\Monitor\x64\table2csv.exe <relevantLogFile>.tsf

Er wordt een nieuw bestand met de naam <relevantLogFile>.csv gemaakt in hetzelfde pad als het bijbehorende .tsf bestand.

Notitie

U hoeft dit hulpprogramma alleen uit te voeren op het hoofdbestand .tsf (bijvoorbeeld PerformanceCountersTable.tsf). De bijbehorende bestanden (bijvoorbeeld PerformanceCountersTables_\*\*001.tsf, PerformanceCountersTables_\*\*002.tsf) worden automatisch verwerkt.

Meer informatie over ontbrekende traceringslogboeken

Notitie

De volgende informatie is voornamelijk van toepassing op Azure Cloud Services, tenzij u de DiagnosticsMonitorTraceListener toepassing hebt geconfigureerd die wordt uitgevoerd op uw IaaS-VM (Infrastructure as a Service).

  • Zorg ervoor dat de DiagnosticMonitorTraceListener is geconfigureerd in de web.config of app.config. Deze is standaard geconfigureerd in cloudserviceprojecten. Sommige klanten maken er echter commentaar van, waardoor de traceringsinstructies niet worden verzameld door Diagnostische gegevens.
  • Als logboeken niet worden geschreven vanuit de methode OnStart of Run, controleert u of diagnosticMonitorTraceListener zich in de app.config bevindt. De code bevindt zich standaard in de web.config, maar is alleen van toepassing op code die wordt uitgevoerd binnen w3wp.exe. U hebt deze dus nodig in app.config om traceringen vast te leggen die worden uitgevoerd in WaIISHost.exe.
  • Zorg ervoor dat u Diagnostics.Trace.TraceXXX gebruikt in plaats van Diagnostics.Debug.WriteXXX. De foutopsporingsinstructies worden verwijderd uit een release-build.
  • Zorg ervoor dat de gecompileerde code daadwerkelijk de Diagnostics.Trace-regels bevat. Gebruik Reflector, ildasm of ILSpy om te controleren. Diagnostics.Trace-opdrachten worden verwijderd uit het gecompileerde binaire bestand, tenzij u het voorwaardelijke compilatiesymbool TRACE gebruikt. Dit veelvoorkomende probleem treedt op wanneer u MSBuild gebruikt om een project te bouwen.

Bekende problemen en oplossingen

De volgende bekende problemen hebben oplossingen.

.NET 4.5-afhankelijkheid

De Azure Diagnostics-extensie voor Windows heeft een runtime-afhankelijkheid van .NET Framework 4.5 of hoger. Op het moment van schrijven zijn alle machines die zijn ingericht voor Azure Cloud Services en alle officiële installatiekopieën die zijn gebaseerd op Azure-VM's, .NET 4.5 of hoger geïnstalleerd.

Het is nog steeds mogelijk om een situatie te tegenkomen waarin u de Azure Diagnostics-extensie voor Windows probeert uit te voeren op een computer waarop .NET 4.5 of hoger niet is geïnstalleerd. Deze situatie treedt op wanneer u uw computer maakt op basis van een oude installatiekopie of momentopname, of wanneer u uw eigen aangepaste schijf meebrengt.

Dit probleem wordt over het algemeen weergegeven als afsluitcode 255 wanneer u DiagnosticsPluginLauncher.exe uitvoert . Fout treedt op vanwege de volgende niet-verwerkte uitzondering:

System.IO.FileLoadException: Could not load file or assembly 'System.Threading.Tasks, Version=1.5.11.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies

Risicobeperking: Installeer .NET 4.5 of hoger op uw computer.

Gegevens van prestatiemeteritems zijn beschikbaar in de opslag, maar worden niet weergegeven in de portal

In de portalervaring op de VM's worden standaard bepaalde prestatiemeteritems weergegeven. Als u de prestatiemeteritems niet ziet en u weet dat de gegevens worden gegenereerd omdat deze beschikbaar zijn in de opslag, controleert u het volgende:

  • Of de gegevens in de opslag meternamen in het Engels hebben. Als de namen van de tellers niet in het Engels staan, herkent de grafiek met metrische gegevens in de portal deze niet.

    • Beperking: wijzig de taal van de machine in Het Engels voor systeemaccounts. Selecteer hiervoor Configuratiescherm> Region>Administrator>Copy Settings. Schakel vervolgens het welkomstscherm en systeemaccounts uit, zodat de aangepaste taal niet wordt toegepast op het systeemaccount.
  • Als u jokertekens (*) gebruikt in de namen van uw prestatiemeteritems, kan de portal de geconfigureerde en verzamelde teller niet correleren wanneer de prestatiemeteritems naar de Azure Storage-sink worden verzonden.

    • Risicobeperking: Om ervoor te zorgen dat u jokertekens kunt gebruiken en de portal de (*) wilt laten uitbreiden, routeert u uw prestatiemeteritems naar de Azure Monitor-sink.