diff --git a/identity-server/src/IdentityServer/Endpoints/AuthorizeEndpointBase.cs b/identity-server/src/IdentityServer/Endpoints/AuthorizeEndpointBase.cs
index faf3c16b4..8a608980e 100644
--- a/identity-server/src/IdentityServer/Endpoints/AuthorizeEndpointBase.cs
+++ b/identity-server/src/IdentityServer/Endpoints/AuthorizeEndpointBase.cs
@@ -241,7 +241,7 @@ internal abstract class AuthorizeEndpointBase : IEndpointHandler
response.Request.GrantType,
response.Request.AuthorizeRequestType,
response.AccessToken.IsPresent(),
- response.Request.AccessTokenType,
+ response.AccessToken.IsPresent() ? response.Request.AccessTokenType : null,
false,
ProofType.None,
response.IdentityToken.IsPresent());
diff --git a/identity-server/src/IdentityServer/Endpoints/TokenEndpoint.cs b/identity-server/src/IdentityServer/Endpoints/TokenEndpoint.cs
index 9a87ee13a..875ed27e5 100644
--- a/identity-server/src/IdentityServer/Endpoints/TokenEndpoint.cs
+++ b/identity-server/src/IdentityServer/Endpoints/TokenEndpoint.cs
@@ -141,7 +141,7 @@ internal class TokenEndpoint : IEndpointHandler
await _events.RaiseAsync(new TokenIssuedSuccessEvent(response, requestResult));
Telemetry.Metrics.TokenIssued(clientResult.Client.ClientId, requestResult.ValidatedRequest.GrantType, null,
- response.AccessToken.IsPresent(), requestResult.ValidatedRequest.AccessTokenType, response.RefreshToken.IsPresent(),
+ response.AccessToken.IsPresent(), response.AccessTokenType.IsPresent() ? requestResult.ValidatedRequest.AccessTokenType : null, response.RefreshToken.IsPresent(),
requestResult.ValidatedRequest.ProofType, response.IdentityToken.IsPresent());
LogTokens(response, requestResult);
diff --git a/identity-server/src/IdentityServer/Extensions/IClientStoreExtensions.cs b/identity-server/src/IdentityServer/Extensions/IClientStoreExtensions.cs
index a4e54f9e1..eb161bc00 100644
--- a/identity-server/src/IdentityServer/Extensions/IClientStoreExtensions.cs
+++ b/identity-server/src/IdentityServer/Extensions/IClientStoreExtensions.cs
@@ -22,7 +22,6 @@ public static class IClientStoreExtensions
var client = await store.FindClientByIdAsync(clientId);
if (client != null && client.Enabled)
{
- //Telemetry.Metrics.ClientLoaded(client);
return client;
}
diff --git a/identity-server/src/Telemetry/Telemetry.cs b/identity-server/src/Telemetry/Telemetry.cs
index 89adffaee..b1380a4a6 100644
--- a/identity-server/src/Telemetry/Telemetry.cs
+++ b/identity-server/src/Telemetry/Telemetry.cs
@@ -466,12 +466,12 @@ public static class Telemetry
/// Grant Type
/// Type of authorization request
/// Whether an access token was issued
- /// The type of access token issued (JWT or Reference)
+ /// The type of access token issued (Null if no access token was issued, otherwise JWT or Reference)
/// Whether a refresh token was issued
/// The proof type used (None, ClientCertificate, or DPoP)
/// Whether an id token was issued
public static void TokenIssued(string clientId, string grantType, AuthorizeRequestType? requestType,
- bool accessTokenIssued, AccessTokenType accessTokenType, bool refreshTokenIssued, ProofType proofType, bool idTokenIssued)
+ bool accessTokenIssued, AccessTokenType? accessTokenType, bool refreshTokenIssued, ProofType proofType, bool idTokenIssued)
{
Success(clientId);
TokenIssuedCounter.Add(1,
diff --git a/identity-server/test/IdentityServer.UnitTests/Licensing/v2/DiagnosticEntries/TokenIssueCountDiagnosticEntryTests.cs b/identity-server/test/IdentityServer.UnitTests/Licensing/v2/DiagnosticEntries/TokenIssueCountDiagnosticEntryTests.cs
index b02bda63a..38c09e80f 100644
--- a/identity-server/test/IdentityServer.UnitTests/Licensing/v2/DiagnosticEntries/TokenIssueCountDiagnosticEntryTests.cs
+++ b/identity-server/test/IdentityServer.UnitTests/Licensing/v2/DiagnosticEntries/TokenIssueCountDiagnosticEntryTests.cs
@@ -104,6 +104,24 @@ public class TokenIssueCountDiagnosticEntryTests
tokenIssueCounts.GetProperty("Refresh").GetInt64().ShouldBe(1);
}
+ [Fact]
+ public async Task Should_Handle_No_Token_Issued()
+ {
+ IssueToken("authorization_code", false, null, false, ProofType.None, false);
+
+ var result = await DiagnosticEntryTestHelper.WriteEntryToJson(_subject);
+
+ var tokenIssueCounts = result.RootElement.GetProperty("TokenIssueCounts");
+ tokenIssueCounts.GetProperty("Jwt").GetInt64().ShouldBe(0);
+ tokenIssueCounts.GetProperty("Reference").GetInt64().ShouldBe(0);
+ tokenIssueCounts.GetProperty("JwtPoPDPoP").GetInt64().ShouldBe(0);
+ tokenIssueCounts.GetProperty("JwtPoPmTLS").GetInt64().ShouldBe(0);
+ tokenIssueCounts.GetProperty("ReferencePoPDPoP").GetInt64().ShouldBe(0);
+ tokenIssueCounts.GetProperty("ReferencePoPmTLS").GetInt64().ShouldBe(0);
+ tokenIssueCounts.GetProperty("Refresh").GetInt64().ShouldBe(0);
+ tokenIssueCounts.GetProperty("Id").GetInt64().ShouldBe(0);
+ }
+
[Fact]
public async Task Should_Handle_Initial_Grant_Type_Count()
{
@@ -157,7 +175,7 @@ public class TokenIssueCountDiagnosticEntryTests
tokenIssueCounts.GetProperty("Refresh").GetInt64().ShouldBe(0);
}
- private void IssueToken(string grantType, bool accessTokenIssued, AccessTokenType accessTokenType, bool refreshTokenIssued,
+ private void IssueToken(string grantType, bool accessTokenIssued, AccessTokenType? accessTokenType, bool refreshTokenIssued,
ProofType proofType, bool idTokenIssued) =>
Duende.IdentityServer.Telemetry.Metrics.TokenIssued("ClientId", grantType, null, accessTokenIssued, accessTokenType, refreshTokenIssued, proofType, idTokenIssued);
}