SG-JAMF Software Usage インポート: スケジュール、構成、およびデータフローIssue <!-- /*NS Branding Styles*/ --> .ns-kb-css-body-editor-container { p { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } span { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } h2 { font-size: 24pt; font-family: Lato; color: var(--now-color--text-primary, black); } h3 { font-size: 18pt; font-family: Lato; color: var(--now-color--text-primary, black); } h4 { font-size: 14pt; font-family: Lato; color: var(--now-color--text-primary, black); } a { font-size: 12pt; font-family: Lato; color: var(--now-color--link-primary, #00718F); } a:hover { font-size: 12pt; color: var(--now-color--link-primary, #024F69); } a:target { font-size: 12pt; color: var(--now-color--link-primary, #032D42); } a:visited { font-size: 12pt; color: var(--now-color--link-primary, #00718f); } ul { font-size: 12pt; font-family: Lato; } li { font-size: 12pt; font-family: Lato; } img { display: ; max-width: ; width: ; height: ; } } SG-JAMF Software Usage データのロードおよび変換プロセスの説明 Release<!-- /*NS Branding Styles*/ --> .ns-kb-css-body-editor-container { p { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } span { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } h2 { font-size: 24pt; font-family: Lato; color: var(--now-color--text-primary, black); } h3 { font-size: 18pt; font-family: Lato; color: var(--now-color--text-primary, black); } h4 { font-size: 14pt; font-family: Lato; color: var(--now-color--text-primary, black); } a { font-size: 12pt; font-family: Lato; color: var(--now-color--link-primary, #00718F); } a:hover { font-size: 12pt; color: var(--now-color--link-primary, #024F69); } a:target { font-size: 12pt; color: var(--now-color--link-primary, #032D42); } a:visited { font-size: 12pt; color: var(--now-color--link-primary, #00718f); } ul { font-size: 12pt; font-family: Lato; } li { font-size: 12pt; font-family: Lato; } img { display: ; max-width: ; width: ; height: ; } } Service Graph Connector for JAMF バージョン 2.12.1 以降 Resolution<!-- /*NS Branding Styles*/ --> .ns-kb-css-body-editor-container { p { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } span { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } h2 { font-size: 24pt; font-family: Lato; color: var(--now-color--text-primary, black); } h3 { font-size: 18pt; font-family: Lato; color: var(--now-color--text-primary, black); } h4 { font-size: 14pt; font-family: Lato; color: var(--now-color--text-primary, black); } a { font-size: 12pt; font-family: Lato; color: var(--now-color--link-primary, #00718F); } a:hover { font-size: 12pt; color: var(--now-color--link-primary, #024F69); } a:target { font-size: 12pt; color: var(--now-color--link-primary, #032D42); } a:visited { font-size: 12pt; color: var(--now-color--link-primary, #00718f); } ul { font-size: 12pt; font-family: Lato; } li { font-size: 12pt; font-family: Lato; } img { display: ; max-width: ; width: ; height: ; } } 概要: SG-JAMF SAMP Usage の動作 SG-JAMF Software Usage インポートは、Jamf 環境からアプリケーション使用状況データを収集し、それを ServiceNow の Software Asset Management Professional(SAMP)テーブルへ処理します。このデータは、使用頻度が低いソフトウェア、最近使用されていないソフトウェア、またはまったく使用されていないソフトウェアを特定するために使用され、ライセンス回収の判断を可能にします。 このプロセスには 3 つのステージ、複数のテーブル、および 2 種類の回収ルールが含まれます。正しい構成のためには、エンドツーエンドのフローを理解することが重要です。 さらに進む前に、SAM Pro と SGC-JAMF が Usage レコードをどのように使用するかを明確にしておく価値があります。 SAM Pro は使用状況を構造的に異なる 2 つの方法で追跡しており、それらは時間に関して異なる動作をします。 last_used_date — Primary key: (device/user, product)、キーに月/年は含まれません。last_used_time.を設定します。ソフトウェアが最後に使用された単一の最新時点を表します。timekey 制約を受けません(PRB2067966 修正時点)。 total_usage — Primary key: (device/user, product, month, year)。 total_usage_time / usage_count を設定します。特定の完了済みカレンダー月の集計使用状況を表します。設計上 timekey 制約を受け、この動作は変更されません。 ほとんどのお客様はほぼ exclusively に last_used_date を使用しており、total_usage ルールは比較的まれです。この記事全体を通してこの違いを念頭に置いてください。以下で説明する制約のいくつかは、一方にのみ適用され、もう一方には適用されません。 ステージ 1: JAMF からステージングテーブルへデータをロード 関数: loadSoftwareUsages() 実行内容: JAMF API に接続し、getComputerStream() を使用してすべてのコンピューターを取得し、各コンピューターについて getSoftwareUsages() を呼び出してそのコンピューターのアプリケーション使用状況データを取得します。ユーザー名は JAMF のコンピューターレコード(computer.username)から取得されます。各アプリケーションの使用状況データは、個別レコードとしてステージングテーブルへ挿入されます。 このステージ中の主な動作: コンピューターベースの反復: インポートは JAMF 内のすべてのコンピューターを反復処理します。各コンピューターについて、JAMF Classic API (/JSSResource) 経由でソフトウェア使用状況を取得します。コンピューターの username と UDID はすべての使用状況レコードへ付与されます。コンピューターに JAMF でユーザーが割り当てられていない場合、username フィールドは空となり、処理中のユーザー照合に失敗します。回収ルールチェック: データをロードする前に、スクリプトは _isAnyReclamationRuleExists() により ANY 回収ルール(total_usage または last_used_date)が存在するか確認します。ルールがまったく存在しない場合、インポート全体は直ちにスキップされます。各アプリケーションについて _isReclamationRuleExists() を確認し、アプリ名に対していずれかのルールタイプが存在すると true を返します。一致するアプリのみがステージングテーブルへロードされます。ソース由来の timekey: 各レコードの timekey は _getTimeKeyDataSource() によって JAMF データの日付から解析されます。たとえば JAMF 日付 "2026/1/15" は timekey "202601" を生成します。単一のインポートバッチには、複数のカレンダー月にわたる使用状況が正当に含まれる場合があります。JAMF API に要求される日付範囲は getLastRunDatetime() - 1 day から本日までです。デバイスが一定期間オフラインだった場合(修理、保管、同期漏れなど)、または接続がしばらく実行されていなかった場合、このウィンドウ、したがってバッチは数か月に及ぶ可能性があります。通常のケースでも、実行間の意図的な 1 日の重複により、月境界付近のバッチには 2 か月分の行が含まれることがよくあります。これは想定された動作であり、PRB2067966 修正以降は last_used_date に対して正しく処理されます。 テーブル名前ロールステージングテーブルsn_jamf_integrate_jamf_software_usage timekey、アプリ名、ユーザー名、UDID、フォアグラウンド時間、使用回数を含む JAMF の生使用状況データ ステージ 2: データ処理(processSW) 関数: processSW() これはデータロード後に実行されるメイン処理パイプラインです。4 つの処理を順番に実行します。 ステップ 2a — 期限切れデータのクリーンアップ: 6 か月より古い使用状況内訳レコードを削除します(MONTH_COVERAGE = 6)。削除による影響を受けた製品を特定し、再集計を行います。 ステップ 2b — 内訳テーブルへのデータ移動(moveDataToUsageBreakdown): ステージングテーブルから読み取り、デフォルト timekey(現在月 - 1)によってフィルタリングします。各レコードについてユーザーと CI を検証し、アプリケーションに対して total_usage 回収ルールが存在するか確認します。すべての条件を満たした場合、SG-JAMF Software Usage Breakdown テーブル内のレコードを作成または更新し、フォアグラウンド時間と使用回数を集計します。この timekey フィルターは変更されておらず、意図されたものです。SAM Pro の回収エンジンは、total_usage を完全に終了したカレンダー月に対してのみ評価します。これは SAM Pro 製品チームによって確認されています。これは回避すべき制限ではなく、この回収タイプに対する設計どおりの正しい動作です。また、Service Graph Connector 間で一貫しています(SG-JAMF と SG-SCCM はこの設計を共有しています)。 ステップ 2c — 使用状況テーブルへの内訳データ集計(aggregateDataToUsage): 集計対象となるすべての変更済みレコードを、製品、ユーザー、および CI ごとに集計します。SAMP Software Usage テーブル(samp_sw_usage)に reclamation_type = "total_usage" を持つレコードを作成または更新します。これにより、総使用時間に基づくライセンス回収に使用される最終的な使用状況レコードが生成されます。 ステップ 2d — 最終使用時刻の挿入(_insertLastUsedTime): 現在のインポートセット内のすべてのレコードを読み取ります。PRB2067966 の修正以降、このステップは timekey によるフィルタリングを行いません。以前は total_usage パスと同様の「現在月 - 1」のバケットに制限されていました。そのため、同じバッチ内の他の月の使用状況は、last_used_date が主キーに月の要素を持たず、単一の最新使用日時を反映することを意図しているにもかかわらず、無視されていました。各レコードについて、アプリケーションに対して "last_used_date" 回収ルールが存在するか確認します。ルールが存在する場合、SAMP Software Usage テーブル(samp_sw_usage)に reclamation_type = "last_used_date" を持つレコードを作成または更新します。month_used/year はバッチ全体に対する単一値ではなく、その行自身の使用日付から導出されます。また、最新使用日時を追跡し、last_used_time は常により新しい日時にのみ更新され、古い日時に戻ることはありません。 関連テーブル テーブル名前目的ステージングテーブルsn_jamf_integrate_jamf_software_usage timekey、アプリ名、ユーザー、UDID、および使用量メトリクスを含む JAMF から取り込まれた生データ ブレークダウンテーブルsn_jamf_sw_usage_breakdown アプリケーション/ユーザー/CI の組み合わせごとに検証・集計された使用状況データを保持する中間テーブル 使用テーブルsamp_sw_usage ライセンス回収の判断に使用される最終的な SAMP 使用状況レコードを保持します。total_usage と last_used_date の両方のレコードタイプを含みます。 製品プロセスsamp_sw_product_process JAMF のアプリケーションファイル名と ServiceNow ソフトウェア製品を関連付けます。 データフロー図 JAMF API │ ├── getComputerStream() → Get all computers │ │ For EACH computer: │ ├── getSoftwareUsages(computer.id) │ │ → Fetches apps used on this computer │ ├── username = computer.username (from JAMF) │ ├── udid = computer.udid │ │ │ └── For EACH app: │ Check _isReclamationRuleExists(app.name) │ If rule exists → Insert into staging table │ Set timekey from JAMF date ▼ Staging Table (sn_jamf_integrate_jamf_software_usage) │ ├── moveDataToUsageBreakdown() │ - Filters by timekey (current month - 1) │ - Checks "total_usage" reclamation rules │ - Validates user + CI ▼ Breakdown Table (sn_jamf_sw_usage_breakdown) │ ├── aggregateDataToUsage() │ - Groups by product/user/CI │ - SUMs usage time and counts ▼ Usage Table (samp_sw_usage) → reclamation_type = "total_usage" Staging Table (read again) │ ├── _insertLastUsedTime() │ - Reads entire import set, NOT filtered by timekey [UPDATED - PRB2067966] │ - Checks "last_used_date" reclamation rules │ - Validates user + CI | - Month_used/year derived per-row from that row's own date ▼ Usage Table (samp_sw_usage) → reclamation_type = "last_used_date" 回収ルールタイプ SG-JAMF Software Usage インポートでは、2 種類の回収ルールを使用します。どちらも初期データロード時に確認されますが、処理における目的は異なります。 タイプチェック日時 作成されるレコード 追跡内容 適用対象 total_usageloadSoftwareUsages() および moveDataToUsageBreakdown()reclamation_type = "total_usage" アプリケーション/ユーザー/CI ごとの月次総フォアグラウンド使用時間および使用回数 インストール済みソフトウェアlast_used_dateloadSoftwareUsages() および _insertLastUsedTime()reclamation_type = "last_used_date" アプリケーション/ユーザー/CI ごとの最新使用日 インストール済みソフトウェア、サブスクリプションソフトウェア 初期データロード(loadSoftwareUsages)中に、スクリプトは各アプリケーションに対して _isReclamationRuleExists() を確認します。この関数は total_usage または last_used_date のいずれかのルールが存在する場合に true を返します。つまり、アプリケーションがステージングテーブルへロードされるにはいずれか一方のルールタイプがあれば十分ですが、その後の処理で使用されるには対応するルールタイプが必要です。 回収ルールとアプリケーションの照合方法 スクリプトは初期化時に次の処理を行い、ファイル名の検索マップを構築します。 各ルールタイプについて samp_m2m_rule_product を照会し、回収ルールを取得するリンクされた各ソフトウェア製品について、samp_sw_product_process のアクティブなファイル名レコードを照会する処理中に高速参照するため、file_name → file_name のマップを構築する 特定のルールタイプに対して製品またはファイル名が見つからない場合、その回収ルールタイプの検索マップは undefined に設定され、そのタイプについては処理中にすべてのアプリケーションがスキップされます。 インポートスケジュール: 正しい処理のための推奨タイミング 問題 SG-JAMF Software Usage インポート実行後、SAMP Software Usage テーブルおよび SG-JAMF Software Usage Breakdown テーブルにレコードが作成されません。インポートは正常に完了したように見えますが、処理中にデータがサイレントにスキップされます。エラーメッセージは生成されません。 この症状自体は、PRB2067966 修正以降は total_usage レコードにのみ関連します。last_used_date レコードは以下で説明する timekey フィルターの影響を受けなくなっており、適切な回収ルールが存在する限り、インポート実行タイミングに関係なく処理されます。環境が主に last_used_date に依存している場合(ほとんどのお客様が該当します)、この「レコードが作成されない」という症状はそのデータには適用されません。以下のガイダンスは total_usage 固有のものとして扱ってください。 原因: Timekey 不一致(total_usage のみ) 処理ステップ(moveDataToUsageBreakdown)は、現在月 - 1 として計算されたデフォルト timekey によってステージングテーブルをフィルタリングします。JAMF データ由来の timekey がデフォルト値と一致するレコードのみが total_usage 用として処理されます。対象外レコードはエラーにならず pending 状態のまま残るため、データが削除されたように見える場合がありますが、実際には一致する月に到達していないだけです。 正しいスケジュール SG-Jamf Software Usage のコネクターの標準スケジュールは Daily(毎日)であり、Daily は完全にサポートされた正しいスケジュールです。これは上記で説明した timekey の設計と競合しません。この記事の以前のバージョンでは、毎月 1 日または 2 日の Monthly 実行を推奨していましたが、これは過度に制限的であり、提供されているデフォルト設定と一致していませんでした。実際の要件は、「1 日または 2 日にのみ実行する」よりも限定的です。 要件: インポートは、ある月が終了した後で、SAM Pro の月次回収評価ジョブ(SAM - Identifying New Reclamation Candidates)が実行される前に、少なくとも 1 回正常に実行される必要があります。このジョブはデフォルトで毎月 3 日に実行されます(KB1632448 を参照)。これにより、その月の total_usage データが moveDataToUsageBreakdown() および aggregateDataToUsage() を経由して処理され、回収候補が評価される前に反映される機会が得られます。 Daily スケジュールでは、この要件は自動的に満たされます。月 N の間にロードされた使用状況データは、月 N+1 に入るまで一致する timekey を持ちません。その時点で実行される moveDataToUsageBreakdown() によって処理されます。翌月 3 日より前に少なくとも 1 回実行されればよく、Daily スケジュールでは常にこれが満たされます。 Weekly スケジュールは、この用途には推奨されません。ServiceNow の Weekly スケジュールは固定曜日(例: 毎週水曜日)であり、固定曜日の日付は月ごとに変動します。ある月におけるその曜日の最初の出現日は、カレンダーの並びによって 1 日から 7 日までのいずれにもなり得ます。 そのため、Weekly スケジュールは毎月確実に 3 日以前に実行されるよう構成することができません。ある月では要件を満たし、別の月では満たさなくなります。これは理論上の話ではありません。実際のテストインスタンスでは Weekly の SG-Jamf Software Usage 接続が調査対象月の 5 日に実行されており、回収ジョブの 3 日実行後になっていました。 すでに Weekly スケジュールを使用している場合は、実行日をカレンダー変更に応じて継続的に確認する必要があります。Daily のような「一度設定したら放置できる」オプションではありません。 設定推奨値実行頻度Daily(標準設定: run_type: daily。Weekly はこの用途には推奨されません。詳細は上記を参照してください。すでに Weekly を使用している場合は、カレンダー変更に応じて 3 日との位置関係を継続的に確認する必要があります。 特定インスタンスでのスケジュール整合性の確認 単一のステージングテーブルは複数の地域別データソース接続で共有される場合があるため(例: SG-Jamf Software Usage、- DE、- ES、- TR、- GB、- GB Pro)、どれが「アクティブ」であるかを推測しないでください。直接確認してください。 対象の sys_import_set レコードを開き、Data source フィールドを確認します。これにより、そのバッチを担当した正確な接続が分かります。対応する Scheduled Data Import レコードを確認します(Application = Service Graph Connector for Jamf、および Data source フィルターで対象名を指定)。Run の頻度、および Weekly の場合は実行曜日を確認します。SAM - Identifying New Reclamation Candidates のスケジュールと比較します(System Scheduler > Scheduled Jobs で name LIKE SAM を指定)。デフォルトでは Run: Monthly、Day: 3 です。使用状況インポートが Weekly スケジュールの場合は、Daily(コネクターのデフォルト)へ変更します。固定曜日の日付は月ごとに変動するため、どの曜日を選択しても毎月確実に 3 日以前になることは保証できません。信頼できる解決策は Daily のみであり、別の曜日へ変更することではありません。 例:スケジュールのタイミングの影響 インポート実行日デフォルトのTimekeyJAMF データ日付ソース時間キー結果2026 年 2 月 2 日202601主に 1 月の日付202601✅ 一致 ― レコードが処理される。2026 年 2 月 15 日2026011 月と 2 月の日付の組み合わせ202601と202602⚠ バージョン 2.16 より前では部分処理 ― 1 月のレコードのみ処理される。 PRB2067966 以降、last_used_date については 1 月と 2 月のすべてのレコードが処理される。2026 年 2 月 28 日202601主に 2 月の日付202602❌ 不一致 ― ほとんどのレコードがサイレントにスキップされる。 Timekey の計算方法 ソース Timekey — _getTimeKeyDataSource(): 各 JAMF 使用状況レコードの日付フィールドを解析し、年 + ゼロ埋め月を抽出します。たとえば "2026/1/15" は "202601" を生成します。 デフォルト Timekey — getTimeKeyToPull(): 現在のシステム日付から GlideDateTime.addMonthsUTC(-1) を使用して 1 か月減算し、その年および月を抽出します。たとえば 2026 年 2 月 12 日に実行すると "202601" が生成されます。 一致フィルター: moveDataToUsageBreakdown() のみが addQuery("u_time_key", timeKeyToPull) を使用してステージングテーブルをフィルタリングします。PRB2067966 以降、_insertLastUsedTime() はこのフィルターを適用しません。timekey に関係なく現在のインポートセット内のすべてのレコードを処理します。この違いは当該修正以前には存在せず、以前のコネクターバージョンでは両方の関数に同じフィルターが適用されていました。 インポートを実行する前の前提条件 コンピューターに JAMF 上でユーザーが割り当てられている必要があります。ソフトウェア使用状況インポートはコンピューターベースで動作します。スクリプトは getComputerStream() を呼び出して JAMF のすべてのコンピューターを反復処理し、それぞれについて getSoftwareUsages() を呼び出して使用状況データを取得します。ユーザー名は別のユーザー検索ではなく、JAMF の computer.username から直接取得されます。JAMF でユーザーが割り当てられていない場合、username は null または空となり、ユーザー照合に失敗するため、レコードはサイレントにスキップされます。使用状況追跡が必要なすべてのコンピューターに対して、事前にユーザーを割り当ててください。最初に SG-JAMF Computers インポートを実行する必要があります。コンピューター CI インポートは、ソフトウェア使用状況インポートより前に完了している必要があります。処理中、スクリプトは findComputer() により sys_object_source を検索し、name = "SG-JAMF" および id = instanceName|UDID を使用して CI を照合します。コンピューター CI が ServiceNow に取り込まれていない場合、CI 照合は失敗し、レコードはスキップされます。回収ルールを構成しておく必要があります。少なくとも 1 つの回収ルール(total_usage または last_used_date)が存在する必要があります。存在しない場合、インポート全体が _isAnyReclamationRuleExists() によって開始時点でスキップされます。追跡対象アプリケーションについては、適切なタイプの回収ルールが存在し、samp_sw_product_process テーブルにアプリケーションのファイル名が登録されている必要があります。Software Product Process レコードが存在する必要があります。各 JAMF アプリケーションについて、JAMF が報告する正確なファイル名(例: Microsoft Word.app)が、ソフトウェア製品に関連付けられたアクティブな samp_sw_product_process レコードとして存在する必要があります。このマッピングは、初期ロード時および処理時の両方で使用されます。存在しない場合、レコードはスキップされます。ユーザー照合を構成する必要があります。JAMF コンピューターレコードのユーザー名は sys_user 内のユーザーと一致する必要があります。一致に使用するフィールドは glide.discovery.assigned_user_match_field プロパティ(デフォルト: user_name)によって制御されます。スクリプトはまず構成されたフィールドに対して完全一致を試み、失敗した場合は user_name STARTSWITH username@ による二次検索を実行します。組織で staff ID や employee number を使用している場合は、このプロパティを更新してください。 使用状況レコードの作成に必要なすべての条件 SAMP Software Usage テーブルにレコードを作成するためには、適用されるすべての条件を満たす必要があります。1 つでも条件を満たさない場合、レコードはサイレントにスキップされます。 total_usageレコードの場合 (moveDataToUsageBreakdown → aggregateDataToUsage 経由) 条件詳細 JAMF 内のコンピューターにユーザーが割り当てられている ユーザー名は JAMF のコンピューターレコード(computer.username)から取得されます。コンピューターにユーザーが割り当てられていない場合、username は null となり、ユーザー照合に失敗します。 Timekey が一致する JAMF データ由来のソース timekey は getTimeKeyToPull()(現在月 - 1)と一致する必要があります。 ユーザーが ServiceNow に存在する JAMF コンピューターレコードの username は、sys_user 上の構成済みフィールド(glide.discovery.assigned_user_match_field に従う)と一致する必要があります。 ServiceNow に CI が存在する instanceName|UDID は、name = "SG-JAMF" の sys_object_source の id 列と一致する必要があります。 total_usage 回収ルールが存在する アプリケーションのファイル名を持つ total_usage 回収ルールが samp_sw_product_process に存在する必要があります。 ソフトウェア製品が解決される ファイル名が samp_sw_product_process を介して有効な製品へマッピングされる必要があります。 last_used_dateレコードの場合 (_insertLastUsedTime 経由) 条件詳細 JAMF 内のコンピューターにユーザーが割り当てられている ユーザー名は JAMF のコンピューターレコード(computer.username)から取得されます。コンピューターにユーザーが割り当てられていない場合、username は null となり、ユーザー照合に失敗します。 ユーザーが ServiceNow に存在する JAMF コンピューターレコードの username は、sys_user 上の構成済みフィールド(glide.discovery.assigned_user_match_field に従う)と一致する必要があります。 ServiceNow に CI が存在する instanceName|UDID は、name = "SG-JAMF" の sys_object_source の id 列と一致する必要があります。 total_usage 回収ルールが存在するアプリのファイル名が samp_sw_product_process のlast_used_date再利用ルールが存在する必要があります。適用先:インストール済みソフトウェアまたはサブスクリプションソフトウェア。 ソフトウェア製品が解決される ファイル名は、samp_sw_product_processを介して有効な製品にマッピングする必要があります データ保持 スクリプトは 6 か月分の使用状況データのローリングウィンドウ(MONTH_COVERAGE = 6)を保持します。インポートが実行されるたびに、次の処理が行われます。 getTimeKeyForExpiredData() は、7 か月より古いデータ(現在月 - 1 - 6)の timekey を計算します。期限切れレコードは内訳テーブル(sn_jamf_sw_usage_breakdown)から削除されます。期限切れレコードは、月ベースの削除によって使用状況テーブル(samp_sw_usage)からもクリーンアップされます。 インポートを Daily(または最低でも毎月 3 日より前)に実行することで、6 か月ウィンドウ内にギャップを生じさせることなくクリーンなローテーションを維持できます。これはもはや「毎月 1 日または 2 日に実行する」ことに特別に依存しません。 トラブルシューティング 症状考えられる原因解決インポート後に samp_sw_usage または sn_jamf_sw_usage_breakdown にレコードが作成されないインポートが月の途中または月末近くに実行され、timekey 不一致が発生した翌月 3 日より前にスケジュールが実行されることを確認します(Daily を推奨)。1 回限りの発生であれば想定内であり、自動的に解決されるため、必ずしも再スケジュールは必要ありません。ステージングテーブルにはデータが存在するが、内訳テーブルが空であるステージングテーブルの u_time_key 値がデフォルト timekey(現在月 - 1)と一致しないステージングテーブル内の u_time_key 値を確認します。期待されるデフォルト timekey と比較してください。一致しない場合はステージングデータを修正し、変換を再実行します。同じ行が、同じ月内の毎回の実行で内訳テーブルへ再集計されているように見える PRB2067960 で修正済み: moveDataToUsageBreakdown() のフィールド名誤記(setValue('changed', false) ではなく setValue('u_changed', false) とすべき)が原因で、ステージングテーブルの u_changed フラグが解除されず、同じループのクエリーで繰り返し一致対象になっていた コネクターバージョンに PRB2067960 が含まれていることを確認してください(PRB2067966 と同時提供)。修正を含むバージョンでは対応不要です。データがまったくロードされず、インポート全体がスキップされるどの種類の回収ルールも存在しない少なくとも 1 つの回収ルール(total_usage または last_used_date)を作成し、関連するソフトウェア製品およびファイル名を samp_sw_product_process に設定します。ログに User ID null が表示され、レコードがスキップされる JAMF のコンピューターにユーザーが割り当てられていない、または JAMF の username が sys_user レコードと一致しない JAMF 内のコンピューターにユーザーが割り当てられていることを確認してください。glide.discovery.assigned_user_match_field プロパティを確認し、JAMF の username が構成された sys_user フィールド(user_name、staff_id など)に存在することを確認します。 ログに "SAMP reclamation rule exist" が表示され、レコードがスキップされる そのアプリケーションに対する total_usage 回収ルールが存在しない(誤解を招くログメッセージ)total_usage 回収ルールを作成し、アプリケーションのファイル名が samp_sw_product_process に存在することを確認してください。注: このログメッセージは誤解を招くものであり、実際にはルールが存在しない場合に表示されます。ログ内の CI ID が null指定された instanceName|UDID に対応するコンピューター CI が sys_object_source に存在しないソフトウェア使用状況インポートより前に SG-JAMF Computers インポートが正常に実行されたことを確認してください。name = "SG-JAMF" および id = instanceName|UDID の条件で sys_object_source に CI が存在することを確認します。JAMF API からソフトウェア使用状況データがまったく取得されない JAMF にコンピューターが存在しない、または要求された期間内に使用履歴が存在しない JAMF にコンピューターが存在し、ソフトウェア使用履歴があることを確認してください。_getStartDate() および _getEndDate() によって計算された日付範囲が想定期間を含んでいることを確認します。 実際には使用中のソフトウェアに対して回収候補が作成される 使用状況インポートのスケジュールが、SAM Pro の月次回収評価(SAM - Identifying New Reclamation Candidates、デフォルトは毎月 3 日)より前に確実に完了していないため、回収ジョブが前月の古い使用状況データを基に評価した 上記の「特定インスタンスでのスケジュール整合性の確認」セクションに従ってスケジュール整合性を確認してください。注: SAM Pro は新たな使用状況が検出されると回収候補を自動的にクローズしますが、誤検知を防ぐにはスケジュール順序が重要です。 Month/Year が Last Used Date レコードの Last Used Time と一致しない場合があります ― これは想定された動作です reclamation type が Last Used Date の samp_sw_usage レコードでは、Month/Year フィールドが Last Used Time フィールドよりも古い月を表示する場合があります。たとえば、Last Used Time が 8 月 3 日を示している一方で、Month/Year は 6 月のままである場合があります。 これは想定された動作であり、データ整合性の問題ではありません。また、回収処理へ影響しません。SAM Pro の Last Used Date レコードに対する回収ロジックは Last Used Time のみを評価します。Month/Year はレコードキーの一部ではなく、ソフトウェアが回収対象かどうかを判断する際には参照されません。 Month/Year フィールドの不一致によって、実際に使用中のソフトウェアが誤って回収対象とされたり、回収候補が見逃されたりすることはありません。 この動作が誤っているように見えるケースを調査する場合は、reclamation type が Last Used Date のレコードについては、Month/Year ではなく Last Used Time を使用して回収ステータスを確認してください。 これらのレコードで Month/Year を Last Used Time に一致させるための修正やカスタマイズを要求しないでください。このテーブルに対する SAM Pro プラットフォームレベルの保護機構は、そのような変更を拒否することが知られており、副作用として Last Used Time が正しく更新されなくなる場合があります。 関連するシステムプロパティ プロパティデフォルト目的glide.discovery.assigned_user_match_fielduser_name JAMF インポートデータの username を照合する際に使用する sys_user フィールドを制御します。組織で JAMF 内に異なる識別子を使用している場合は、staff_id または employee_number へ変更してください。 Related Links<!-- /*NS Branding Styles*/ --> .ns-kb-css-body-editor-container { p { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } span { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } h2 { font-size: 24pt; font-family: Lato; color: var(--now-color--text-primary, black); } h3 { font-size: 18pt; font-family: Lato; color: var(--now-color--text-primary, black); } h4 { font-size: 14pt; font-family: Lato; color: var(--now-color--text-primary, black); } a { font-size: 12pt; font-family: Lato; color: var(--now-color--link-primary, #00718F); } a:hover { font-size: 12pt; color: var(--now-color--link-primary, #024F69); } a:target { font-size: 12pt; color: var(--now-color--link-primary, #032D42); } a:visited { font-size: 12pt; color: var(--now-color--link-primary, #00718f); } ul { font-size: 12pt; font-family: Lato; } li { font-size: 12pt; font-family: Lato; } img { display: ; max-width: ; width: ; height: ; } } 関連ドキュメント Jamf のサービスグラフコネクタ — 製品ドキュメントJamf のサービスグラフコネクタの構成 — SGC セントラルを使用した構成 ガイド付きセットアップを使用した構成ソフトウェア再利用ルール - SAMP 管理コミュニティ:JAMF ソフトウェア使用状況データインポートのサービスグラフコネクタServiceNow Store:Jamf のサービスグラフコネクタ