Metatron-discovery: Support timezone for field of timestamp type

Created on 7 Jan 2019  Β·  37Comments  Β·  Source: metatron-app/metatron-discovery

Is your feature request related to a problem? Please describe.
μ μž¬λ˜λŠ” 데이터 μ†ŒμŠ€λ‚΄ νƒ€μž„μŠ€ν…œν”„ νƒ€μž…μ΄ ν¬ν•¨λœ 경우, νƒ€μž„μ‘΄μ΄ μ„€μ •λ˜μ–΄ μžˆμ§€μ•Šμ•„ λŒ€μ‹œλ³΄λ“œ μƒμ—μ„œ 데이터 μ‘°νšŒμ‹œ μ‚¬μš©μž κΈ°μ€€μ˜ νƒ€μž„μ‘΄ κΈ°μ€€ μ‹œκ°„μ„ ν™•μΈν• μˆ˜ μ—†μŠ΅λ‹ˆλ‹€.

Describe the solution you'd like
데이터 μ†ŒμŠ€ μƒμ„±μžλŠ” 데이터 μ†ŒμŠ€λ‚΄ νƒ€μž„μŠ€ν…œν”„ νƒ€μž…μ— timezone 을 μ§€μ •ν• μˆ˜ 있고, μ‚¬μš©μžλŠ” μ‚¬μš©μž 브라우져 νƒ€μž„μ‘΄μ— 맞좘 μ‹œκ°„ 값을 λŒ€μ‹œλ³΄λ“œλ₯Ό 톡해 볼수 μžˆμŠ΅λ‹ˆλ‹€.

The datasource creator can set a timezone to the timestamp type in the data source, and the user can view the time value according to the user's browser timezone through the dashboard.

Describe alternatives you've considered

  • Support Timezone list (https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)
  • Consider backward backward compatibility

Additional context
(N/A)

enhancement @dashboard @datasource p1

All 37 comments

@metatron-app/design @AnnieHwang μœ„μ˜ μš”κ΅¬μ‚¬ν•­μ— μ˜ν•˜μ—¬ μ•„λž˜ 두가지 μš”κ±΄μ΄ ν•„μš”ν•©λ‹ˆλ‹€.

  • Timestamp Type 의 ν•„λ“œ μ μž¬μ‹œ timezone / locale(μ˜μ–΄-en,ν•œκ΅­μ–΄-ko,쀑ꡭ어-zh) μ§€μ •, 이 정보λ₯Ό ν¬ν•¨ν•˜μ—¬ validation μˆ˜ν–‰
  • μœ„μ ― λ‚΄ μ„ λ°˜μ— timestamp type 의 dimension (timestamp role 포함) μœ„μΉ˜μ‹œ λΈŒλΌμš°μ €μ˜ timezone / locale 정보λ₯Ό κ°€μ Έλ‹€κ°€ λ™μ μœΌλ‘œ μ „λ‹¬ν•˜μ—¬, ν•΄λ‹Ή timezone 에 λ§žλŠ” 데이터λ₯Ό λ³΄μ—¬μ£Όκ²Œ λ©λ‹ˆλ‹€. (이건은 λ³„λ„μ˜ ν™”λ©΄ κΈ°νšμ€ ν•„μš”κ°€ μ—†μœΌλ‚˜, μœ„μ ―/λŒ€μ‹œλ³΄λ“œμ—μ„œ 데이터 μ‘°νšŒμ‹œμ˜ μ‹œλ‚˜λ¦¬μ˜€λ₯Ό μœ„ν•œ 전달 λ°©λ²•μž…λ‹ˆλ‹€.)

@kyungtaak
질문이 μžˆμŠ΅λ‹ˆλ‹€

질문1- νƒ€μž„μ‘΄ 지원 λ²”μœ„
κ°€μ΄λ“œ μ£Όμ‹  μ°Έκ³  자료(μœ„ν‚€)에 보면 μ „ μ„Έκ³„μ˜ νƒ€μž„μ‘΄ 정보가 λ‚˜μ˜€λŠ”λ°μš”, μ „ μ„Έκ³„μ˜ νƒ€μž„μ‘΄μ„ λ‹€ μ§€μ›ν•˜μ‹€ μ˜ˆμ •μ΄μ‹ μ§€μš”? λ˜λŠ” 이 쀑 영미, 쀑ꡭ, ν•œκ΅­μ˜ νƒ€μž„μ‘΄λ§Œ 지원해도 λ˜λŠ”μ§€μš”?

질문2- νƒ€μž„μ‘΄ μ„€μ •μ‹œ 영ν–₯λ°›λŠ” κ°’
μ œκ°€ μ΄ν•΄ν•œλ°”λ‘œλŠ” νƒ€μž„μ‘΄ 섀정은 νƒ€μž„μŠ€νƒ¬ν”„μ— ν•΄λ‹Ήν•˜λ©°, μ„€μ •μ‹œ μ‹œκ°ν™” ν•  λ•Œ(λŒ€μ‹œλ³΄λ“œ) ν‘œν˜„λ˜λŠ” μ‹œκ°„κ°’μ΄ 영ν–₯을 λ°›λŠ”λ‹€κ³  μƒκ°ν•˜λŠ”λ°μš”
κ·Έλ ‡λ‹€λ©΄ νƒ€μž„μŠ€νƒ¬ν”„μ— λ”°λ₯Έ (νƒ€μž„μŠ€νƒ¬ν”„κ°€ μ•„λ‹Œ)Time type의 μ»¬λŸΌμ€ 영ν–₯을 μ•ˆλ°›λŠ”μ§€μš”?
즉 λ°μ΄ν„°μ†ŒμŠ€ > 데이터 κ·Έλ¦¬λ“œ ν™”λ©΄μ—μ„œμ˜ λ°μ΄ν„°κ°’λ“€κ³ΌλŠ” λ¬΄κ΄€ν•œμ§€ κΆκΈˆν•©λ‹ˆλ‹€.

질문3- ingestion이후 μˆ˜μ • κ°€λΆ€
λ°μ΄ν„°μ†ŒμŠ€ > 상세정보 ν™”λ©΄ λ“±μ—μ„œ νƒ€μž„μ‘΄ μˆ˜μ •μ΄ λΆˆκ°€ν•΄μ•Ό ν• κΉŒμš”?
κ°€λŠ₯ν•˜λ‹€λ©΄ λŒ€μ‹œλ³΄λ“œμ—μ„œλ„ νƒ€μž„μ‘΄ μˆ˜μ •μ„ 지원해야 ν•˜λŠ”μ§€μš”?

질문4- Current time일 경우 νƒ€μž„μ‘΄
νƒ€μž„μŠ€νƒ¬ν”„κ°€ μ„€μ •λœ μ»¬λŸΌμ΄λž€ μœ μ €κ°€ νƒ€μž„μŠ€νƒ¬ν”„λ‘œ μ§€μ •ν•œ 컬럼일 κ²½μš°μ™€ Current time으둜 μžλ™ μ„ νƒλœ 컬럼 λ‘˜ λ‹€ ν¬ν•¨ν•˜λŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€.
(Current time도 포함일 경우 ingestion 이후에 UIμ—μ„œλŠ” ν•΄λ‹Ή 컬럼이 λ…ΈμΆœλ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.)

@deidera08 λ‹΅λ³€λ“œλ¦½λ‹ˆλ‹€.

  1. νƒ€μž„μ‘΄ 지원 λ²”μœ„λŠ” λͺ¨λ‘ λ‚˜μ˜€λŠ”κ²Œ 쒋을것 κ°™μŠ΅λ‹ˆλ‹€. (μ½€λ³΄λ°•μŠ€μ— 검색이 μžˆμ–΄λ„ 쒋을것 κ°™μŠ΅λ‹ˆλ‹€.)
  2. Timestamp Role μ™Έ Dimension Role 의 timestamp νƒ€μž…λ„ 영ν–₯을 λ°›μŠ΅λ‹ˆλ‹€.
    그리고 데이터 κ·Έλ¦¬λ“œμ—μ„œ λ³΄μ—¬μ€„λ•ŒλŠ” μœ„μ ―μ—μ„œμ—μ„œ λ³΄λŠ”κ²ƒκ³Ό λ™μΌν•œ νƒ€μž„μ‘΄μ˜ 영ν–₯을 λ°›κ²Œ 데이터λ₯Ό 전달할 μ˜ˆμ •μž…λ‹ˆλ‹€.
  3. μˆ˜μ •μ€ λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.
  4. current time 은 κ°€λ €μ§€λŠ” κ°’μ΄λ―€λ‘œ, 섀정이 ν•„μš”μ—†μ„ κ²ƒμœΌλ‘œ λ³΄μž…λ‹ˆλ‹€.

@kyungtaak
λΉ λ₯Έ λ‹΅λ³€ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹· :)
μΆ”κ°€ 질문 λ“œλ¦½λ‹ˆλ‹€.

Timestamp Role μ™Έ Dimension Role 의 timestamp νƒ€μž…λ„ 영ν–₯을 λ°›μŠ΅λ‹ˆλ‹€.
그리고 데이터 κ·Έλ¦¬λ“œμ—μ„œ λ³΄μ—¬μ€„λ•ŒλŠ” μœ„μ ―μ—μ„œμ—μ„œ λ³΄λŠ”κ²ƒκ³Ό λ™μΌν•œ νƒ€μž„μ‘΄μ˜ 영ν–₯을 λ°›κ²Œ 데이터λ₯Ό 전달할 μ˜ˆμ •μž…λ‹ˆλ‹€.

Timestamp Role이 λ¬΄μ—‡μΌκΉŒμš”?
Timestamp둜 μ§€μ •ν•œ 컬럼 외에 Dimension > Date/Time μ»¬λŸΌλ„ 각각의 νƒ€μž„μ‘΄μ„ μ„€μ •ν•  수 μžˆλŠ”κ±΄κ°€μš”?
즉 ν•œ λ°μ΄ν„°κ·Έλ¦¬λ“œ μ•ˆμ— Date/Time컬럼이 닀쀑일 경우 μ΄λŠ” 각각의 νƒ€μž„μ‘΄μ„ μ„€μ •ν•  수 μžˆλ‚˜μš”?

@kyungtaak @AnnieHwang
λ‹€μŒκ³Ό 같이 κΈ°νšν•˜μ˜€μŠ΅λ‹ˆλ‹€.

Ingestion Settings > Timestamp Settingμ—μ„œ νƒ€μž„μ‘΄ 섀정을 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
timezone01
timezone02

μ„€μ •ν•œ νƒ€μž„μ‘΄μ€ 상세화면, 데이터 κ·Έλ¦¬λ“œν™”λ©΄, μ»¬λŸΌμƒμ„Έ 화면에 각각 정보가 λ…ΈμΆœλ©λ‹ˆλ‹€.
timezone03
timezone04
timezone05

λΆ€μ‘±ν•œ λΆ€λΆ„μ΄λ‚˜ 잘λͺ» ν‘œν˜„λœ 뢀뢄이 μžˆμ„ 경우 κ°€μ΄λ“œ λΆ€νƒλ“œλ¦½λ‹ˆλ‹€.

@deidera08

Timestamp Role이 λ¬΄μ—‡μΌκΉŒμš”?

컬럼의 역할을 measure/dimension/timestamp 이 μ„Έκ°€μ§€λ‘œ μ •μ˜ν•˜μ˜€μŠ΅λ‹ˆλ‹€. timestamp role 은 μ μž¬μ‹œ λ°˜λ“œμ‹œμ§€μ •ν•΄μ•Όν•˜λŠ” timestamp νƒ€μž…μ˜ ν•„λ“œλ₯Ό μ˜λ―Έν•˜λ©°, μ»¬λŸΌμ€‘ ν•˜λ‚˜λ§Œ μ§€μ •ν• μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.

Timestamp둜 μ§€μ •ν•œ 컬럼 외에 Dimension > Date/Time μ»¬λŸΌλ„ 각각의 νƒ€μž„μ‘΄μ„ μ„€μ •ν•  수 μžˆλŠ”κ±΄κ°€μš”? 즉 ν•œ λ°μ΄ν„°κ·Έλ¦¬λ“œ μ•ˆμ— Date/Time컬럼이 닀쀑일 경우 μ΄λŠ” 각각의 νƒ€μž„μ‘΄μ„ μ„€μ •ν•  수 μžˆλ‚˜μš”?

λ„€ κ·Έλ ‡κ²Œ λ˜μ–΄μ•Όν•œλ‹€κ³  μƒκ°ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

@kyungtaak @AnnieHwang
λ‹΅λ³€ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€

Timestamp둜 μ§€μ •ν•œ 컬럼 외에 Dimension > Date/Time μ»¬λŸΌλ„ 각각의 νƒ€μž„μ‘΄μ„ μ„€μ •ν•  수 μžˆλŠ”κ±΄κ°€μš”? 즉 ν•œ λ°μ΄ν„°κ·Έλ¦¬λ“œ μ•ˆμ— Date/Time컬럼이 닀쀑일 경우 μ΄λŠ” 각각의 νƒ€μž„μ‘΄μ„ μ„€μ •ν•  수 μžˆλ‚˜μš”?

λ„€ κ·Έλ ‡κ²Œ λ˜μ–΄μ•Όν•œλ‹€κ³  μƒκ°ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

λ‹΅λ³€μ£Όμ‹ λŒ€λ‘œλΌλ©΄ μœ„μ˜ μ™€μ΄μ–΄ν”„λ ˆμž„μ€ 잘λͺ» μ„€κ³„λ˜μ—ˆλ„€μš”.
이전 단계인 configuration schemaλ‹¨κ³„μ—μ„œ 컬럼 μ„€μ •μ‹œ νƒ€μž„μ‘΄μ΄ λ“€μ–΄κ°€μ•Ό ν•  λ“― ν•©λ‹ˆλ‹€.
μœ„μ˜ μ™€μ΄μ–΄ν”„λ ˆμž„μ€ λ¬΄μ‹œν•΄μ£Όμ‹œκ³  λ‹€μ‹œ ν™”λ©΄ μ˜¬λ¦¬λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

그리고 νƒ€μž„μ‘΄ λͺ©λ‘μ„ μ •λ¦¬ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
참고자료둜 μ£Όμ‹  μœ„ν‚€μ˜ λͺ©λ‘μ„ μΆ”λ ΈμŠ΅λ‹ˆλ‹€. (원 μžλ£ŒλŠ” 500κ°œκ°€ λ„˜λ„€μš”)
κ΅­κ°€μ½”λ“œκ°€ μ—†κ±°λ‚˜, λ„μ‹œλͺ…κ³Ό μ‹œκ°„λŒ€κ°€ 같은 ν•­λͺ©μ€ μ‚­μ œν–ˆμŠ΅λ‹ˆλ‹€.
λ…ΈμΆœλ°©μ‹μ€ "μ‹œκ°„ κ΅­κ°€/λ„μ‹œλͺ…"으둜 μƒκ°ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.
예) +09:00 Korea/μ„œμšΈ +09:00 Korea/Seoul
λ”λΆˆμ–΄ μ •λ ¬μˆœμ„œλŠ”(μœ„ν‚€λŠ” λŒ€λ₯™μˆœμ΄μ§€λ§Œ) μ‹œκ°„μˆœμ„œλ‘œ ν•˜λ©΄ 쒋을듯 ν•©λ‹ˆλ‹€.
(κΈ°λ³Έκ°’: λΈŒλΌμš°μ € μ‹œκ°„λŒ€)

μ—‘μ…€νŒŒμΌμ„ μ°Έκ³ λΆ€νƒλ“œλ¦½λ‹ˆλ‹€.
#1193TimezoneList.xlsx

@deidera08 보톡 TZ database λͺ…은 κ΅­κ°€κ°€ μ•„λ‹Œ λŒ€λ₯™λͺ…을 μ•žμ— 두고 Asia/Seoul μ΄λ ‡κ²Œ ν‘œκΈ°ν•©λ‹ˆλ‹€.

@kyungtaak @AnnieHwang

@deidera08 보톡 TZ database λͺ…은 κ΅­κ°€κ°€ μ•„λ‹Œ λŒ€λ₯™λͺ…을 μ•žμ— 두고 Asia/Seoul μ΄λ ‡κ²Œ ν‘œκΈ°ν•©λ‹ˆλ‹€.

개인적인 κ²½ν—˜μΉ˜λ‘œ λ‚˜λΌλͺ…이 μžˆλŠ” 경우λ₯Ό 많이 봀던 터라 μžμ—°μŠ€λŸ½κ²Œ λŒ€λ₯™μ„ λΉΌκ³  λ‚˜λΌλͺ…을 λ…ΈμΆœμ‹œμΌ°λ”λž¬μŠ΅λ‹ˆλ‹€.
우리 UIμ—μ„œλŠ” μ•„λ¬΄λž˜λ„ 직접 (νœ μ„ κ΅΄λ €κ°€λ©°) μ„ νƒν•˜κΈ°λ³΄λ‹€λŠ” 검색이 μ£Όλ₯Ό 이룰듯 ν•©λ‹ˆλ‹€.
μœ μ €μ—κ²Œ 검색어λ₯Ό λ‹€μ–‘ν•˜κ²Œ μ£ΌκΈ° μœ„ν•΄μ„œ λ‚˜λΌλͺ…, λŒ€λ₯™λͺ… ν•¨κ»˜ λ…ΈμΆœμ‹œν‚€λ©΄ μ–΄λ–¨κΉŒμš”?
예) +09:00 μ„œμšΈ/λŒ€ν•œλ―Όκ΅­/μ•„μ‹œμ•„ +09:00 Seoul/Korea/Asia
μ΄λŸ°μ‹μœΌλ‘œ ν‘œν˜„ν•˜λ©΄ 쒋을듯 ν•©λ‹ˆλ‹€.

λ”λΆˆμ–΄ λŒ€λ₯™λͺ…을 λ…ΈμΆœμ‹œν‚¨λ‹€λ©΄ κ΅­κ°€μ½”λ“œκ°€ μ—†λ˜ ν•­λͺ©λ„ ꡳ이 λ°°μ œμ‹œν‚¬ ν•„μš”λŠ” μ—†λŠ”λ°μš”,
κ΅­κ°€ μ½”λ“œκ°€ μ—†λŠ” ν•­λͺ©μ€ μ•„λž˜μ™€ 같이 λ…ΈμΆœλ˜κ² λ„€μš”
예) +09:00 μ„œμšΈ/μ•„μ‹œμ•„ +09:00 Seoul/Asia

μˆ˜μ •λœ νŒŒμΌμž…λ‹ˆλ‹€.
#1193TimezoneList_v1.2.xlsx

μ‚΄νŽ΄λ³΄μ‹œκ³  의견 λΆ€νƒλ“œλ¦½λ‹ˆλ‹€.

@deidera08 μ œκ°€ λ„ˆλ¬΄ 개발자 슀러운 μ½”λ“œμ— λΉ μ Έμžˆμ—ˆλ‚˜λ΄…λ‹ˆλ‹€. κ²½ν—˜ν•˜μ‹  방식에 따라 μ§„ν–‰ν•΄μ£Όμ‹œλ©΄ 쒋을것 κ°™μ•„μš”. ^^;

@kyungtaak @AnnieHwang

Timestamp둜 μ§€μ •ν•œ 컬럼 외에 Dimension > Date/Time μ»¬λŸΌλ„ 각각의 νƒ€μž„μ‘΄μ„ μ„€μ •ν•  수 μžˆλŠ”κ±΄κ°€μš”? 즉 ν•œ λ°μ΄ν„°κ·Έλ¦¬λ“œ μ•ˆμ— Date/Time컬럼이 닀쀑일 경우 μ΄λŠ” 각각의 νƒ€μž„μ‘΄μ„ μ„€μ •ν•  수 μžˆλ‚˜μš”?

λ„€ κ·Έλ ‡κ²Œ λ˜μ–΄μ•Όν•œλ‹€κ³  μƒκ°ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

μœ„μ˜ 상황에 맞좰 Date/Time type에 각각의 νƒ€μž„μ‘΄μ„ μ„€μ •ν•  수 μžˆλ„λ‘ ν™”λ©΄ μˆ˜μ •ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

2019-01-10 9 40 14
2019-01-10 9 40 21
2019-01-10 9 40 30
2019-01-10 9 40 40
2019-01-10 9 40 49


질문이 μžˆμŠ΅λ‹ˆλ‹€.
λŒ€μ‹œλ³΄λ“œ μƒμ„±μ‹œ 데이터간 joinμ΄λ‚˜ ν•„ν„° μ§€μ •μ‹œ νƒ€μž„μ‘΄μ— λŒ€ν•œ 데이터값 ν‘œν˜„μ΄ 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠλŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€.

예λ₯Όλ“€μ–΄ join을 ν•  경우 joinλŒ€μƒμ˜ A,Bμ»¬λŸΌμ— λ™μΌν•œ 2000-01-01 00:00:00의 λ‚ μ§œκ°’μ΄ μžˆλ‹€κ³  κ°€μ •ν•˜κ³ 
Aμ»¬λŸΌμ— 00:00의 νƒ€μž„μ‘΄, Bμ»¬λŸΌμ— +23:00의 νƒ€μž„μ‘΄μΌκ²½μš° 데이터값 ν‘œν˜„μ€ 각각 2000-01-01 00:00:00, 2000-01-01 23:00:00이 λ©λ‹ˆλ‹€. μ΄λ•Œ A,B 데이터값을 λ™μΌν•œ κ°’μœΌλ‘œ λ³΄λŠ”μ§€μš”?

λ˜λŠ” νƒ€μž„μ‘΄μ— μ˜ν•΄ λ³€ν˜•λœ μ‹œκ°„μ΄ 같을 경우λ₯Ό (μœ„ 상황과 λ°˜λŒ€) 같은 λ°μ΄ν„°κ°’μœΌλ‘œ λ³΄λŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€.

@deidera08 μœ„μ˜ 상황이라면, μ—”μ§„μ—μ„œ μΈμ‹λ˜λŠ” λ˜λŠ”μ‹œκ°„μ€ UTC(0μ‹œ) κΈ°μ€€μž…λ‹ˆλ‹€. λ”°λΌμ„œ

  • A 컬럼의 경우 적재된 μ‹œκ°„μ€ 2000λ…„ 1μ›” 1일 0μ‹œ
  • B 컬럼의 경우 적재된 μ‹œκ°„μ€ 1999λ…„ 12μ›” 31일 1μ‹œ

μ‚¬μš©μžκ°€ Asia/Seoul (+9) 인경우 λ³΄μ΄λŠ” μ‹œκ°„κ°’μ€, μ•„λž˜μ²˜λŸΌ λ³΄μΌκ±°μ—μš”.

  • A 컬럼의 경우 2000λ…„ 1μ›” 1일 9μ‹œ
  • B 컬럼의 경우 1999λ…„ 12μ›” 31일 10μ‹œ

@AnnieHwang νƒ€μž„μ‘΄ μΆ”κ°€ κ΄€λ ¨ λ””μžμΈ κ³΅μœ λ“œλ¦½λ‹ˆλ‹€

λ°μ΄ν„°μ†ŒμŠ€ > 생성(myfile) > μŠ€ν‚€λ§ˆμ„€μ •
image

λ°μ΄ν„°μ†ŒμŠ€ > 상세(data grid)
1. data grid > header area λ””μžμΈμˆ˜μ •
- header height 50px
- β€˜column name’ text size 13pt / Bold
- header line color #d5d5da
2. Time zone μΆ”κ°€
image

λ°μ΄ν„°μ†ŒμŠ€ > 상세(Column details)
image

@kyungtaak @deidera08 λ°μ΄ν„°μ†ŒμŠ€ > 상세(data grid) μ—μ„œ νƒ€μž„μ‘΄μ΄ 컬럼 헀더(이름열) 전면에 λ‚˜μ˜¬μ •λ„λ‘œ μ€‘μš”ν•œκ°€μš”? μ „ 툴팁 μ •λ„λ‘œλ§Œ λ‚˜μ˜€λ©΄ 될것 같은데.. μ–΄λ–»κ²Œ μƒκ°ν•˜μ„Έμš”? λ„ˆλ¬΄ μ—¬λŸ¬μ€„ 헀더에 λ‚˜μ˜€λ©΄ 정신없을것 κ°™μ•„μ„œμš”

@AnnieHwang

@kyungtaak @deidera08 λ°μ΄ν„°μ†ŒμŠ€ > 상세(data grid) μ—μ„œ νƒ€μž„μ‘΄μ΄ 컬럼 헀더(이름열) 전면에 λ‚˜μ˜¬μ •λ„λ‘œ μ€‘μš”ν•œκ°€μš”? μ „ 툴팁 μ •λ„λ‘œλ§Œ λ‚˜μ˜€λ©΄ 될것 같은데.. μ–΄λ–»κ²Œ μƒκ°ν•˜μ„Έμš”? λ„ˆλ¬΄ μ—¬λŸ¬μ€„ 헀더에 λ‚˜μ˜€λ©΄ 정신없을것 κ°™μ•„μ„œμš”

μ‹œκ°„νƒ€μž… μ»¬λŸΌλ§ˆλ‹€ 각각 νƒ€μž„μ‘΄μ„ μ„€μ •ν•  수 μžˆλ‹€λ³΄λ‹ˆ Data gridν™”λ©΄μ—μ„œ λ‹€μ€‘μ˜ μ‹œκ°„νƒ€μž… 컬럼이 각각 λ‹€λ₯Έ νƒ€μž„μ‘΄μΌ 경우 ν•œλˆˆμ— μΈμ§€ν•˜κΈ° μ–΄λ ΅μ§€ μ•Šμ„κΉŒ ν•΄μ„œ μ „λ©΄(상단)에 ν•΄λ‹Ή 정보λ₯Ό μΆ”κ°€ν•΄μ•Όκ² λ‹€κ³  μƒκ°ν–ˆμ—ˆλŠ”λ°μš”
λ§μ”€ν•˜μ‹ λŒ€λ‘œ 컬럼λͺ…, logical 컬럼λͺ…, νƒ€μž„μ‘΄ μ •λ³΄κΉŒμ§€ μ΅œλŒ€ 3쀄이 λ…ΈμΆœλ  수 μžˆμ–΄μ„œ 정보과닀 λ…ΈμΆœμΌ μˆ˜λ„ μžˆμ„ λ“― ν•©λ‹ˆλ‹€.
μ‹œκ°„νƒ€μž… μ»¬λŸΌμ— λ§ˆμš°μŠ€μ˜€λ²„μ‹œ 툴팁으둜 νƒ€μž„μ‘΄ 정보λ₯Ό λ…ΈμΆœν•˜λŠ”κ²ƒμœΌλ‘œ μˆ˜μ •μš”μ²­ ν•˜λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

@AnnieHwang @eltriny μˆ˜μ •λœ 사항 κ³΅μœ λ“œλ¦½λ‹ˆλ‹€
λ°μ΄ν„°μ†ŒμŠ€ > 상세(data grid)

  1. Time zone μΆ”κ°€ : Date/Time 컬럼 ν˜Έλ²„μ‹œ νƒ€μž„μ‘΄ 툴팁 λ…ΈμΆœλ‘œ μˆ˜μ •
  1. data grid > header area λ””μžμΈμˆ˜μ •
    -header height 36px
    -β€˜column name’ text size 13pt / Bold
    -header line color #d5d5da
    image

@kyungtaak
λ°μ΄ν„°μ†ŒμŠ€ μƒμ„±μ‹œ timestamp인 column의 timezone은 μ–΄λ–€ νŒŒλΌλ©”ν„°λ₯Ό μ‚¬μš©ν•˜λ©΄ λ˜λ‚˜μš”?

@brandon-wonjune μ•„λž˜μ™€ 같이 μž…λ ₯ν•΄μ£Όμ‹œλ©΄ λ©λ‹ˆλ‹€.

{
  format: {
    ...
    timeZone: "Asia/Seoul",
    locale: "en"
  }
}

@AnnieHwang @kyungtaak @brandon-wonjune
ν˜„μž¬ λ°μ΄ν„°κ·Έλ¦¬λ“œμ— νˆ΄νŒμ„ μΆ”κ°€ν•˜λŠ” 것이 ꡬ쑰상 μ–΄λ ΅κΈ° λ•Œλ¬Έμ—
νƒ€μž„μ‘΄ 정보λ₯Ό ν…μŠ€νŠΈλ‘œ λ°”λ‘œ λ…ΈμΆœμ‹œν‚€λŠ” μ΄ˆμ•ˆμœΌλ‘œ μš°μ„  κ΅¬ν˜„ λΆ€νƒλ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€.

@eltriny @brandon-wonjune 쿼리λ₯Ό μˆ˜ν–‰μ‹œ timezone 을 μœ„ν•œ λ³„λ„λ‘œμ§μ€ μ œκ±°ν•΄μ£Όμ‹œκ³ μš”. ν˜„ 브라우져 μ‹œκ°„ / timezone κΈ°μ€€ 정보λ₯Ό μ „λ‹¬ν•΄μ£Όμ„Έμš”.

@kyungtaak
ν…ŒμŠ€νŠΈ 쀑 μ•„λž˜μ™€ 같은 μƒν™©μ—μ„œ μ μž¬μ‹œ μ—λŸ¬κ°€ λ°œμƒν•©λ‹ˆλ‹€.

λ°μ΄ν„°λ² μ΄μŠ€λ‘œ λ°μ΄ν„°μ†ŒμŠ€ 생성 > μ—°κ²°ν˜• 선택 > ν…Œμ΄λΈ” 선택 > current_time으둜 timestamp 선택 > 생성 > μƒμ„Έν™”λ©΄μ—μ„œ ingestionμ‹œ μ—λŸ¬ λ°œμƒ
// params
{"dsType":"MASTER",
"srcType":"JDBC",
"connType":"ENGINE",
"granularity":"MONTH",
"segGranularity":"MONTH",
"name":"test",
"description":"",
"ingestion":{"dataType":"TABLE",
                     "type":"single",
                     "rollup":true,
                     "query":"ALL_PLUGINS",
                     "database":"information_schema",
                     "scope":"ALL"},
"fields":[{"name":"PLUGIN_NAME","alias":"PLUGIN_NAME","type":"STRING","logicalType":"STRING","role":"DIMENSION","aggrType":"NONE","seq":0},{"name":"PLUGIN_VERSION","alias":"PLUGIN_VERSION","type":"STRING","logicalType":"STRING","role":"DIMENSION","aggrType":"NONE","seq":1},{"name":"PLUGIN_STATUS","alias":"PLUGIN_STATUS","type":"STRING","logicalType":"STRING","role":"DIMENSION","aggrType":"NONE","seq":2},{"name":"PLUGIN_TYPE","alias":"PLUGIN_TYPE","type":"STRING","logicalType":"STRING","role":"DIMENSION","aggrType":"NONE","seq":3},{"name":"PLUGIN_TYPE_VERSION","alias":"PLUGIN_TYPE_VERSION","type":"STRING","logicalType":"STRING","role":"DIMENSION","aggrType":"NONE","seq":4},{"name":"PLUGIN_LIBRARY","alias":"PLUGIN_LIBRARY","type":"STRING","logicalType":"STRING","role":"DIMENSION","aggrType":"NONE","seq":5},{"name":"PLUGIN_LIBRARY_VERSION","alias":"PLUGIN_LIBRARY_VERSION","type":"STRING","logicalType":"STRING","role":"DIMENSION","aggrType":"NONE","seq":6},{"name":"PLUGIN_AUTHOR","alias":"PLUGIN_AUTHOR","type":"STRING","logicalType":"STRING","role":"DIMENSION","aggrType":"NONE","seq":7},{"name":"PLUGIN_DESCRIPTION","alias":"PLUGIN_DESCRIPTION","type":"STRING","logicalType":"STRING","role":"DIMENSION","aggrType":"NONE","seq":8},{"name":"PLUGIN_LICENSE","alias":"PLUGIN_LICENSE","type":"STRING","logicalType":"STRING","role":"DIMENSION","aggrType":"NONE","seq":9},{"name":"LOAD_OPTION","alias":"LOAD_OPTION","type":"STRING","logicalType":"STRING","role":"DIMENSION","aggrType":"NONE","seq":10},{"name":"PLUGIN_MATURITY","alias":"PLUGIN_MATURITY","type":"STRING","logicalType":"STRING","role":"DIMENSION","aggrType":"NONE","seq":11},{"name":"PLUGIN_AUTH_VERSION","alias":"PLUGIN_AUTH_VERSION","type":"STRING","logicalType":"STRING","role":"DIMENSION","aggrType":"NONE","seq":12},{"seq":13,"name":"current_datetime","type":"TIMESTAMP","role":"TIMESTAMP","derived":true,"format":{"type":"time_temporary","format":"yyyy-MM-dd HH:mm:ss"}}],
"connection":"/api/connections/c10943db-de02-4e75-9eb9-4bd6dad214d6"}

//error
app.metatron.discovery.domain.engine.EngineException: Fail to process response : [{"error":"Instantiation of [simple type, class io.druid.indexing.common.task.IndexTask] value failed: interval empty"}]
    at app.metatron.discovery.domain.engine.AbstractEngineRepository.call(AbstractEngineRepository.java:126)
    at app.metatron.discovery.domain.engine.AbstractEngineRepository.call(AbstractEngineRepository.java:111)
    at app.metatron.discovery.domain.engine.DruidEngineRepository.ingestion(DruidEngineRepository.java:71)
    at app.metatron.discovery.domain.engine.DruidEngineRepository$$FastClassBySpringCGLIB$$7c06ef0f.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:738)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
    at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85)
    at app.metatron.discovery.domain.engine.QueryServiceAspect.engineQueryProcessing(QueryServiceAspect.java:119)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:629)
    at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:618)
    at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673)
    at app.metatron.discovery.domain.engine.DruidEngineRepository$$EnhancerBySpringCGLIB$$cddeed75.ingestion(<generated>)
    at app.metatron.discovery.domain.datasource.ingestion.job.AbstractIngestionJob.doIngestion(AbstractIngestionJob.java:173)
    at app.metatron.discovery.domain.datasource.ingestion.job.JdbcIngestionJob.process(JdbcIngestionJob.java:160)
    at app.metatron.discovery.domain.datasource.ingestion.job.IngestionJobRunner.ingestion(IngestionJobRunner.java:182)
    at app.metatron.discovery.domain.datasource.DataSourceEventHandler.lambda$checkCreateAuthority$0(DataSourceEventHandler.java:230)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: app.metatron.discovery.domain.datasource.data.QueryTimeExcetpion: [{"error":"Instantiation of [simple type, class io.druid.indexing.common.task.IndexTask] value failed: interval empty"}]
    at app.metatron.discovery.domain.engine.DruidEngineRepository$QueryResponseErrorHandler.handleError(DruidEngineRepository.java:115)
    at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:707)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:660)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:620)
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:538)
    at app.metatron.discovery.domain.engine.AbstractEngineRepository.call(AbstractEngineRepository.java:120)
    ... 29 common frames omitted

@deidera08 @brandon-wonjune μ•„λž˜μ™€ 같이 millis νƒ€μž…μΈ 경우 timezone μ˜λ―Έκ°€ μ—†μ–΄ 섀정을 μ œκ±°ν•˜λŠ”κ²ƒμ€ μ–΄λ– μ‹€λŸ°μ§€μš”? 확인 λΆ€νƒλ“œλ¦½λ‹ˆλ‹€.
image

@kyungtaak @AnnieHwang @brandon-wonjune
κ°€μ΄λ“œμ£Όμ‹ λŒ€λ‘œ Unix time일 경우 timezone 섀정이 λ¬΄μ˜λ―Έν•˜λ―€λ‘œ μ„€μ • 자체λ₯Ό λ…ΈμΆœμ•ˆμ‹œν‚€λŠ”κ²Œ 쒋을듯 ν•©λ‹ˆλ‹€.
(밀리세컨, μ„Έμ»¨λ“œ λͺ¨λ‘ ν•΄λ‹Ήν•  λ“― ν•©λ‹ˆλ‹€.)

@brandon-wonjune
Unix time을 체크할 경우 timezone 섀정이 λ…ΈμΆœλ˜μ§€ μ•Šλ„λ‘ λΆ€νƒλ“œλ €μš”
λ”λΆˆμ–΄ Data grid ν™”λ©΄μ—μ„œ νƒ€μž„μ‘΄ 정보가 λ…ΈμΆœλ˜λŠ” 뢀뢄에 Unix time으둜 ν‘œκΈ°ν•΄μ£Όμ‹œλ©΄ 될 λ“― ν•©λ‹ˆλ‹€.
2019-01-29 2 36 33
2019-01-29 2 37 33
2019-01-29 2 37 20

@kyungtaak @deidera08
unix type의 경우 timezone 을 μ œκ±°ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
적용된 화면은 μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

  • μƒμ„±μ‹œ
    2019-01-29 3 08 47
    2019-01-29 3 08 49

  • κ·Έλ¦¬λ“œ ν™”λ©΄
    2019-01-29 3 02 26

  • 컬럼 상세
    2019-01-29 3 02 29
    2019-01-29 3 02 31

@kyungtaak
λ°μ΄ν„°μ†ŒμŠ€ μƒμ„±μ‹œ fieldκ°€ unix_time으둜 μ§€μ •λ˜μ–΄μžˆλŠ” 경우
기쑴에 μ „λ‹¬λ˜λ˜ timeZoneκ³Ό locale propertyλ₯Ό μ œκ±°ν•˜λ„λ‘ μˆ˜μ •ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

@deidera08 κ·Έλ¦¬λ“œ ν™”λ©΄μ—μ„œ λ„ˆλ¬΄ λ§Žμ€ νƒ€μž„μ‘΄ 정보가 λ…ΈμΆœλ˜λŠ”κ²Œ μ•„λ‹Œκ°€ μƒκ°λ©λ‹ˆλ‹€.
+9:00 λ˜λŠ” Asia/Seoul λ˜λŠ” +9:00 Seoul μ΄λŸ°μ‹œκΈλ‘œ μΆ•μ•½ν•˜λ©΄ μ–΄λ–¨λŸ°μ§€μš”? κ²€ν† λΆ€νƒλ“œλ¦½λ‹ˆλ‹€.
ν˜„μž¬ 개발 된 화면은 μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.
image

@kyungtaak @AnnieHwang

+9:00 λ˜λŠ” Asia/Seoul λ˜λŠ” +9:00 Seoul μ΄λŸ°μ‹œκΈλ‘œ μΆ•μ•½ν•˜λ©΄ μ–΄λ–¨λŸ°μ§€μš”?

'+9:00 Asia/Seoul'와 같이 λ…ΈμΆœλ˜κ²Œ 된 μ΄μœ λŠ” Seoulκ³Ό 같은 λ„μ‹œκ°’μ΄ μ „λΆ€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ°, κ·Έλ ‡λ‹€λ©΄ λ…ΈμΆœλ˜μ–΄μ•Ό ν•˜λŠ” 값은 Asia와 같은 λŒ€λ₯™κ°’μž…λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λŒ€λ₯™κ°’ 속에 μ‹œμ°¨ 폭이 λ„ˆλ¬΄ μ»€μ„œ 두 κ°’ λͺ¨λ‘ λ…ΈμΆœν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
(λΆ€λ“μ΄ν•˜κ²Œ λ„μ‹œκ°’μ΄ 없을 경우만 λŒ€λ₯™κ°’λ§Œ λ…ΈμΆœ)

λ•Œλ¬Έμ— κ·Έλ¦¬λ“œν™”λ©΄μ—μ„œ ꡳ이 1개 μ •λ³΄λ§Œ 남긴닀면 +09:00와 같은 μ‹œκ°„κ°’μ΄μ—¬μ•Ό ν•  λ“― ν•©λ‹ˆλ‹€.
κ·ΈλŸ¬λ‚˜ 일반 μœ μ €κ°€ 00:00 숫자λ₯Ό λ΄€μ„λ•Œ 이것이 νƒ€μž„μ‘΄ 정보인지 잘 λͺ¨λ₯Όκ²ƒ κ°™μ•„ 라벨과 ν•¨κ»˜ ν‘œκΈ°ν•΄μ•Ό ν•  λ“― ν•©λ‹ˆλ‹€.

@brandon-wonjune
데이터 κ·Έλ¦¬λ“œ ν™”λ©΄μ—μ„œλ§Œ νƒ€μž„μ‘΄ λ…ΈμΆœ 정보λ₯Ό 'UTC + μ‹œκ°„κ°’'으둜 μˆ˜μ • λΆ€νƒλ“œλ¦½λ‹ˆλ‹€.
μ˜ˆμ‹œ: UTC +09:00

@kyungtaak
timezone κ΄€λ ¨ UI 둜직 제거λ₯Ό μœ„ν•΄ ν…ŒμŠ€νŠΈ ν•˜λŠ” κ³Όμ •μ—μ„œ API 였λ₯˜κ°€ λ°œμƒν•˜μ—¬ 확인 μš”μ²­λ“œλ¦½λ‹ˆλ‹€.
API : /api/dashboards/{dashboardId}?projection=forDetailView

Api 호좜 κ²°κ³Ό ( responseCode λŠ” 200 μ΄λ‚˜, json κ²°κ³Όκ°€ μ •μƒμ μœΌλ‘œ λ‚΄λ €μ˜€μ§€ μ•ŠμŒ )
2019-01-29 5 20 32
2019-01-29 5 21 34

μ„œλ²„ 둜그

java.lang.StackOverflowError: null
    at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:449)
    at java.lang.StringBuilder.append(StringBuilder.java:136)
    at java.lang.StringBuilder.<init>(StringBuilder.java:113)
    at com.fasterxml.jackson.core.json.ReaderBasedJsonParser._reportInvalidToken(ReaderBasedJsonParser.java:2817)
    at com.fasterxml.jackson.core.json.ReaderBasedJsonParser._handleOddValue(ReaderBasedJsonParser.java:1903)
    at com.fasterxml.jackson.core.json.ReaderBasedJsonParser.nextToken(ReaderBasedJsonParser.java:749)
    at com.fasterxml.jackson.databind.ObjectMapper._initForReading(ObjectMapper.java:3850)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3799)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2858)
    at app.metatron.discovery.common.GlobalObjectMapper.readValue(GlobalObjectMapper.java:133)
    at app.metatron.discovery.domain.datasource.Field.getFormatObject(Field.java:615)
    at app.metatron.discovery.domain.datasource.Field.getTimeFormat(Field.java:427)
    at app.metatron.discovery.domain.datasource.Field.getFormatObject(Field.java:617)
    at app.metatron.discovery.domain.datasource.Field.getTimeFormat(Field.java:427)
    at app.metatron.discovery.domain.datasource.Field.getFormatObject(Field.java:617)
    at app.metatron.discovery.domain.datasource.Field.getTimeFormat(Field.java:427)
    at app.metatron.discovery.domain.datasource.Field.getFormatObject(Field.java:617)
    at app.metatron.discovery.domain.datasource.Field.getTimeFormat(Field.java:427)
    at app.metatron.discovery.domain.datasource.Field.getFormatObject(Field.java:617)
    at app.metatron.discovery.domain.datasource.Field.getTimeFormat(Field.java:427)
    at app.metatron.discovery.domain.datasource.Field.getFormatObject(Field.java:617)
    at app.metatron.discovery.domain.datasource.Field.getTimeFormat(Field.java:427)
    at app.metatron.discovery.domain.datasource.Field.getFormatObject(Field.java:617)
    at app.metatron.discovery.domain.datasource.Field.getTimeFormat(Field.java:427)
    at app.metatron.discovery.domain.datasource.Field.getFormatObject(Field.java:617)
    at app.metatron.discovery.domain.datasource.Field.getTimeFormat(Field.java:427)
    at app.metatron.discovery.domain.datasource.Field.getFormatObject(Field.java:617)
    at app.metatron.discovery.domain.datasource.Field.getTimeFormat(Field.java:427)
    at app.metatron.discovery.domain.datasource.Field.getFormatObject(Field.java:617)
    at app.metatron.discovery.domain.datasource.Field.getTimeFormat(Field.java:427)
    at app.metatron.discovery.domain.datasource.Field.getFormatObject(Field.java:617)
    at app.metatron.discovery.domain.datasource.Field.getTimeFormat(Field.java:427)
    at app.metatron.discovery.domain.datasource.Field.getFormatObject(Field.java:617)
    at app.metatron.discovery.domain.datasource.Field.getTimeFormat(Field.java:427)
    at app.metatron.discovery.domain.datasource.Field.getFormatObject(Field.java:617)
    at app.metatron.discovery.domain.datasource.Field.getTimeFormat(Field.java:427)
    at app.metatron.discovery.domain.datasource.Field.getFormatObject(Field.java:617)
    at app.metatron.discovery.domain.datasource.Field.getTimeFormat(Field.java:427)

@deidera08 @kyungtaak μˆ˜μ •ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
2019-01-29 5 29 53

timezone κ΄€λ ¨ UI 둜직 제거λ₯Ό μœ„ν•΄ ν…ŒμŠ€νŠΈ ν•˜λŠ” κ³Όμ •μ—μ„œ API 였λ₯˜κ°€ λ°œμƒν•˜μ—¬ 확인 μš”μ²­λ“œλ¦½λ‹ˆλ‹€.

@eltriny κΈ΄κΈ‰ν•˜κ²Œ Field 617 라인에 μ•„λž˜μ™€ 같이 μˆ˜μ •ν›„ 확인 λΆ€νƒλ“œλ¦½λ‹ˆλ‹€.

fieldFormat = new CustomDateTimeFormat(format);

@brandon-wonjune @eltriny μœ„ λ‘κ±΄μ˜ 였λ₯˜λ₯Ό ν•΄κ²°ν•˜μ—¬ μ˜¬λ €λ‘μ—ˆμŠ΅λ‹ˆλ‹€. 확인 λΆ€νƒλ“œλ¦½λ‹ˆλ‹€.

@deidera08 κ·Έλ¦¬λ“œμ—μ„œ timezone ν‘œμ‹œκ°€ λ­”κ°€ μ–΄μƒ‰ν•˜λŠ”λ°μš”. ν˜Ήμ‹œ timezone ν‘œμ‹œ κΈ€μžλ₯Ό 쑰금 μ€„μ΄λŠ” λ°©λ²•μ΄λ‚˜.. λ‹€λ₯Έ 방법이 μ—†μ„κΉŒμš”...?

@kyungtaak current_time으둜 ingestion이 μ •μƒμ μœΌλ‘œ λ˜λŠ”κ²ƒ ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€.

@kyungtaak @AnnieHwang

@deidera08 κ·Έλ¦¬λ“œμ—μ„œ timezone ν‘œμ‹œκ°€ λ­”κ°€ μ–΄μƒ‰ν•˜λŠ”λ°μš”. ν˜Ήμ‹œ timezone ν‘œμ‹œ κΈ€μžλ₯Ό 쑰금 μ€„μ΄λŠ” λ°©λ²•μ΄λ‚˜.. λ‹€λ₯Έ 방법이 μ—†μ„κΉŒμš”...?

더 쀄인닀면 λ‹€μŒκ³Ό 같이 ν‘œκΈ°ν•˜λ©΄ μ–΄λ–¨κΉŒ ν•©λ‹ˆλ‹€.
μ˜ˆμ‹œκ°’: UTC+9, UTC-11, UTC+9:30

그리고 폰트 μ‚¬μ΄μ¦ˆλ₯Ό ν•œμ‚¬μ΄μ¦ˆ 더 μž‘κ²Œ ν‘œν˜„ν•˜λ©΄ μ–΄λ–¨κΉŒ μ‹Άλ„€μš”
폰트 μ‚¬μ΄μ¦ˆλŠ” @koeun222 께 μš”μ²­λ“œλ¦¬λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

넀에 νƒ€μž„μ‘΄ text size 11pt둜 퍼블 적용 λΆ€νƒλ“œλ €μš”-

@kyungtaak
μœ„μ— λ¬Έμ˜λ“œλ Έλ˜ λŒ€μ‹œλ³΄λ“œ 정보 μ‘°νšŒν•˜λŠ” API μ—μ„œ μΆ”κ°€μ μœΌλ‘œ 였λ₯˜κ°€ λ°œμƒν•˜μ—¬ λ¬Έμ˜λ“œλ¦½λ‹ˆλ‹€.
API : /api/dashboards/{dashboardId}?projection=forDetailView

API κ²°κ³Ό
2019-01-29 6 31 42

ν•„λ“œμ˜ foramt 값이 μœ„ 이미지와 같이 λ‚΄λ €μ™€μ„œ json parsing이 λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

@kyungtaak @deidera08

더 쀄인닀면 λ‹€μŒκ³Ό 같이 ν‘œκΈ°ν•˜λ©΄ μ–΄λ–¨κΉŒ ν•©λ‹ˆλ‹€.
μ˜ˆμ‹œκ°’: UTC+9, UTC-11, UTC+9:30

μˆ˜μ •ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

@eltriny μ£„μ†‘ν•©λ‹ˆλ‹€. μ œκ°€ 닡변이 λŠ¦μ—ˆλ„€μš”. μœ„ 였λ₯˜λŠ” μˆ˜μ •ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

Was this page helpful?
0 / 5 - 0 ratings